Я использую приложение интерактивного голосового ответа на Android. Я хотел бы знать, как определить, когда была выполнена функция tts.speak()
, чтобы я мог вызвать функцию распознавания речи.
Как узнать, когда TTS завершена?
Ответ 1
public class TTSActivity extends Activity implements OnInitListener, OnUtteranceCompletedListener, ... {
private TextToSpeech mTts;
...........
private void speak(String text) {
if(text != null) {
HashMap<String, String> myHashAlarm = new HashMap<String, String>();
myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM));
myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "SOME MESSAGE");
mTts.speak(text, TextToSpeech.QUEUE_FLUSH, myHashAlarm);
}
}
// Fired after TTS initialization
public void onInit(int status) {
if(status == TextToSpeech.SUCCESS) {
mTts.setOnUtteranceCompletedListener(this);
}
}
// It callback
public void onUtteranceCompleted(String utteranceId) {
Log.i(TAG, utteranceId); //utteranceId == "SOME MESSAGE"
}
...........
}
Прочитайте Хороший учебник
Ответ 2
Функция setOnUtteranceCompletedListener устарела с уровня API 15. Вместо этого используйте setOnUtteranceProgressListener.
Я нашел фрагмент кода (здесь), который очень помог мне узнать, когда текст в речь закончен:
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
myTTS.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onDone(String utteranceId) {
// Log.d("MainActivity", "TTS finished");
}
@Override
public void onError(String utteranceId) {
}
@Override
public void onStart(String utteranceId) {
}
});
} else {
Log.e("MainActivity", "Initilization Failed!");
}
}
Ответ 3
Я заметил, что есть люди, имеющие проблемы с использованием TextToSpeech, чтобы спросить, что решение для вас
Как узнать, когда TTS завершена? без использования setOnUtteranceCompletedListener
public void isTTSSpeaking(){
final Handler h =new Handler();
Runnable r = new Runnable() {
public void run() {
if (!tts.isSpeaking()) {
onTTSSpeechFinished();
}
h.postDelayed(this, 1000);
}
};
h.postDelayed(r, 1000);
}
Ответ 4
используйте SpeakableListener, когда текст должен говорить.
private volatile boolean finished;
private SpeakableListener listener = new SpeakableListener() {
@Override
public void markerReached(SpeakableEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void speakableCancelled(SpeakableEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void speakableEnded(SpeakableEvent arg0) {
TestSpeaker.this.finished = true;
}
@Override
public void speakablePaused(SpeakableEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void speakableResumed(SpeakableEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void speakableStarted(SpeakableEvent arg0) {
TestSpeaker.this.finished = false;
}
@Override
public void topOfQueue(SpeakableEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void wordStarted(SpeakableEvent arg0) {
// TODO Auto-generated method stub
}
};
/** Speak the following string. */
public void sayIt(String str) {
System.out.print(" " + str + " ");
/* The the synthesizer to speak. */
synthesizer.speakPlainText(str, listener);