2010-10-09 15 views
5

Ho implementato l'integrazione TextToSpeech esattamente come indicato in this blog post. Dopo averlo aggiunto al mio programma, ora interferisce con gli altri miei intent s.SpeechToText ed esecuzione intento ACTION_CHECK_TTS_DATA

Ad esempio:

  1. voce dell'Elenco
  2. utente avvia un'applicazione
  3. utente richiama l'attività di carico
  4. utente sceglie un file da caricare, e ritorna attività fileanme per caricare nell'intento
  5. L'attività principale inizia e si rende conto che è necessario caricare un nome file in modo che inizi a farlo
  6. Il controllo per TTS deve essere eseguito così NCH ​​il ACTION_CHECK_TTS_DATA intento
  7. Questo mette in pausa l'attività principale nuovo e il processo di caricamento viene interrotto
  8. Quando i rendimenti di controllo TTS, il carico non è mai successo.

Quando è necessario questo controllo TTS? Posso farlo una sola volta all'avvio dell'applicazione? Sta facendo caricare lentamente la mia applicazione. Vorrei che questo carico fosse eseguito in un thread separato, se possibile.

risposta

8

Fare il controllo una volta. Una volta installati i dati, è molto improbabile che l'utente debba farlo di nuovo. Una volta installati i dati, non è possibile per l'utente eliminarlo, anche se lo desidera.

Inoltre, non utilizzare l'intento ACTION_CHECK_TTS_DATA, che è scomodo da usare.

invece, effettuare le seguenti operazioni:

  1. Creare TextToSpeech
  2. OnInit, controllare isLanguageAvailable() se lo è, la vostra applicazione è tutto pronto. se non, inviare l'ACTION_INSTALL_TTS_DATA

Ecco un po 'di codice che inizializza una TextToSpeech nel modo suggerisco. Come bonus, imposta anche la lingua.

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

ho fatto qualcosa di simile a quello che hai menzionato. Grazie! – swinefeaster

+0

@gregm [Perché] (http://stackoverflow.com/q/11550746/636571) l'intento ACTION_CHECK_TTS_DATA è "scomodo da utilizzare"? Grazie +1 per ora. – an00b

+0

Ciao, ho provato usando isLanguageAvailable, ma non sta dando il risultato desiderato. Ad esempio, i dati vocali coreani non sono installati. Tuttavia, quando ho chiamato isLanguageAvailable sui dati vocali del coreano quando non è stato scaricato, ha semplicemente restituito LANG_COUNTRY_AVAILABLE, che è anche corretto. Le impostazioni internazionali sono disponibili per il motore, ma solo i dati vocali non sono stati ancora scaricati. Tuttavia, a causa di ciò, non posso mai verificare se i dati vocali vengono scaricati o meno, dal momento che non ricevo mai LANG_MISSING_DATA. La soluzione non è più applicabile? Grazie! –

Problemi correlati