La función de devolución de llamada de Android TTS onUtteranceCompleted no se recibe

Estoy tratando de obtener el Android TTS API para leer mi "enunciación" y luego llamar a la onUtteranceCompleted () oyente sin éxito. He registrado mi objeto TTS y devuelve SUCCESS, así que no puedo averiguar por la vida de mí por qué mi llamada no se llama.

He intentado buscar ayuda, pero parece que otros también tienen dificultades con esto. ¿Estoy perdiendo algo simple?

Gracias por cualquier ayuda que pueda ofrecer.

package com.test.mytts; import java.util.HashMap; import android.app.Activity; import android.media.AudioManager; import android.os.Bundle; import android.speech.tts.TextToSpeech; import android.speech.tts.TextToSpeech.OnInitListener; import android.speech.tts.TextToSpeech.OnUtteranceCompletedListener; import android.widget.TextView; import android.widget.Toast; public class MyTTS extends Activity implements OnInitListener, OnUtteranceCompletedListener { TextView tv; private TextToSpeech _tts; @Override public void onCreate(Bundle savedInstanceState) { tv = new TextView(this); tv.setText("MyTTS: "); super.onCreate(savedInstanceState); setContentView(tv); _tts = new TextToSpeech(this, this); } @Override public void onInit(int status) { HashMap<String, String> myHashAlarm = new HashMap<String, String>(); myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_NOTIFICATION)); myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "test"); if (status == TextToSpeech.SUCCESS) { Toast.makeText(this, "Trying to speak...", Toast.LENGTH_SHORT).show(); int result = _tts.setOnUtteranceCompletedListener(this); tv.append(String.valueOf(result)); _tts.setSpeechRate((float) .5); _tts.speak("Testing one, two, three", TextToSpeech.QUEUE_ADD, myHashAlarm); } else Toast.makeText(this, "Failed to initialize TTS.", Toast.LENGTH_SHORT).show(); } @Override public void onUtteranceCompleted(String utteranceId) { Toast.makeText(this, "onUtteranceCompleted", Toast.LENGTH_SHORT).show(); } @Override public void onDestroy() { super.onDestroy(); _tts.shutdown(); } } 

Llame al setOnUtteranceCompletedListener dentro de la función onInit del objeto tts.

Si desea realizar cambios en la interfaz de usuario en la llamada de la función onUtteranceCompleted, agregue el código dentro de un método runOnUIThread.

Y recuerde agregar el valor de param de Hashmap mientras llama a la función speak ()

Ejemplo:

 TextToSpeech tts= new TextToSpeech(context, new OnInitListener() { @Override public void onInit(int status) { mTts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener() { @Override public void onUtteranceCompleted(String utteranceId) { runOnUiThread(new Runnable() { @Override public void run() { //UI changes } }); } }); } }); HashMap<String, String> params = new HashMap<String, String>(); params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,"stringId"); tts.speak("Text to Speak",TextToSpeech.QUEUE_FLUSH, params); 

Creo que a menos que especifiques un enunciado con un id, como:

 map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, utteranceid); 

No se llamará su método de emisión completa.

En este caso, el mapa es el Hashmap que pasas al motor cuando hablas.

Esto funcionará para usted en el nivel API> = 15

 import java.util.HashMap; import java.util.Locale; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.speech.tts.TextToSpeech; import android.speech.tts.TextToSpeech.OnInitListener; import android.speech.tts.UtteranceProgressListener; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity implements OnInitListener{ private static final int CHECK_TTS_DATA = 0X123; protected static final String TAG = MainActivity.class.getSimpleName(); private TextToSpeech textToSpeech; private Button buttonSayIt; private EditText editTextTts; String tts; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); buttonSayIt=(Button) findViewById(R.id.buttonSayIt); editTextTts=(EditText) findViewById(R.id.editTextTts); buttonSayIt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { tts=editTextTts.getText().toString(); Log.d(TAG, tts); speach(tts,"you_utterance_id"); } }); //check for TTs data Intent checkTtsDataIntent=new Intent(); checkTtsDataIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); startActivityForResult(checkTtsDataIntent, CHECK_TTS_DATA); } protected void speach(String tts,String utteranceId) { HashMap<String, String> params = new HashMap<String, String>(); params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,utteranceId); textToSpeech.speak(tts,TextToSpeech.QUEUE_FLUSH,params); } @Override public void onInit(int status) { if(status==TextToSpeech.SUCCESS){ if(textToSpeech.isLanguageAvailable(Locale.US)==TextToSpeech.LANG_AVAILABLE){ textToSpeech.setLanguage(Locale.US); } }else if(status==TextToSpeech.ERROR){ Toast.makeText(this, "Sorry Text To Speach faild", Toast.LENGTH_SHORT).show(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode==CHECK_TTS_DATA){ if(resultCode==TextToSpeech.Engine.CHECK_VOICE_DATA_PASS){ textToSpeech=new TextToSpeech(this, this); textToSpeech.setOnUtteranceProgressListener(utteranceProgressListener); }else{ Intent installTtsIntent=new Intent(); installTtsIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); startActivity(installTtsIntent); } } } UtteranceProgressListener utteranceProgressListener=new UtteranceProgressListener() { @Override public void onStart(String utteranceId) { Log.d(TAG, "onStart ( utteranceId :"+utteranceId+" ) "); } @Override public void onError(String utteranceId) { Log.d(TAG, "onError ( utteranceId :"+utteranceId+" ) "); } @Override public void onDone(String utteranceId) { Log.d(TAG, "onDone ( utteranceId :"+utteranceId+" ) "); } }; @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } } 
  • Cómo dar pausa o brecha entre palabras en TTS en android
  • Pausa en el TTS android
  • Android texto a voz es muy lento para inicializar
  • TextToSpeech: función de palabra obsoleta en el nivel 21 de la API
  • Texto de Android a voz Voz masculina
  • TTS omite al azar las primeras letras de la oración
  • Obtener locales disponibles para tts
  • ¿Qué en TtsService podría explicar la falta de onUtteranceCompleted () para playEarcon ()?
  • Resalte la palabra actual que el motor TTS está hablando
  • Cómo cambiar programáticamente el motor predeterminado TTS
  • Idiomas faltantes en TTS android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.