我有一本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()播放的日志的utteranceIds,而不是tts.playEarcon()播放的日志的anceanceId。

为什么会有这种差异?有没有解决方法?

附言冒着显而易见的危险:所有三种说话都按正确顺序正确播放。由于tts.playEarcon()的某些原因,仅调用onUtteranceCompleted()

最佳答案

回答我自己。关于TextToSpeech.OnUtteranceCompletedListener的令人难以置信的冗长和非常详细的文档读取(重点是我的):


  语音合成后调用。


耳塞从来都不是合成的结果,因此当然不会调用onUtteranceCompleted()。这是设计使然。

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

09-28 01:06