2012-12-22 12 views
10

W Androidzie 4.1 można uzyskać konwersję mowy w czasie rzeczywistym na tekst za pomocą opcji mikrofonu na keyboard.W jaki sposób korzystasz z mowy Androida na tekst w czasie rzeczywistym?

Przeglądałem dokumentację dla android.speech próbując dowiedzieć się, jak zaimplementować mowę w czasie rzeczywistym do tekstu dla aplikacji. Jednak jedyną opcją, która to ułatwi, jest opcja "EXTRA_PARTIAL_RESULTS" (którą serwer ignoruje za każdym razem, gdy próbuję jej użyć).

Kod:

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); 

nigdy nie powraca częściowych wyników.

Wiem, że jest to możliwe, ponieważ klawiatura działa konsekwentnie. Ktoś wie jak?

Odpowiedz

4

Zanim zadzwonisz pod numer startListening, musisz zarejestrować się na stronie internetowej z kamerą w wersji onPartialResults. Dwie ważne rzeczy do zapamiętania:

  • struktura pakietu, z którym jest wywoływana onPartialResults, nie jest określona przez interfejs API systemu Android;
  • nie każdy system rozpoznawania mowy obsługuje to oddzwanianie.

Twój kod będzie się odnosił do 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); 
    } 
    ... 
} 

Aby zobaczyć ten zwrotnego w akcji w aplikacji open source, patrz Babble:

0

jeśli chcesz real- czas częściowe wyniki pokazać się, gdy mikrofon jest włączony, podczas gdy mówiący mówi, możesz chcieć rzucić podejście za pomocą recogerIntent i upuść usługiService na rzecz proste pole tekstowe na Androida połączone z wcześniejszym wyborem ikony "mic", tak jak można to zrobić w przykładowej aplikacji androidowej "notatki" ...

patrz ./samples/android-16/NotePad/tests/src/com/example/android/notepad

To combo udostępnia funkcję, która pozwala zobaczyć w czasie rzeczywistym częściowe wyniki text-to-speech, gdy wracają po stronie "voiceSearch" po stronie serwera, która różni się od "rozpoznawania" w odniesieniu do "częściowe" oddzwanianie.

Liczne komentarze mówią, że funkcja RozpoznawanieIntent nie wywołuje oddzwaniania do "onPartialResults". Z jakiegoś powodu Android 4.2 nie obsługuje "ciągłego" trybu rozpoznawania mowy, który działa dobrze przy użyciu javascript. Moje testy interfejsu "RecognitionListener" w wersji 4.2 pokazują setki wywołań zwrotnych dla "onRmsChanged" w przypadku zdarzeń związanych z woluminami, ale z zerową aktywnością w przypadku zdarzenia "partialResult". Gdzieś, to callback jest zagubiony?

do sporządzania roztworu js zainstalować chrom-Beta 25 i iść here

użyciu android notatki aplikację. próbka i wstępny wybór ikony mikrofonu z klawiatury, możesz zrobić dokładnie to samo, co link webowy JS powyżej.

+0

co masz na myśli „preselekcji” ikonę mikrofonu? czy istnieje sposób, aby to zrobić programowo? – Patrick

+0

możesz spróbować znaleźć właściwy klucz w interfejsach IME i wystukać "dotknięcie" na klawiszu, który jest przykryty mikrofonem. Nie korzystałem z tego podejścia, ponieważ o wiele łatwiej było po prostu wyświetlić klawiaturę i czekać, aż użytkownik dotknie klawisza mikrofonu. może również zrobić: getSpeechRecognizer(). StartListening (SpeechRecognizer.createSpeechRecognizer (this)); –

+0

Nie wydaje się możliwe bez poważnego hakowania ... Interfejs IME jest dostępny tylko dla systemu, więc nie sądzę, aby możliwe było pobranie wystąpienia IME z aplikacji. Używam programu speechRec, po prostu nie jest możliwe rozszerzanie głosowo-tekstowy za pomocą klawiatury. – Patrick

0

Ponieważ nie możemy wiedzieć na pewno najważniejsze nazwiska Bundle pochodzących z wyników częściowego zwrotnego, to wykorzystać, aby dowiedzieć się jego zawartość:

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 
} 
Powiązane problemy