首页 > 解决方案 > 检测语音 (TTS) 何时真正结束

问题描述

我正在使用以下代码将文本转换为TTS语音setOnUtteranceProgressListener.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?) {

            }

        })

标签: androidtext-to-speech

解决方案


TTS不提供此类回调。您指的是UtteranceProgressListener通知侦听器合成事件。设置监听器的文档提到:

设置将通知与给定话语的合成相关的各种事件的侦听器。

因此,onDone您收到的回调是关于合成的。TTS 服务会通知您所有文本都已处理/准备好。即使,TTS 说这并不意味着整个文本已经被合成。

您可以通过使用而不是说话来实现您想要的synthesizeToFile,并且当您onDone从接收UtteranceProgressListener到将合成文件传递到媒体播放器服务或exoplayer(提供此类侦听器)的方法时,跟踪或操作事件会更容易一些,例如开始、恢复、暂停和停止。


推荐阅读