2010-10-09 14 views
5

Implementé la integración TextToSpeech exactamente como se menciona en this blog post. Después de agregarlo a mi programa, ahora interfiere con mis otros intent s.SpeechToText y ejecutando el intento ACTION_CHECK_TTS_DATA

Por ejemplo:

  1. elemento de la lista
  2. usuario inicia la aplicación
  3. usuario invoca la actividad de carga
  4. usuario elige un archivo a cargar, y recupera la actividad fileanme para cargar en el intento
  5. La actividad principal comienza y se da cuenta de que necesita cargar un nombre de archivo para que comience a hacerlo
  6. El control de TTS debe hacerse así que lau NCH ​​la intención ACTION_CHECK_TTS_DATA
  7. Esto detiene la actividad nuevo y el proceso de carga se interrumpe
  8. Cuando, la carga nunca ocurrieron el cheque TTS devoluciones.

¿Cuándo necesito este cheque TTS? ¿Puedo hacerlo una vez en el inicio de la aplicación? Está causando que mi aplicación se cargue lentamente. Me gustaría que esta carga se realice en un hilo separado si es posible.

Respuesta

8

Haga el control una vez. Una vez que se instalan los datos, es muy poco probable que el usuario deba volver a hacerlo. Una vez que los datos están instalados, no hay forma de que el usuario los elimine, incluso si quisieran.

Además, no use la intención ACTION_CHECK_TTS_DATA, que es incómodo de usar.

En su lugar, haga lo siguiente:

  1. Crear TextToSpeech
  2. OnInit, comprobar isLanguageAvailable() si lo es, su aplicación está todo listo. si no, enviar el ACTION_INSTALL_TTS_DATA

Aquí hay un código que inicializa una síntesis de voz en la forma en que sugieren. Como beneficio adicional, establece el idioma también.

public class DemoCreateTTS 
{ 
    private static final String TAG = "DemoCreateTTS"; 

    private TextToSpeech tts; 

    public void createTextToSpeech(final Context context, 
      final Locale locale) 
    { 
     tts = new TextToSpeech(context, new OnInitListener() 
     { 
      @Override 
      public void onInit(int status) 
      { 
       if (status == TextToSpeech.SUCCESS) 
       { 
        Locale defaultOrPassedIn = locale; 
        if (locale == null) 
        { 
         defaultOrPassedIn = Locale.getDefault(); 
        } 
        // check if language is available 
        switch (tts.isLanguageAvailable(defaultOrPassedIn)) 
        { 
         case TextToSpeech.LANG_AVAILABLE: 
         case TextToSpeech.LANG_COUNTRY_AVAILABLE: 
         case TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE: 
          Log.d(TAG, "SUPPORTED"); 
          tts.setLanguage(locale); 
          //pass the tts back to the main 
          //activity for use 
          break; 
         case TextToSpeech.LANG_MISSING_DATA: 
          Log.d(TAG, "MISSING_DATA"); 
           Log.d(TAG, "require data..."); 
           Intent installIntent = new Intent(); 
           installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); 
           context.startActivity(installIntent); 
          break; 
         case TextToSpeech.LANG_NOT_SUPPORTED: 
          Log.d(TAG, "NOT SUPPORTED"); 
          break; 
        } 
       } 
      } 
     }); 
    } 
} 
+0

He hecho algo similar a lo que mencionas. ¡Gracias! – swinefeaster

+0

@gregm [¿Por qué] (http://stackoverflow.com/q/11550746/636571) es el ACTION_CHECK_TTS_DATA intento "incómodo de usar"? Gracias +1 por ahora. – an00b

+0

Hola, probé usando isLanguageAvailable, pero no está dando el resultado deseado. Por ejemplo, los datos de voz de Corea no están instalados. Sin embargo, cuando llamé isLanguageAvailable en los datos de voz del coreano cuando no se descargó, simplemente devolvió LANG_COUNTRY_AVAILABLE, que también es correcto. La configuración regional está disponible para el motor, solo los datos de voz aún no descargados. Sin embargo, debido a esto, nunca puedo verificar si los datos de voz se descargan o no, ya que nunca recibiré LANG_MISSING_DATA. ¿La solución ya no es aplicable? ¡Gracias! –

Cuestiones relacionadas