studio programacion herramientas fundamentos con avanzado aplicaciones android android-activity text-to-speech

programacion - TTS global en Android



manual de android en pdf (3)

Inicialice su instancia global desde onActivityResult() , después de saber que los datos TTS están disponibles. Tu aplicación necesita una actividad, hazlo desde la actividad de entrada, todas las siguientes podrán usar tu instancia global una vez que se haya inicializado. También piense cuándo y cómo lo cerrará.

Hola, estoy desarrollando una aplicación para usuarios invidentes, de modo que utilizo muy a menudo texto a voz como prácticamente el único método para responder a las acciones de los usuarios. Decidí hacer que una instancia global de TTS se ejecutara mientras dure la aplicación. Lo he implementado de esta manera

package com.simekadam.blindguardian; import android.content.Context; import android.speech.tts.TextToSpeech; import android.speech.tts.TextToSpeech.OnInitListener; public class SpeechHelper implements OnInitListener { private static TextToSpeech mTts; private String text; private static final SpeechHelper helper = new SpeechHelper(); public static SpeechHelper getInstance(){ return helper; } public void say(String text, Context context){ if(mTts == null){ this.text = text; mTts = new TextToSpeech(context, (OnInitListener) helper); } else{ mTts.speak(text, TextToSpeech.QUEUE_FLUSH, null); } } @Override public void onInit(int status) { // TODO Auto-generated method stub if (status == TextToSpeech.SUCCESS) { mTts.speak(text, TextToSpeech.QUEUE_FLUSH, null); } } public void stopTTS(){ if(mTts != null){ mTts.shutdown(); mTts.stop(); mTts = null; } }

}

Al principio, funciona ... PERO ... quería verificar la disponibilidad de datos de voz como ese

protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); Intent checkIntent = new Intent(); checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); startActivityForResult(checkIntent, MY_DATA_CHECK_CODE); text = getIntent().getExtras(); } protected void onActivityResult( int requestCode, int resultCode, Intent data) { if (requestCode == MY_DATA_CHECK_CODE) { if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) { // success, create the TTS instance mTts = new TextToSpeech(this, (OnInitListener) this); mTts.setLanguage(new Locale("cze", "CZE")); } else { // missing data, install it Intent installIntent = new Intent(); installIntent.setAction( TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); startActivity(installIntent); } } }

Su código del portal para desarrolladores de Android, pero no puedo iniciar la actividad para el resultado de la clase que no es hija de android.Actividad. Por favor, cómo verificarlo sin utilizar actividades, y ¿es este enfoque de invocar TTS correcto? (Lo he implementado todo con Actividades anteriormente, pero hubo un par de pérdidas de memoria debido a un TTS incorrectamente cerrado, y cuando lo cerré correctamente, debe haber sido creado nuevamente en cada llamada, demasiado lento ...)


No necesita usar ACTION_CHECK_TTS_DATA. En su lugar, use isLanguageAvailable como este: (asegúrese de llamar a esto solo después de que se complete onInit)

// check if language is available switch (tts.isLanguageAvailable(locale)) { case TextToSpeech.LANG_AVAILABLE: case TextToSpeech.LANG_COUNTRY_AVAILABLE: case TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE: Log.d(TAG, "SUPPORTED"); break; case TextToSpeech.LANG_MISSING_DATA: Log.d(TAG, "MISSING_DATA");//launch the install data activity break; case TextToSpeech.LANG_NOT_SUPPORTED: Log.d(TAG, "NOT SUPPORTED");//report failure break; }


Aquí hay algunas respuestas de gregm nuevamente a preguntas similares:

TTS - CHECK_VOICE_DATA_FAIL - Comprobar motor disponible o

¿Por qué el ACTION_CHECK_TTS_DATA Intent "es incómodo de usar"?

que también recomienda simplemente usar TextToSpeech.isLanguageAvailable() lugar de ACTION_CHECK_TTS_DATA , junto con un puntero a una clase de ayuda.

He probado esto en algunos teléfonos Android 4.1.2 con Locale.US , y activa bien el motor TTS, y funciona muy bien con motores de terceros. Cuando se prueba en un teléfono antiguo con Android 1.6 (G1), parece que el motor TTS original no está instalado ( LANG_MISSING_DATA ). El siguiente código en ese caso se redirigirá a la tienda para instalar:

Intent installIntent = new Intent(); installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); startActivity(installIntent);

Después de lo cual, usar el motor de tts dentro de la aplicación funciona bien. Básicamente, la antigua publicación de blog de los chicos de Android es un poco exagerada y anticuada, ya que no funciona muy bien con Android 4.x en mi experiencia ( ANDROID_CHECK_TTS_DATA siempre me devolvió CHECK_VOICE_DATA_MISSING_DATA en Android 4.x).