Spracherkennungslibary die ständig zuhört

O

Oli95

Neues Mitglied
Threadstarter
Hallo,

ich suche nach einer Spracherkennungslibary die im Hintergrund immer zuhört. Die Libary sollte keinen Ton von sich geben (wie zb. bei Google) sondern einfach immer zuhören und regelmäßig Ergebnisse liefern.
Ich habe auch Pocketsphinx ausprobiert, aber das scheint nur auf einen Triggerstring zu hören. Ich benötige was ganz simples das mir einfach nur den verstandenen String liefert.
Am allerbesten sollte das auch offline die Sprache erkennen.

Liebe Grüße
 
swa00

swa00

Moderator
Teammitglied
Hallo,

siehe hier :
PocketSphinx on Android

Allerdings gute NDK Kenntnisse erforderlich.- Habe Diese selbst im Einsatz
Modelle musst du dir dann selbst erstellen (sampeln)

Alternativ kannst du auch die von Google API nehmen , diese ist auch so zu verwenden , dass
sie nur ASCII Ergebnisse zurück gibt.

P.S. "Ständig zuhören" : Du muss Foreground Tasks zulassen, sonst wird diese eliminert.
(Z.b. Whatsapp Spracheingabe) - Grund : Doppelbelegung des AudioIn Chip
 
O

Oli95

Neues Mitglied
Threadstarter
Hi,

danke für die schnelle Antwort.
Das mit den ASCII Ergebnise von der Google API klingt interessant. Hättest du dafür ein Beispiel?

Liebe Grüße
 
O

Oli95

Neues Mitglied
Threadstarter
Das ist blöd ich benötige einfach etwas das ich vom Code aus starte und das mir dann halt Ergebnisse als String liefert. Das immer wieder neu starten kann ich dann ja so einbauen.
 
swa00

swa00

Moderator
Teammitglied
Das ist eine Wunschvorstellung, dies Systemweit zu realisieren, denn "Ok Google" sitzt im Kernel.
Das ist weder eine App, noch ein Service.

Innerhalb einer App/Service kannst du nur mit Pockephinx arbeiten und den Commando-Trigger laufen lassen,
sobald die App im Foreground ist.

Grund : Es wird die Audio-Eingabe blockiert - das heisst , keine andere App kann mehr drauf zugreifen, auch nicht das Telefon.
 
O

Oli95

Neues Mitglied
Threadstarter
Ah ok dann kann ich mein Vorhaben leider nicht umsetzen.
Mein Idee wäre es gewesen, dass man den Sprachassistenten nicht mit einem Wort triggern muss und dann warten bis der sich initialisiert hat sondern das man direkt das Triggerwort und den Befehl zusammen sagt. Dafür müsste man halt immer zuhören.
 
swa00

swa00

Moderator
Teammitglied
Nein , das würde auch selbst mit dem Assistenten nicht funktionieren , da die Phrase aufgenommen wird und dann über den grossen Teich als GSM komprimierte Audio-Datei geschickt. Nach der AUswertung bekommst du dann den ASCII

Wo soll also die Audiodatei anfangen resp aufhören ?

Pockesphinxs hat auch nur ca 8000 Wörter, niemals ganze Phrasen oder zusammenhängende Bedeutung.

Das was du suchst ist eine neuronale Speechengine - da ist aber jedes Smartphone der Welt zu klein :)
 
O

Oli95

Neues Mitglied
Threadstarter
Ja gut dann muss ich mein Vorhaben wohl aufgeben.

Vielen Dank für die schnelle und umfangreiche Hilfe.
 
O

Oli95

Neues Mitglied
Threadstarter
Hallo,

ich hab nochmal eine Frage.
Ich habe es jetzt geschafft meine App als Default Assistant auswählbar zu machen.
Wenn ich lang auf die Hometaste klicke dann wird er auch gestartet. Nur wenn ich "Ok Google" sage dann wird was aufgerufen das dann aber gleich abstürzt.
Dann hab ich noch rausgefunden das man Klassen brauch die von VoiceInteractionSessionService und von VoiceInteractionSession erben.

Das kapiere ich aber noch nicht so ganz. Weisst du villeicht wie man das macht?

Liebe Grüße
 
O

Oli95

Neues Mitglied
Threadstarter
Also man benötigt ja erstmal eine Klasse die von VoiceInteractionSession erbt.

Code:
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class InteractionSession extends VoiceInteractionSession {

    public InteractionSession(Context context) {
        super(context);
    }

}
Dann noch einen Service der von VoiceInteractionSessionService erbt.
Code:
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class SessionService extends VoiceInteractionSessionService {

    @Override
    public VoiceInteractionSession onNewSession(Bundle bundle) {
        return new InteractionSession(this);
    }

}
Das hab ich hier her:
Set app as default Assist Intent

Nur versteh ich nicht so ganz was die Klassen machen sollen.
 
O

Oli95

Neues Mitglied
Threadstarter
Sorry ich dachte das wäre ein anderes Thema.

Natürlich kenne ich die Vererbung und das Beispiel hab ich mir angeschaut. Ich konnte nur nicht rausfinden wie ich da dann meine MainActivity starten kann wenn der Trigger durch das Hotword ausgelöst worden ist.
 
O

Oli95

Neues Mitglied
Threadstarter
Ok also ich hab mir das Projekt jetzt nochmal genauer angeschaut und es funktioniert.
Ich hab jetzt nurnoch ein Problem.
Wenn ich in den Einstellungen den Default Assistant auswähle und dann der VoiceInteractionService aufgerufen wird, dann wird ein neuer Keyphrase gesetzt.
Der Callback liefert aber dann ein STATE_HARDWARE_UNAVAILABLE zurück.

Ich versteh aber nicht warum.
Die Permission android.permission.BIND_VOICE_INTERACTION hat der Service, als daran kann es schonmal nicht liegen.

Ich hoffe da kann mir jemand helfen.
 
J

jogimuc

Erfahrenes Mitglied
Hallo hast du die Permission auch zur Laufzeit vom User erfragt? BIND_VOICE_INTERACTION ist seit API 23 eine Dangerous Permissions. Und muss auch zur Laufzeit erfragt werden im Manifest reicht es nicht mehr.

Permissions overview | Android Developers
 
O

Oli95

Neues Mitglied
Threadstarter
Oh vielen Dank für den Hinweis das hab ich nicht gemacht.
An welcher Stelle genau sollte man das abfragen?
Ich habs jetzt mal in die Launcheractivity reingemacht.
Code:
ContextCompat.checkSelfPermission(this, Manifest.permission.BIND_VOICE_INTERACTION) == PackageManager.PERMISSION_GRANTED;
Das liefert zwar false zurück wenn ich dann aber die Permission abfragen will passiert nix.
Also damit:
Code:
ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.BIND_VOICE_INTERACTION }, 0);
Muss man das also irgendwo anders abfragen?
 
J

jogimuc

Erfahrenes Mitglied
Hallo die eine Zeile die du hinzugefügt hast reicht nicht aus.
Und wenn false zurückkommt hast du die permission nicht musst sie halt auch vom User erfragen, und auf seine Antwort reagieren. Das steht alles in dem link du brauchst den kompletten Code.
Lese den link komplett und mache es auch so wenn du kein englisch kanst übersetze ihn .

Schaue dir diese Thread an da geht es im Endeffekt um das gleiche Thema


Write to external Storage
 
O

Oli95

Neues Mitglied
Threadstarter
Ich habs natürlich nicht nur mit den zwei Zeilen gemacht.
Sondern so:
Code:
private boolean isPermissionsGranted() {
        return ContextCompat.checkSelfPermission(this, Manifest.permission.BIND_VOICE_INTERACTION) == PackageManager.PERMISSION_GRANTED;
    }

    /**
     * Bestätigung der benötigten Rechte wird eingeholt.
     */
    private void requestPermissions() {
        ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.BIND_VOICE_INTERACTION }, 0);
    }
In der onChreate dann das:
Code:
if (!isPermissionsGranted()) {
            requestPermissions();
        }
Ich hab auch mal das Beispiel aus dem Link von dir mit WRITE_EXTERNAL_STORAGE und mit BIND_VOICE_INTERACTION gemacht, es wurde dann beim Ausführen aber nur nach WRITE_EXTERNAL_STORAGE abgefragt.
 
swa00

swa00

Moderator
Teammitglied
@Oli95

Hallo Oli,

ich habe mich ja bis jetzt herausgehalten ...

Aber ehrlich gesagt , geht aus deinem Gesamten nicht hervor , was du eigentlich machen möchtest. :)
Man kann nur rätseln und anscheinend benutzt du jetzt die Standard Assist API .
(Diese Info fehlt uns gänzlich)

Wenn ja : Geht sie denn im Default Modus, oder hast du ein Problem ,weil du etwas "verbiegen" möchtest ?
Deine Vorgehensweise ist nicht erkennbar und hat auch irgendwie keine Linie.

So Zeilen wie ".. ist im Service drin ..." hilft Keinem ,der dir helfen will.
Wir sind Entwickler und unsere Kristallkugel hat nur eine beschrankte Durchsetzkraft.

Oder : " aufgerufen das dann aber gleich abstürzt" ...
Wir , wie auch Du können ohne ErrorLog-Debugging nicht entwickeln - also
musst du uns Diesen auch zur Verfügung stellen , wenn du ordentliche Hilfe haben möchtest.

Tipp : Baue erst mal das hier nach und stelle damit sicher , dass alles läuft .
(Device, Gradle, Manifest , Permissions, Services etc etc)
Optimizing Contextual Content for the Assistant | Android Developers

Erst dann gehst du an deine gewünschte Änderung heran.
 
Zuletzt bearbeitet:
Oben Unten