Я хочу начать распознавание речи, как только преобразование текста в речь прекратится. Ниже приведены шаги, которые я предпринял.
Шаг 1. Инициализируйте распознавание речи.
mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
mSpeechRecognizer.setRecognitionListener(recognitionListener);
mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE,
Locale.getDefault());
Шаг 2: Инициализируйте преобразование текста в речь.
TextToSpeech myTTS = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if (myTTS.getEngines().size() == 0){
Toast.makeText(Robo.this,"No Engines Installed",Toast.LENGTH_LONG).show();
}else{
if (status == TextToSpeech.SUCCESS){
//Toast.makeText(MainActivity.this,"Status working.",Toast.LENGTH_LONG).show();
//message = "How may i help you.";
myTTS.setLanguage(Locale.US);
ttsInitialized();
speak("what is your name.");
}
}
}
});
Шаг 3. Инициализируйте прослушиватель высказываний, чтобы проверить, завершена ли речь.
myTTS.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onStart(String utteranceId) {
}
@Override
public void onDone(String utteranceId) {
//btn.performClick();
myTTS.shutdown();
mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
}
@Override
public void onError(String utteranceId) {
}
});
В методе onDone () mSpeechRecognizer.startListening (mSpeechRecognizerIntent); используется для запуска распознавания речи, но не запускает распознавание речи. Пожалуйста, разберитесь в проблеме.
Метод onDone относится к определенному высказыванию. Это означает, что если вы выполняете несколько (непрерывных) вызовов метода mTTS.speak, onDone вызывается каждый раз. Что, очевидно, может вызвать серьезные проблемы с тем, чего вы пытаетесь достичь.
Когда мне приходилось выполнять действия после завершения TTS, я создавал переменную, например lastUtteranceId, устанавливал ее на последнее высказывание в очереди и проверял соответствие внутри onDone, например:
if (utteranceId.equals(lastUtteranceId) {
// TTS finished talking...
}
Кроме того, вызов выключения кажется плохой идеей. Вы должны вызвать его в методе onDestroy своей активности.
И последнее, я думаю, что onDone работает в фоновом потоке, а startListening должен быть в основном потоке, так что проверьте и это.
Как сказал @Regulus, я добавил обработчик, и он сработал.
@Override
public void onDone(String utteranceId) {
Handler mainHandler = new Handler(Looper.getMainLooper());
Runnable myRunnable = new Runnable() {
@Override
public void run() {
mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
} // This is your code
};
mainHandler.post(myRunnable);
}