Android "speak fallado: no está vinculado al motor tts"

Mi aplicación Android tiene texto para hablar y más de una actividad utiliza esta función. Así que creó una clase auxiliar estática para hacer esto fácil.

import java.util.Locale; import android.content.Context; import android.speech.tts.TextToSpeech; import android.speech.tts.TextToSpeech.OnInitListener; import android.util.Log; public class TextToSpeechController implements OnInitListener { private static final String TAG = "TextToSpeechController"; private TextToSpeech myTTS; private String textToSpeak; private Context context; private static TextToSpeechController singleton; public static TextToSpeechController getInstance(Context ctx) { if (singleton == null) singleton = new TextToSpeechController(ctx); return singleton; } private TextToSpeechController(Context ctx) { context = ctx; } public void speak(String text) { textToSpeak = text; if (myTTS == null) { // currently can't change Locale until speech ends try { // Initialize text-to-speech. This is an asynchronous operation. // The OnInitListener (second argument) is called after // initialization completes. myTTS = new TextToSpeech(context, this); } catch (Exception e) { e.printStackTrace(); } } sayText(); } public void onInit(int initStatus) { if (initStatus == TextToSpeech.SUCCESS) { if (myTTS.isLanguageAvailable(Locale.UK) == TextToSpeech.LANG_AVAILABLE) myTTS.setLanguage(Locale.UK); } // status can be either TextToSpeech.SUCCESS or TextToSpeech.ERROR. if (initStatus == TextToSpeech.SUCCESS) { int result = myTTS.setLanguage(Locale.UK); if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { Log.e(TAG, "TTS missing or not supported (" + result + ")"); // Language data is missing or the language is not supported. // showError(R.string.tts_lang_not_available); } else { // Initialization failed. Log.e(TAG, "Error occured"); } } } private void sayText() { // ask TTs to say the text myTTS.speak(this.textToSpeak, TextToSpeech.QUEUE_FLUSH, null); } public void stopTTS() { if (myTTS != null) { myTTS.shutdown(); myTTS.stop(); myTTS = null; } } } 

Estoy usando esta clase de ayuda como esta.

 TextToSpeechController.getInstance(this).speak(readableMessage); 

Pero a veces veo un error como la línea beloew en LogCat.

 "speak:failed not bound to tts engine" 

Ninguna excepción lanzada pero nada leído por TTS. Me di cuenta de que si activaba la actividad de BroadcastReceiver, recibí este error. De lo contrario, si la actividad manualmente abierta del código de la aplicación funciona sin ningún problema.

Aquí está el código BroadcastReceiver

 private final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String newMessage = intent.getExtras().getString(EXTRA_MESSAGE); String readableMessage = intent.getExtras().getString(READABLE_MESSAGE); Bundle b = new Bundle(); b.putString(EXTRA_MESSAGE, newMessage); b.putString(READABLE_MESSAGE, readableMessage); Intent newIntent = new Intent("android.intent.action.MAIN"); newIntent.setClass(context, Speak.class); newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); newIntent.putExtra("MessageReceived", b); newIntent.putExtra("CallType", CallType.NOTIFICATION); context.startActivity(newIntent); } }; 

2 Solutions collect form web for “Android "speak fallado: no está vinculado al motor tts"”

Su código no está esperando la devolución de asincronización del constructor de la clase TextToSpeech. Incluso tienes un comentario que dice que es asíncrona. ¿Por qué siempre falla en el receptor, pero no la actividad no estoy seguro – otros entonces tal vez la actividad como una tarea de primer plano tiene mayor prioridad y sucede a completar antes de llamar a sayText.

Usted necesita esperar para llamar a sayText hasta que la llamada de inicio devuelve en el caso donde tiene que nuevo hasta un nuevo objeto TTS.

Aquí está el código que utilizo para texto a voz. Para mi código simplemente escriba speakWords ("say something"); En cualquier actividad.

 public class VoiceRecognition extends Activity implements OnClickListener, OnInitListener { public static final int VOICE_RECOGNITION_REQUEST_CODE = 1234; public Button speakButton; // TTS object public TextToSpeech myTTS; // status check code public int MY_DATA_CHECK_CODE = 0; // setup TTS public void onInit(int initStatus) { // check for successful instantiation if (initStatus == TextToSpeech.SUCCESS) { if (myTTS.isLanguageAvailable(Locale.US) == TextToSpeech.LANG_AVAILABLE) myTTS.setLanguage(Locale.US); } else if (initStatus == TextToSpeech.ERROR) { Toast.makeText(this, "Sorry! Text To Speech failed...", Toast.LENGTH_LONG).show(); } } /** * Called with the activity is first created. */ @Override public void onCreate(Bundle voiceinput) { super.onCreate(voiceinput); // Inflate our UI from its XML layout description. setContentView(R.layout.voice_recognition); // check for TTS data Intent checkTTSIntent = new Intent(); checkTTSIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); startActivityForResult(checkTTSIntent, MY_DATA_CHECK_CODE); } // speak the user text public void speakWords(String speech) { // speak straight away myTTS.speak(speech, TextToSpeech.QUEUE_FLUSH, null); } public void onClick(View v) { speakWords("hello"; } /** * Handle the results from the recognition activity. */ @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == MY_DATA_CHECK_CODE) { if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) { // the user has the necessary data - create the TTS myTTS = new TextToSpeech(this, this); } else { // no data - install it now Intent installTTSIntent = new Intent(); installTTSIntent .setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); startActivity(installTTSIntent); } } super.onActivityResult(requestCode, resultCode, data); } @Override protected void onDestroy() { super.onDestroy(); myTTS.shutdown(); } 
  • Otras opciones de la biblioteca de Android TextToSpeech
  • Sistema lengua turca para el texto al discurso
  • ¿Cómo puedo guardar el archivo Text to Speech como formato .wav / .mp3 en idioma árabe en External Storage?
  • ¿En qué circunstancias TextToSpeech.isSpeaking () devuelve true?
  • ¿Es Google TTS Engine en todos los teléfonos Android, y dónde puedo conseguirlo?
  • Android: dos instancias de Text-to-Speech funcionan muy lentamente
  • La salida TTS siempre va a A2DP
  • TextToSpeech.setEngineByPackageName () devuelve el éxito incluso cuando el paquete no está disponible
  • Ejecución de TTS Android en un servicio
  • ¿Cómo puedo controlar cómo Android TTS reproduce audio?
  • Transmisión de notificaciones de texto a voz durante la conducción
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.