我无法弄清楚为什么TTS不能始终如一地工作。我想了解如何改进我目前的设置。应用程序从TTS开始,欢迎用户或提示用户说出语音命令。所以在onCreate中我只有以下内容:
textToSpeech = new TextToSpeech(TTSActivity.this, this);
我的TTSActivity类实现了OnInitListener,所以我也有以下覆盖方法:
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
textToSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onStart(String utteranceId) {
// TODO Auto-generated method stub
}
@Override
public void onError(String utteranceId) {
// TODO Auto-generated method stub
}
@Override
public void onDone(String utteranceId) {
//do some work here
}
});
textToSpeech.setLanguage(Locale.US);
map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "UniqueID");
ttsString(0);
} else if (status == TextToSpeech.ERROR){
//try to restart TTS
textToSpeech = new TextToSpeech(TTSActivity.this, this);
ttsString(0);
}
} //end onInit() method
一些解释:textToSpeech.setOnUtteranceProgressListener()就在那里,一旦TTS引擎停止说话,我就可以激活语音识别。 map来自HashMap map = new HashMap()和ttsString是我希望TTS说话的所有字符串。所以我的ttsString(id#)方法如下所示。在我说TTS之前,我调用ttsString(id#)来设置字符串。
private void ttsString(int id)
{
switch (id)
{
case 0:{
metaString = "Say string one";
speakText(metaString);
break;
}
case 1:{
metaString = "Say string two";
speakText(metaString);
break;
}
case 2:{
metaString = "Say string three";
speakText(metaString);
break;
}
}
}
这就是我让TTS发言的方式:
private void speakText(String text) {
if(textToSpeech.isSpeaking()) {
return;
} else {
textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, map);
}
}
我没有收到TTS未绑定错误,一切都在一个时间点起作用,但不是一致的。换句话说,有时程序会说话,有时却不会。你有什么建议我这样做?重结构?
答案 0 :(得分:3)
一些提示:
在if (status == TextToSpeech.ERROR)
中,调用ttsString(0);
将始终失败,因为TTS尚未初始化。
你似乎没有调用tts.shutdown()。实际上我会在onStart()中初始化tts,并在onStop()中调用shutdown()。
在我的应用程序中,我已将TTS投入使用,因此在配置更改期间重新创建活动/片段时,不要理会所有初始化/取消初始化。
查看logcat,你应该看到有任何错误。我在使用svox语音时看到了奇怪的错误,据我记得问题来自于没有正确关机。