【问题标题】:UtteranceProgressListener Out of SyncUtteranceProgressListener 不同步
【发布时间】: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 线程。您需要重新考虑您的方法。

标签: android text-to-speech


【解决方案1】:

创建类成员

List<String> mUtterances = new ArrayList<String>();
int mCurrentUtteranceIndex;

将您的话语保存在mUtterances,然后调用sayThis(mUtterances.get(0), 0)

然后onDone调用下一个sayThis

 @Override
public void onDone(String utteranceID) {
    if (++mCurrentUtteranceIndex < mUtterances.size()) {
        sayThis(mUtterances.get(mCurrentUtteranceIndex), mCurrentUtteranceIndex);
    }
}

【讨论】:

    猜你喜欢
    • 2014-03-17
    • 2018-06-23
    • 2013-12-16
    • 1970-01-01
    • 2012-08-09
    • 2014-09-25
    • 2019-02-27
    • 2021-04-29
    相关资源
    最近更新 更多