在我的Android应用程序中的TextToSpeech对象说完一个句子后,我正在尝试采取一些操作,但我的UtteranceProgressListener.onDone()
方法从未被调用。我尝试了很多东西,包括这篇文章中的建议,但没有任何效果。我的应用程序的相关代码发布在下面。TextToSpeech 对象正确地朗读我给它的句子,但UtteranceProgressListener
中的任何回调函数都不会被调用。有人可以帮我找出问题所在吗?例如,我提供给TextToSpeech.speak()
函数的话语 ID 是否需要采用我缺少的某种特殊格式?
mtts = new TextToSpeech(myAct, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
mtts.setLanguage(Locale.US);
}
}
});
mtts.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onDone(String utteranceId) {
Toast.makeText(myAct, "OnDone called", Toast.LENGTH_LONG).show();
}
@Override
public void onError(String utteranceId) {
Toast.makeText(myAct, "OnError called", Toast.LENGTH_LONG).show();
}
@Override
public void onStart(String utteranceId) {
Toast.makeText(myAct, "OnStart called", Toast.LENGTH_LONG).show();
}
});
Bundle params = new Bundle();
params.putString(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "");
myAct.mtts.speak(myText, TextToSpeech.QUEUE_FLUSH, params, "MyID");
看看logcat,你的代码可能已经触发了:android.view.ViewRootImpl$CalledFromWrongThreadException
如果你想做一些GUI线程的东西,使用handler和可像这样运行:
public void onDone(String utteranceId) {
Log.v(TAG, "Speaking done"); // this is OK
// This is GUI-thread part
final View v = findViewById(R.id.txtStatus);
v.getHandler().post(new Runnable() {
@Override
public void run() {
txtStatus.setText("Speaking done");
}
});
}
开始TTS口语:
tts.speak("bla bla bla", TextToSpeech.QUEUE_FLUSH, null, "1");
如果要添加回调 UtteranceProgressListener,则必须将 TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID 作为 utteranceId
它看起来像这样:
myAct.mtts.speak(myText, TextToSpeech.QUEUE_FLUSH, null, TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID);
请参阅此帖子:语句进度侦听器不返回错误消息
并查看引擎网站:TTS 引擎