首页 > 解决方案 > KOTLIN - textToSpeech 重复

问题描述

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

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,
""
);

标签: androidloopskotlintext-to-speech

解决方案


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

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

Android 开发者文档

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

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

private val handler = Handler()

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

val delayMs = 2000

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

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


推荐阅读