¿Cómo saber cuándo termina el TTS?

Estoy implementando una aplicación de respuesta de voz interactiva en Android. Me gustaría saber cómo determinar cuándo ha funcionado la función tts.speak() para poder llamar a mi función de reconocimiento de voz.

 public class TTSActivity extends Activity implements OnInitListener, OnUtteranceCompletedListener, ... { private TextToSpeech mTts; ........... private void speak(String text) { if(text != null) { HashMap myHashAlarm = new HashMap(); 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's callback public void onUtteranceCompleted(String utteranceId) { Log.i(TAG, utteranceId); //utteranceId == "SOME MESSAGE" } ........... } 

Lea un buen tutorial

El setOnUtteranceCompletedListener está en desuso desde API nivel 15. En su lugar, use setOnUtteranceProgressListener .

Encontré un fragmento de código ( aquí ) que me facilitó saber cuándo se terminó el texto a voz:

 @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!"); } } 

http://www.codota.com/android/scenarios/52fcbd34da0ae25e0f855408/android.speech.tts.TextToSpeech?tag=dragonfly

Me di cuenta de que hay personas que tienen problemas en el uso de TextToSpeech para preguntarle cuál es la solución

¿Cómo saber cuándo termina el TTS? sin uso 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); } 

Pruebe este siguiente código que muestra un brindis después de que TTS haya terminado. Reemplace la tostada con su propia acción.

 public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener{ private boolean initialized; private String queuedText; private String TAG = "TTS"; private TextToSpeech tts; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tts = new TextToSpeech(this /* context */, this /* listener */); tts.setOnUtteranceProgressListener(mProgressListener); speak("hello world"); } public void speak(String text) { if (!initialized) { queuedText = text; return; } queuedText = null; setTtsListener(); // no longer creates a new UtteranceProgressListener each time HashMap map = new HashMap(); map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "MessageId"); tts.speak(text, TextToSpeech.QUEUE_ADD, map); } private void setTtsListener() { } @Override public void onInit(int status) { if (status == TextToSpeech.SUCCESS) { initialized = true; tts.setLanguage(Locale.ENGLISH); if (queuedText != null) { speak(queuedText); } } } private abstract class runnable implements Runnable { } private UtteranceProgressListener mProgressListener = new UtteranceProgressListener() { @Override public void onStart(String utteranceId) { } // Do nothing @Override public void onError(String utteranceId) { } // Do nothing. @Override public void onDone(String utteranceId) { new Thread() { public void run() { MainActivity.this.runOnUiThread(new runnable() { public void run() { Toast.makeText(getBaseContext(), "TTS Completed", Toast.LENGTH_SHORT).show(); } }); } }.start(); } }; } 

usa un SpeakableListener cuando hagas un texto para hablar.

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