2012-03-12 38 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