android - 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,
""
);
解决方案
您听到重复相同值的原因是该speak
方法不会等到语音合成完成后才返回。从文档:
该方法是异步的,即该方法只是将请求加入到 TTS 请求队列中然后返回。在此方法返回时,合成可能尚未完成(甚至开始!)。
这意味着当您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
,它将继续排队等待稍后再次运行。