【发布时间】:2012-04-25 10:51:42
【问题描述】:
我的一本 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() 播放的那个。
为什么会出现这种差异?有解决办法吗?
P.S. 冒着陈述显而易见的风险:所有三个话语都以正确的顺序播放。只有onUtteranceCompleted() 因某种原因而没有被tts.playEarcon() 调用。
【问题讨论】:
-
playEarcon(...)的文档说:“使用指定的排队模式和参数播放earcon。earcon必须已经添加了addEarcon(String, String)或addEarcon(String, String, int)。" 不知道为什么它会播放,考虑到上面的文档,但可能值得一试? -
@MH 我只包含了相关代码,以避免分散主要问题的注意力。我当然会进行所有正确的初始化,包括
addEarcon()(否则就不会播放,正如您正确指出的那样)。仍在寻找这个谜团的解决方案...... -
您在哪个平台版本上测试您的代码?不推荐使用起始 API 级别 15
TextToSpeech.OnUtteranceCompletedListener并由UtteranceProgressListener替换。此外,您可能想要检查addEarcon(...)和playEarcon(...)的返回值,即使文本被读出。最后,您可以尝试几个不同的 TTS 引擎,看看行为是否一致。 -
@MH 我正在使用 API 8。我不能使用 API 15,因为我的应用程序必须能够在较旧的 Android 2.2 手机上运行...我确实尝试过使用不同的 TTS 引擎:它们都展示了完全相同的行为。看起来这个“错误”是设计使然。