我的目标是使用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相结合,但话语非常生涩,不能作为自然句子回读。
有没有办法同时获得一个自然语句并同时跟踪当前所说的单词?
答案 0 :(得分:2)
如果您查看最新的Android文档,您会注意到在API级别26中引入UtteranceProgressListener的新方法 - 名为onRangeStart((String utteranceId,int start,int end,int frame)
但是,正如文件所述:
"只有在引擎通过调用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)的设备上,我没有收到回调。
为了测试你需要
如果您的实现支持时序信息,那么您将进行回调,如果不是,最好的办法是找到另一个引擎实现或者实现自己的TextToSpeechService。