2

我拥有的一本 Android 书籍指出,使用TextToSpeech.playEarcon()比播放音频文件(使用 MediaPlayer)更可取,因为:

我们不必确定播放声音提示的合适时机并依靠回调来获得正确的时机,而是可以将我们的耳标在我们发送到 TTS 引擎的文本中排队。然后我们知道我们的 earcons 将在适当的时间播放,我们可以使用相同的路径将我们的声音传递给用户,包括 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()的日志时,我只看到 utteranceIds 播放的tts.speak(),而不是播放的tts.playEarcon()

为什么会出现这种差异?有解决方法吗?

PS冒着说明显而易见的风险:所有三个话语都以正确的顺序播放。只有onUtteranceCompleted()出于某种原因没有被调用tts.playEarcon()

4

1 回答 1

1

Answering myself. The incredibly long and very detailed documentation about TextToSpeech.OnUtteranceCompletedListener reads (the emphasis is mine):

Called when an utterance has been synthesized.

An earcon is never a result of synthesization, so of course onUtteranceCompleted() will never be called for it. This is by design.

Which gets us back to a new question: If there is no advantage to earcons over playing .mp3 files (using MediaPlayer), why use earcons at all?

于 2012-04-13T16:48:10.697 回答