【问题标题】:KOTLIN - textToSpeech repeatKOTLIN - textToSpeech 重复
【发布时间】:2021-07-29 04:29:47
【问题描述】:

我想知道一旦我打开文本到语音,文本到语音是否有可能不断读取值

currentItem.percent
           

这个值会不断更新,所以我希望每个新值都能被大声读出

 tts = TextToSpeech(Context, TextToSpeech.OnInitListener { status ->

                    if (status != TextToSpeech.ERROR) // if no error set language
                        tts.language = Locale.UK


                    tts.speak(
                        currentItem.percent.toString(),
                        TextToSpeech.QUEUE_ADD,
                        null,
                        ""
                    );

                    tts.speak(
                        currentItem.percent.toString(),
                        TextToSpeech.QUEUE_ADD,
                        null,
                        ""
                    );

上面的代码只是两次读取相同的百分比值?有关如何解决此问题的任何想法?

编辑

我也尝试过这个循环,但没有成功,应用程序没有读入新值,并且每次都继续说相同的值

    for (i in 0..6) {
tts.speak(
currentItem.percent.toString(),
TextToSpeech.QUEUE_ADD,
 null,
""
);

【问题讨论】:

    标签: android loops kotlin text-to-speech


    【解决方案1】:

    您听到重复相同值的原因是speak 方法不会等到语音合成完成后才返回。来自文档:

    该方法是异步的,即该方法只是将请求加入到 TTS 请求队列中然后返回。在此方法返回时,合成可能尚未完成(甚至开始!)。

    (Android developer docs)

    这意味着当您重复多次调用speak 时,您实际上只是多次将相同的值添加到队列中。

    相反,您需要做的是在每次调用speak 时引入一个短暂的延迟。一种方法是在您的活动中使用Handler

    private val handler = Handler()
    

    然后创建一个方法,该方法既可以读取当前值,又可以将新任务排队等待稍后再次读取:

    val delayMs = 2000
    
    fun speakCurrentValue() {
        tts.speak(
            currentItem.percent.toString(),
            TextToSpeech.QUEUE_ADD,
            null,
            ""
        )
        handler.postDelayed(Runnable { speakCurrentValue() }, delayMs)
    }
    

    现在,在您调用speakCurrentValue 之后,它会继续排队等待稍后再次运行。

    【讨论】:

    • 如果这是在片段中,代码是否相同?
    • 是的,您可以改为在片段中创建处理程序?
    • 我再次尝试了这段代码,当添加带有错误属性设置器或获取器的处理程序时,我应该在这里做什么
    猜你喜欢
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2020-08-28
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多