如何获得带有话语 ID 的句子的流畅的文本到语音转换

mag*_*ber 1 android text-to-speech kotlin

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

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

tts.speak("This is the sentence", TextToSpeech.QUEUE_FLUSH, null, null)
Run Code Online (Sandbox Code Playgroud)

但后来我无法跟踪当前所说的话。

要在跟踪当前说出的单词的同时播放句子,我使用:

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

与 UtteranceProgressListener 结合使用,但随后语音非常生涩,不能作为自然句子读回。

有没有办法让自然说出的句子同时跟踪当前说出的单词?

小智 5

如果您查看最新的 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 引擎;
  • 覆盖 UtteranceProgressListener 中的 onRangeStart(String, int, int, int) 方法。

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