我有点卡住了。
这是我的代码:
let speaker = AVSpeechSynthesizer()
var playQueue = [AVSpeechUtterance]() // current queue
var backedQueue = [AVSpeechUtterance]() // queue backup
...
func moveBackward(_ currentUtterance:AVSpeechUtterance) {
speaker.stopSpeaking(at: .immediate)
let currentIndex = getCurrentIndexOfText(currentUtterance)
// out of range check was deleted
let previousElement = backedQueue[currentIndex-1]
playQueue.insert(previousElement, at: 0)
for utterance in playQueue {
speaker.speak(utterance) // error here
}
}
根据文档AVSpeechSynthesizer.stopSpeaking(at:)
:
Stopping the synthesizer cancels any further speech; in constrast with when the synthesizer is paused, speech cannot be resumed where it left off. Any utterances yet to be spoken are removed from the synthesizer’s queue.
当我在 AVSpeechSynthesizer
队列中插入 AVSpeechUtterance 时,我总是收到错误(AVSpeechUtterance 不得排队两次)。但根据医生的说法,它应该停止。
最佳答案
当玩家停止时,话语肯定会从队列中删除。
但是,在您的 moveBackward
中函数,您插入另一个 AVSpeechUterrance
在playQueue[0]
其完整数组代表玩家队列。
假设停止发生在currentIndex = 2
,以下快照证明同一个对象在队列中注入(inject)了两次:
不幸的是,正如系统所指示的,AVSpeechUtterance 不应排队两次,而这正是您在这里所做的:playQueue 索引 0 和 2 处的对象具有相同的内存地址强>.
在索引 0 处插入新对象后的最后一个循环要求语音合成器将所有话语放入其全新队列中...其中两个是相同的。
而不是复制 playedQueue
进入backedQueue
(它们的对象都包含相同的内存地址)或者在两个数组中附加相同的话语,我建议创建不同的话语实例,如下所示:
for i in 1...5 {
let stringNb = "number " + String(i) + " of the speech synthesizer."
let utterance = AVSpeechUtterance(string: stringNb)
playQueue.append(utterance)
let utteranceBis = AVSpeechUtterance(string: stringNb)
backedQueue.append(utteranceBis)
}
按照这条建议,您不应遇到错误 AVSpeechUtterance 不得排队两次。
关于ios - AVSpeechSynthesizer错误: An AVSpeechUtterance shall not be enqueued twice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53606746/