【发布时间】:2015-04-15 04:02:49
【问题描述】:
总结
- 数组中的话语列表
- 遍历数组并为每个话语调用我的方法“sayThis”
- 正在调用 UtteranceProgressListener,TTS 工作
- 似乎有时在 UtteranceProgressListener 完成当前话语之前调用了我的方法“sayThis”
我认为流程应该如下:
1) 调用方法“sayThis”,如果 voiceReady=true
2) TTS 启动话语并调用 UtteranceProgressListener onStart 并将 voiceReady 设置为 false
3) 如果 voiceReady=false
,则不应调用方法“sayThis”
4) UtteranceProgressListener onDone 在话语完成时调用,voiceReady=true
5) 可以再次调用方法“sayThis”,因为 voiceReady=true
6) 上面应该继续,直到话语数组被循环完成
//Code snippet that loops through array and calls "sayThis" method
//There are no errors
while(arrayCounter < utterances.size()) {
if (voice.voiceReady == true) {
voice.sayThis(utterances.get(arrayCounter), arrayCounter);
arrayCounter++;
}
}
//Code snippet that processes speech
//There are no errors
public void sayThis(String whatToSay, int utteranceID){
Log.d(LOG_SOURCE, "sayThis method called: Utterance ID=" + utteranceID);
voiceParams.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, Integer.toString(utteranceID));
ttsVoice.speak(whatToSay, TextToSpeech.QUEUE_ADD, voiceParams);
}
//Code snippet from the UtteranceProgressListener
//You can see from the logs the methods are being called
@Override
public void onStart(String utteranceID) {
voiceReady = false;
Log.d(LOG_SOURCE, "(ttsUtteranceListener) UtteranceProgressListener onStart " +
"method called for utteranceID:" + utteranceID + ", voiceReady=false");
}
@Override
public void onDone(String utteranceID) {
voiceReady = true;
Log.d(LOG_SOURCE, "(ttsUtteranceListener) UtteranceProgressListener onDone " +
"method called for utteranceID:" + utteranceID + ", voiceReady=true");
- Logcat 会指示并不总是遵循这种模式,如下所示:
02-13 18:05:25.487: D/LFS_TheVoice(10645): sayThis method called: Utterance ID=0
02-13 18:05:25.490: D/LFS_TheVoice(10645): (ttsUtteranceListener) UtteranceProgressListener onStart method called for utteranceID:0, voiceReady=false
02-13 18:05:29.578: D/LFS_TheVoice(10645): (ttsUtteranceListener) UtteranceProgressListener onDone method called for utteranceID:0, voiceReady=true
02-13 18:05:29.578: D/LFS_TheVoice(10645): sayThis method called: Utterance ID=1
02-13 18:05:29.580: D/LFS_TheVoice(10645): (ttsUtteranceListener) UtteranceProgressListener onStart method called for utteranceID:1, voiceReady=false
02-13 18:05:33.107: D/LFS_TheVoice(10645): sayThis method called: Utterance ID=2
02-13 18:05:33.107: D/LFS_TheVoice(10645): (ttsUtteranceListener) UtteranceProgressListener onDone method called for utteranceID:1, voiceReady=true
02-13 18:05:33.109: D/LFS_TheVoice(10645): (ttsUtteranceListener) UtteranceProgressListener onStart method called for utteranceID:2, voiceReady=false
02-13 18:05:38.667: D/LFS_TheVoice(10645): sayThis method called: Utterance ID=3
02-13 18:05:38.667: D/LFS_TheVoice(10645): (ttsUtteranceListener) UtteranceProgressListener onDone method called for utteranceID:2, voiceReady=true
02-13 18:05:38.668: D/LFS_TheVoice(10645): sayThis method called: Utterance ID=4
02-13 18:05:38.669: D/LFS_TheVoice(10645): sayThis method called: Utterance ID=5
02-13 18:05:38.671: D/LFS_TheVoice(10645): (ttsUtteranceListener) UtteranceProgressListener onStart method called for utteranceID:3, voiceReady=false
02-13 18:05:45.411: D/LFS_TheVoice(10645): (ttsUtteranceListener) UtteranceProgressListener onDone method called for utteranceID:3, voiceReady=true
02-13 18:05:45.411: D/LFS_TheVoice(10645): (ttsUtteranceListener) UtteranceProgressListener onStart method called for utteranceID:4, voiceReady=false
02-13 18:05:49.966: D/LFS_TheVoice(10645): (ttsUtteranceListener) UtteranceProgressListener onDone method called for utteranceID:4, voiceReady=true
02-13 18:05:49.966: D/LFS_TheVoice(10645): (ttsUtteranceListener) UtteranceProgressListener onStart method called for utteranceID:5, voiceReady=false
02-13 18:05:54.198: D/LFS_TheVoice(10645): (ttsUtteranceListener) UtteranceProgressListener onDone method called for utteranceID:5, voiceReady=true
02-13 18:05:54.199: D/LFS_TheVoice(10645): sayThis method called: Utterance ID=6
02-13 18:05:54.202: D/LFS_TheVoice(10645): (ttsUtteranceListener) UtteranceProgressListener onStart method called for utteranceID:6, voiceReady=false
02-13 18:05:55.912: D/LFS_TheVoice(10645): (ttsUtteranceListener) UtteranceProgressListener onDone method called for utteranceID:6, voiceReady=true
02-13 18:05:55.912: D/LFS_TheVoice(10645): sayThis method called: Utterance ID=7
02-13 18:05:55.914: D/LFS_TheVoice(10645): (ttsUtteranceListener) UtteranceProgressListener onStart method called for utteranceID:7, voiceReady=false
02-13 18:05:56.765: D/LFS_TheVoice(10645): (ttsUtteranceListener) UtteranceProgressListener onDone method called for utteranceID:7, voiceReady=true
关于如何同步流程有什么建议吗?
这几乎就像遍历数组并调用“sayThis”方法比 UtteranceProgressListener 可以跟上切换“voiceReady”布尔值的真/假值更快。
如果我无法准确地检测到每个话语何时完成,这将对我造成流量控制问题。
谢谢
迈克尔
【问题讨论】:
-
TTS 是异步的,TextToSpeech.speak() 不会阻塞 UI 线程。您需要重新考虑您的方法。