如何用话语id得到流畅的句子文本到语音

时间:2018-05-29 14:29:19

标签: android kotlin text-to-speech

我的目标是使用Android Text-to-speech API播放文字句子作为语音,同时跟踪当前所说的单词。

为了获得流畅的自然播放,我使用:

tts.speak("This is the sentence", TextToSpeech.QUEUE_FLUSH, null, null)

然后我无法跟踪当前所说的单词。

在跟踪当前使用的单词时播放句子:

val words = "This is the sentence".split(" ")
words.forEachIndexed { index, element ->
    tts.speak(element, TextToSpeech.QUEUE_ADD, null, index.toString())
}

与UtteranceProgressListener相结合,但话语非常生涩,不能作为自然句子回读。

有没有办法同时获得一个自然语句并同时跟踪当前所说的单词?

1 个答案:

答案 0 :(得分:2)

如果您查看最新的Android文档,您会注意到在API级别26中引入UtteranceProgressListener的新方法 - 名为onRangeStart((String utteranceId,int start,int end,int frame)

https://developer.android.com/reference/android/speech/tts/UtteranceProgressListener.html#onRangeStart(java.lang.String,%20int,%20int,%20int)

但是,正如文件所述:

"只有在引擎通过调用rangeStart(int,int,int)"

提供时序信息时才会调用

这在SynthesisCallback中实现: https://developer.android.com/reference/android/speech/tts/SynthesisCallback.html#rangeStart(int,%20int,%20int)

再次说明文件:

"服务可以调用此方法来提供有关语音文本的时间信息。"

所以,遗憾的是,这意味着提供所需时序信息的回调是依赖于实现的。

在运行Android 8.0.0并使用默认tts引擎(com.google.android.tts)的设备上,我没有收到回调。

为了测试你需要

  • 根据SDK级别26或以上版本构建
  • 实施您自己的UtteranceProgressListener
  • 通过调用TextToSpeech.setOnUtteranceProgressListener(listener)将其设置为TextToSpeech引擎;
  • 覆盖你的onRangeStart(String,int,int,int)方法 UtteranceProgressListener。

如果您的实现支持时序信息,那么您将进行回调,如果不是,最好的办法是找到另一个引擎实现或者实现自己的TextToSpeechService。