我在一本安卓书中指出,使用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()播放的日志。
为什么会有这种差异呢?有办法解决这个问题吗?
P.S.冒着声明显而易见的风险:所有三个话语都表现得很好,顺序也很正确。只有onUtteranceCompleted()才不会因为tts.playEarcon()的某些原因而被调用。
发布于 2012-04-13 16:48:10
回答我自己。关于TextToSpeech.OnUtteranceCompletedListener的冗长而详细的文档读起来令人难以置信(重点是我的):
当一个话语被合成时调用。
耳石从来不是合成的结果,因此,onUtteranceCompleted()当然不会被调用。这是故意的。
这让我们回到了一个新的问题:如果使用.mp3文件(使用MediaPlayer)没有好处,那么为什么要使用耳罩呢?
https://stackoverflow.com/questions/10134646
复制相似问题