我正在使用以下代码将文本转换为语音(TTS
),并使用setOnUtteranceProgressListener.onDone
检测语音何时结束,但是在文本仍在播放时调用了onDone方法读。是否可以检测何时真正完成了阅读?
private fun speakSimple(content: String, utteranceId: String, flush: Boolean = false) {
mTTS?.speak(content, if (flush) TextToSpeech.QUEUE_FLUSH else TextToSpeech.QUEUE_ADD, null, utteranceId)
mUtteranceId = utteranceId
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment
mView = inflater.inflate(R.layout.fragment_conversation, container, false)
mBotPhraseText = mView!!.findViewById(R.id.botPhraseText)
mInteractionOptionsContainer = mView!!.findViewById(R.id.interactionOptionsContainer)
requestRecordAudioPermission()
mTTS = TextToSpeech(context!!, this)
mTTS?.setOnUtteranceProgressListener(object : UtteranceProgressListener() {
override fun onError(utteranceId: String?) {
}
override fun onDone(utteranceId: String?) {
// This part is executed even before the speech is completed
}
}
override fun onStart(utteranceId: String?) {
}
})
答案 0 :(得分:0)
TTS不提供此类回调。您所指的那个UtteranceProgressListener通知侦听器合成事件。设置侦听器的文档中提到:
设置侦听器,该侦听器将被通知与给定语音合成相关的各种事件。
因此,您收到的onDone
回调与合成有关。 TTS服务通知您所有文本均已处理/准备好。即使TTS说话,也不意味着整个文本都已经合成。
通过使用synthesizeToFile
而不是语音,以及从onDone
收到UtteranceProgressListener
方法将合成的文件传递到media player服务中,可以实现所需的功能或exoplayer(提供此类侦听器),在其中跟踪或操纵诸如开始,恢复,暂停和停止之类的事件要容易一些。