我想知道,一旦我打开文本到演讲,文本到演讲就会不断地读取价值。
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,
""
);发布于 2021-07-28 19:37:37
您听到相同值重复的原因是因为speak方法不会等到语音合成完成后才返回。从医生那里:
该方法是异步的,即该方法只是将请求添加到TTS请求的队列中,然后返回。合成可能还没有完成(甚至还没有开始!)在此方法返回时。 (Android开发人员文档
这意味着,当您多次调用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之后,它将继续排队等待稍后再次运行。
https://stackoverflow.com/questions/68560048
复制相似问题