2012-03-12 65 views
4

我想在我的Activity中實現android的文本語音技術,但是我面臨一個奇怪的錯誤。我的代碼中聽不到任何聲音。說方法只有當我把它放在onInit方法中,否則它不會說話。Android TTS不會發言

我的代碼如下:

public class GameOverActivity extends Activity implements OnInitListener { 
private TextToSpeech talker; 
.... 
talker = new TextToSpeech(this, this); 
say("Something",false); 
... 
    public void onInit(int status) { 
     if (status == TextToSpeech.SUCCESS) { 
      talker.setLanguage(Locale.US); 
     } 
     else if (status == TextToSpeech.ERROR) { 
      Toast.makeText(this,"Error occurred while initializing Text-To-Speech engine", Toast.LENGTH_LONG).show(); 
     } 

void say(String text, boolean flush) { 
     if(flush == true) 
     { 
     talker.speak(text,TextToSpeech.QUEUE_FLUSH,null); 
     } 
     if(flush == false) 
     { 
     talker.speak(text,TextToSpeech.QUEUE_ADD,null); 
     }   
    } 

奇怪的是,如果我把在OnInit中的發言權方法,它工作正常!

我看到logcat的細心和這裏的結果:

TtsService.OnCreate() 的TT加載 AudioTrack開始 TTSService.setLanguage 加載的en-US succusfully 設置語速爲100

然後什麼也沒有發生。

對上述代碼有什麼問題有任何想法嗎?

在此先感謝!

+0

說起動時flush的值是什麼? – Brian 2012-03-12 13:50:22

+0

如果使它成真或假,它沒有任何區別 – Nick 2012-03-12 14:04:11

回答

10

經過幾個小時看代碼後,我發現問題在於TTS引擎初始化需要一些時間。如果初始化未結束,說方法調用將失敗。

如果你在按鈕上點擊某個東西,你可能不會需要這個,因爲在按下按鈕之前用戶需要一些時間來考慮,初始化將會結束。

如果你想「說」的東西,一旦完成初始化,使用此代碼:

talker = new TextToSpeech(this, new TextToSpeech.OnInitListener() { 

     @Override 
     public void onInit(int arg0) { 
     if(arg0 == TextToSpeech.SUCCESS) 
      { 
     talker.setLanguage(Locale.US); 
      say(gameover,true); 
      say(line,false); 
      say(definition_string,false); 
      } 
     } 
    }); 
0

我在文字轉語音方面遇到的一個問題是,如果將它安裝到SD卡上,那麼在USB插入時它將不起作用。所以你可以嘗試從USB上拔掉你的測試設備,看看是否能解決問題。

您可能會嘗試的另一件事是逐步瀏覽程序,看看您是否因意外而以任何方式改變了文本到語音的對象。在代碼的談話部分設置一箇中斷點,並查看發言者對象中的所有變量。

3

建議您從您的主要活動實施TextToSpeech.OnInitListener。試試這個

public class GameOverActivity extends Activity implements TextToSpeech.OnInitListener { 

@Override 
public void onInit(int status) { 
    if (status == TextToSpeech.SUCCESS) { 

     int result = mTts.setLanguage(Locale.US); 
     // Try this someday for some interesting results. 
     // int result mTts.setLanguage(Locale.FRANCE); 
     if (result == TextToSpeech.LANG_MISSING_DATA || 
       result == TextToSpeech.LANG_NOT_SUPPORTED) { 
      // Lanuage data is missing or the language is not supported. 
      //Log.e(TAG, "Language is not available."); 
     } else { 
      // Check the documentation for other possible result codes. 
      // For example, the language may be available for the locale, 
      // but not for the specified country and variant. 

      // The TTS engine has been successfully initialized. 
      // Allow the user to press the button for the app to speak again. 
      // mAgainButton.setEnabled(true); 
      // Greet the user. 
      //sayHello(); 
     } 
    } else { 
     // Initialization failed. 

    } 

} 

private TextToSpeech mTts; 
} 
0

這個問題的好另一個原因可能是你的TTS引擎,有時候在三星手機默認TTS引擎是三星引擎不喜歡上的波斯一些語言工作(我的意思並不是波斯文本,即使你想閱讀英文文本,它仍然不起作用,這很奇怪,但它會發生)。 爲了解決這個問題,你所要做的就是在你的代碼上設置TTS引擎(或者手動選擇Setting -> Language input -> Text to speech -> Google Text-to-speech