2012-12-22 4 views
10

In Android 4.1 können Sie Echtzeit-Sprach-zu-Text-Konvertierung mit der Mikrofonoption auf keyboard erhalten.Wie verwenden Sie Android Echtzeit-Sprache zu Text?

Ich habe in der Dokumentation für android.speech versucht, um herauszufinden, wie Echtzeit-Sprache in Text für eine Anwendung zu implementieren. Die einzige Option, die dies erleichtern würde, ist die Option "EXTRA_PARTIAL_RESULTS" (die der Server bei jeder Verwendung ignoriert).

Der Code:

Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
     RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, "VoiceIME"); 
intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true); 
intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 3000L); 

mSpeaker.startListening(intent); 

kehrt niemals Teilergebnisse.

Ich weiß, dass dies möglich ist, da die Tastaturversion es konsequent macht. Wer weiß wie?

Antwort

4

Bevor Sie startListening anrufen, müssen Sie die onPartialResults -Callback registrieren. Zwei wichtige Dinge zu beachten:

  • die Struktur des Bündels, mit dem onPartialResults aufgerufen wird, ist nicht von der Android-API angegeben;
  • nicht jeder Spracherkenner unterstützt diesen Rückruf.

Ihr Code ist also spezifisch für Google Voice Search.

mSpeaker.setRecognitionListener(new RecognitionListener() { 
    ... 
    public void onPartialResults(Bundle partialResults) { 
    // WARNING: The following is specific to Google Voice Search 
    String[] results = 
     partialResults.getStringArray("com.google.android.voicesearch.UNSUPPORTED_PARTIAL_RESULTS"); 
    updateTheUi(results); 
    } 
    ... 
} 

Um diesen Rückruf in Aktion in einer Open-Source-app zu sehen, siehe Babble:

0

wenn Sie wollen Echt Zeit Teilergebnisse zu zeigen, während das Mikrofon eingeschaltet ist, während der Sprecher spricht, möchten Sie möglicherweise Ansatz mit RecognizerIntent Drop-und Erkennungsservice fallen zugunsten von Eine einfache Android-Textbox kombiniert mit der vorherigen Auswahl des "mic" -Symbols, wie Sie es in der android "Notizen" Beispiel-App tun können ...

siehe ./samples/android-16/NotePad/tests/src/com/beispiel/android/notizblock

Diese Kombination bietet die Funktion, wie Sie in Echtzeit die partiellen Text-von-Sprache-Ergebnisse sehen, wenn sie von der serverseitigen 'voiceSearch' zurückkommen, die sich irgendwie von 'recognizer' unterscheidet der 'teilweise' Rückruf.

Zahlreiche Kommentare geben an, dass recognizerIntent keinen Rückruf an 'onPartialResults' auslöst. Aus irgendeinem Grund scheint Android 4.2 nicht den "kontinuierlichen" Spracherkennungsmodus zu unterstützen, der mit JavaScript funktioniert. Meine Tests der Schnittstelle 'RecognitionListener' auf 4.2 zeigen Hunderte von Callbacks zu 'onRmsChanged' bei Volume-Ereignissen, aber keine Aktivität beim 'partialResult' -Ereignis. Irgendwo wird dieser Rückruf verloren ??

für js Lösung, Chrom-Beta-Version 25 installieren und here

mit Android Notizen app gehen. sample und pre-selecting das mic-symbol von der tastatur, können sie genau das gleiche tun wie die JS webapp link oben.

+0

was meinst du ‚Vorauswahl‘ auf das Mikrofonsymbol? Gibt es eine Möglichkeit, dies programmatisch zu tun? – Patrick

+0

können Sie versuchen, den tatsächlichen Schlüssel in den IME-Schnittstellen zu finden und eine "berührte" auf der Taste, die mit dem Mikrofon überlagert ist, auslösen. Ich habe diesen Ansatz nicht verwendet, weil es so viel einfacher war, die Tastatur anzuzeigen und darauf zu warten, dass der Benutzer die Mikrofontaste berührt. könnte auch tun: getSpeechRecognizer(). StartListening (SpeechRecognizer.createSpeechRecognizer (this)); –

+0

Sieht nicht möglich ohne einige schwerwiegende Hacker ... IME-Schnittstelle ist nur für das System verfügbar, so dass ich denke nicht möglich, Instanz des IME aus der App zu bekommen. Ich benutze readRec, einfach nicht möglich, erweiterte Voice-to-Text mit ihm wie mit der Tastatur zu tun. – Patrick

0

Da wir nicht sicher die wichtigsten Namen des Bundle kommen aus Teilergebnissen Rückruf wissen können, verwenden Sie diese seinen Inhalt zu erfahren:

public void onPartialResults(Bundle partialResults) {  
    String string = "Bundle{"; 
    for (String key : partialResults.keySet()) { 
     string += " " + key + " => " + partialResults.get(key) + ";"; 
    } 
    Log.e("joshtag","onPartialResults"+string); 
    //see the keynames in Logcat and extract partial reesults here 
} 
Verwandte Themen