检测语音(TTS)何时真正完成

时间:2018-07-18 19:42:44

标签: android text-to-speech

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

            }

        })

1 个答案:

答案 0 :(得分:0)

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

  

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

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

通过使用synthesizeToFile而不是语音,以及从onDone收到UtteranceProgressListener方法将合成的文件传递到media player服务中,可以实现所需的功能或exoplayer(提供此类侦听器),在其中跟踪或操纵诸如开始,恢复,暂停和停止之类的事件要容易一些。