我有一本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)没有优势,为什么还要使用耳塞?