2010-10-09 36 views
5

我已按照this blog post中提到的方式完成TextToSpeech集成。在我將其添加到我的程序後,它現在正在干擾我的其他intent s。SpeechToText並運行ACTION_CHECK_TTS_DATA意向

例如:

  1. 列表項
  2. 用戶啓動應用程序
  3. 用戶調用負載活動
  4. 用戶選擇一個文件來加載和活動返回fileanme在意向
  5. 加載主要活動開始,並意識到它需要加載一個文件名,所以它開始這樣做
  6. TTS的檢查需要完成,所以我lau NCH的ACTION_CHECK_TTS_DATA意圖
  7. 這可以暫停主要活動再次和加載過程被中斷
  8. 當TTS檢查返回,裝載從來沒有發生過。

我什麼時候需要這個TTS檢查?我可以在應用程序啓動時只做一次嗎?這導致我的應用程序加載緩慢。如果可能,我希望在單獨的線程中執行此加載。

回答

8

做一次檢查。數據安裝完成後,用戶不太可能需要再次執行此操作。一旦數據安裝完畢,用戶無法刪除它,即使他們想要。

此外,不要使用ACTION_CHECK_TTS_DATA意圖,這是尷尬的使用。

相反,做到以下幾點:

  1. 創建文字轉語音
  2. 的OnInit,檢查isLanguageAvailable() 如果是,您的應用程序是所有設置。 如果沒有,發送ACTION_INSTALL_TTS_DATA

下面是一些以我建議的方式初始化TextToSpeech的代碼。作爲獎勵,它也設置語言。

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

我已經做了類似於你提到的事情。謝謝! – swinefeaster 2011-11-25 08:09:46

+0

@gregm [爲什麼](http://stackoverflow.com/q/11550746/636571)是ACTION_CHECK_TTS_DATA意圖「尷尬使用」?現在感謝+1。 – an00b 2012-07-18 21:51:23

+0

你好,我測試使用isLanguageAvailable,但它沒有給出所需的結果。例如,韓語的語音數據沒有安裝。然而,當我沒有下載時調用韓語語音數據上的isLanguageAvailable,它只是返回LANG_COUNTRY_AVAILABLE,這也是正確的。只有語音數據尚未下載,語言環境纔可用於引擎。但是,由於這個原因,我無法檢查是否下載語音數據,因爲我從來沒有收到過LANG_MISSING_DATA。該解決方案不再適用?謝謝! – 2017-06-18 16:00:22