2010-10-09 9 views
5

J'ai implémenté l'intégration TextToSpeech exactement comme mentionné dans this blog post. Après l'avoir ajouté à mon programme, il interfère maintenant avec mes autres intent s.SpeechToText et exécution de l'ACTION_CHECK_TTS_DATA intention

Par exemple:

  1. Liste item
  2. utilisateur démarre l'application
  3. utilisateur invoque l'activité de charge
  4. utilisateur sélectionne un fichier à charger, et retourne activité fileanme à charger dans l'intention
  5. L'activité principale commence et se rend compte qu'il doit charger un nom de fichier pour qu'il commence à le faire.
  6. La vérification de TTS doit être effectuée NCH ​​l'intention ACTION_CHECK_TTS_DATA
  7. se met en pause l'activité principale à nouveau et le processus de chargement est interrompu
  8. Lorsque les déclarations de contrôle TTS, le chargement est arrivé jamais.

Quand ai-je besoin de cette vérification TTS? Puis-je le faire une fois au démarrage de l'application? Cela provoque le chargement lent de mon application. Je voudrais que cette charge soit effectuée dans un fil séparé si possible.

Répondre

8

Faites le contrôle une fois. Une fois les données installées, il est très improbable que l'utilisateur doive le refaire. Une fois les données installées, l'utilisateur n'a aucun moyen de les supprimer, même s'il le souhaite.

De même, n'utilisez pas l'intention ACTION_CHECK_TTS_DATA, c'est difficile à utiliser.

Au lieu de cela, procédez comme suit:

  1. Créer TextToSpeech
  2. OnInit, vérifiez isLanguageAvailable() si elle est, votre application est tous ensemble. sinon, envoyez le ACTION_INSTALL_TTS_DATA

Voici un code qui initialise un TextToSpeech de la manière que je suggère. En prime, il définit également la langue.

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

J'ai fait quelque chose de similaire à ce que vous mentionnez. Merci! – swinefeaster

+0

@gregm [Pourquoi] (http://stackoverflow.com/q/11550746/636571) est l'ACTION_CHECK_TTS_DATA Intent "maladroit à utiliser"? Merci +1 pour le moment. – an00b

+0

Bonjour, j'ai testé en utilisant isLanguageAvailable, mais ça ne donne pas le résultat désiré. Par exemple, les données vocales coréennes ne sont pas installées. Cependant quand j'ai appelé isLanguageAvailable sur les données de la voix du coréen quand il n'est pas téléchargé, il a simplement renvoyé LANG_COUNTRY_AVAILABLE, qui est également correct. Les paramètres régionaux sont disponibles pour le moteur uniquement les données vocales non encore téléchargées. Cependant, pour cette raison, je ne peux jamais vérifier si les données vocales sont téléchargées ou non, car je ne reçois jamais de LANG_MISSING_DATA. La solution n'est-elle plus applicable? Merci! –