咦?为什么playEarcon()不生成onUtteranceCompleted()?

时间:2012-04-13 02:51:00

标签: android text-to-speech

我已经说过一本Android手册,使用TextToSpeech.playEarcon()比播放音频文件(使用MediaPlayer)更可取,因为:

  

而不是必须确定播放声音的适当时机   提示和依靠回调来获得正确的时机,我们可以改为   在我们发送给TTS引擎的文本中排队我们的耳朵。然后我们   知道我们的耳塞将在适当的时间播放,而我们   可以使用相同的路径来获取用户的声音,包括    onUtteranceCompleted()回调让我们知道我们在哪里。

但我对此进行的简短实验表明,不是的情况:

String utteranceId = String.valueOf(utteranceNum++);
params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, utteranceId);
params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC));
tts.speak("FIRST part of sentence", TextToSpeech.QUEUE_ADD, params);

utteranceId = String.valueOf(utteranceNum++);
params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, utteranceId);
params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC));
tts.playEarcon("[fancyring]", TextToSpeech.QUEUE_ADD, params);

utteranceId = String.valueOf(utteranceNum++);
params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, utteranceId);
params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC));
tts.speak("SECOND part of sentence", TextToSpeech.QUEUE_ADD, params);

当我查看来自onUtteranceCompleted()的日志时,我只会看到tts.speak()播放的日语,而不是tts.playEarcon()播放的日语。

为什么会出现这种差异?有解决方法吗?

P.S。冒着说明显而易见的风险:所有三个话语都以正确的顺序播放出来。只有onUtteranceCompleted()因某种原因未被调用tts.playEarcon()

1 个答案:

答案 0 :(得分:1)

回答自己。关于TextToSpeech.OnUtteranceCompletedListener读取的非常详细且非常详细的文档(重点是我的):

  

当话语合成时调用。

一个earcon 从不是一个合成的结果,所以当然onUtteranceCompleted() 永远不会为它调用。这是设计的。

这让我们回到了一个新问题:如果播放.mp3文件(使用MediaPlayer)没有优势,为什么要使用耳机呢?