【问题标题】:Huh? Why doesn't playEarcon() produce onUtteranceCompleted()?嗯?为什么 playEarcon() 不产生 onUtteranceCompleted()?
【发布时间】: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 引擎:它们都展示了完全相同的行为。看起来这个“错误”是设计使然。

标签: android text-to-speech


【解决方案1】:

回答我自己。关于TextToSpeech.OnUtteranceCompletedListener 的非常长且非常详细的文档内容如下(重点是我的):

当话语被合成时调用。

earcon 是从不合成的结果,所以当然onUtteranceCompleted() 从不会被调用。这是设计使然。

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

【讨论】:

  • 你确定是这个原因吗? This old thread 声明你必须添加一个虚拟的KEY_PARAM_UTTERANCE_ID 参数才能让该死的东西调用你的onUtteranceCompleted
  • @ef2011 是的,我确定。我也将 KEY_PARAM_UTTERANCE_ID 用于playEarcon(),但这无济于事。它不会产生 onUtteranceCompleted。期间。
猜你喜欢
  • 2012-07-13
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 2012-05-02
  • 2017-08-02
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多