首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KOTLIN - textToSpeech重复

KOTLIN - textToSpeech重复
EN

Stack Overflow用户
提问于 2021-07-28 12:03:14
回答 1查看 251关注 0票数 1

我想知道,一旦我打开文本到演讲,文本到演讲就会不断地读取价值。

代码语言:javascript
复制
currentItem.percent

此值不断更新,因此我希望每个新值都被大声读出。

代码语言:javascript
复制
 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,
                        ""
                    );

上面的代码只读取两次相同的百分比值?有什么办法解决这个问题吗?

编辑

我也尝试了这个循环没有运气,应用程序不读取一个新的值,并继续说相同的值每次

代码语言:javascript
复制
    for (i in 0..6) {
tts.speak(
currentItem.percent.toString(),
TextToSpeech.QUEUE_ADD,
 null,
""
);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-28 19:37:37

您听到相同值重复的原因是因为speak方法不会等到语音合成完成后才返回。从医生那里:

该方法是异步的,即该方法只是将请求添加到TTS请求的队列中,然后返回。合成可能还没有完成(甚至还没有开始!)在此方法返回时。 (Android开发人员文档

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

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

代码语言:javascript
复制
private val handler = Handler()

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

代码语言:javascript
复制
val delayMs = 2000

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68560048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档