在 Swift 中使用 WillSpeakRange 委托中断 AVSpeechUtterance 和恢复
Interrupt AVSpeechUtterance and Resume Using WillSpeakRange Delegate in Swift
使用AVSpeechSynthesizer,如果一段话很长,我想提示用户是切断还是听完。
我正在跟踪 willSpeakRange 委托中的长度。
在某个时刻,我想暂停或停止演讲。然后询问用户是否继续
如果我在原始话语上使用合成器的暂停功能,它似乎不允许我用 "Do you want to hear to the end" 打断。
另一方面,如果我使用停止功能,它允许我询问 "Do you want to hear to the end" 但我们失去了原始话语中的位置。
如何暂停或停止原始话语,然后恢复或捕获剩余文本以开始有效完成原始话语的新话语。
这是我使用的代码:
let count = 0
func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, willSpeakRangeOfSpeechString characterRange: NSRange, utterance: AVSpeechUtterance) {
count = count+1
if (count==limit) {
count = 0
//Pause option does not seem to allow interjection
self.voice.pauseSpeaking(at: AVSpeechBoundary.immediate)
//stop option loses place
self.voice.stopSpeaking(at: .immediate)
//NEED TO CAPTURE UNSPOKEN TEXT IF I USE STOP OPTION
let speechString = utterance.speechString
let newRange = Range(characterRange, in: speechString)
//Store the remaining text to a variable
remainingText = ???
self.speakSomething(text:",,Should I stop or continue?")
}
If I use the Pause functionality of the synthesizer on the original utterance, it does not seem to allow me to interrupt with "Do you want to hear to the end".
pauseSpeaking
方法不会影响语音合成要说的 queue。只要你愿意,它就会暂停,并允许从你离开的地方继续,但是你不能在飞行中插入任何新的话语此时遵循这个模式。
On the other hand, if I use the Stop functionality, it allows me to ask "Do you want to hear to the end" but we lose the place in the original utterance.
stopSpeaking
方法 从合成器的 queue 中删除任何尚未说出的话语,这就是为什么您可以插入新话语但会丢失一切之前已经预定了。
How can I pause or stop the original utterance and then either resume or capture the remaining text to start a new utterance that effectively completes the original one.
根据我上面的解释,你别无选择,只能停止原话来问你的问题。我建议这种模式:
- 借助
AVSpeechSynthesizerDelegate
协议获取当前的语音。
- 触发
stopSpeaking
合成器方法,该方法将从 queue 中删除尚未说出的话语。
- 创建话语以提出选择问题并让合成器读出。
- 如果选择继续,请从在 1. 找到的位置创建一个新话语,直到文本结束,然后继续。
如果您不知道如何捕捉未说出的文本,请查看显示的 example (ObjC, Swift)粗体文本中的口语单词。
在此示例的委托方法中添加以下代码片段以捕获您剩余的文本:
func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer,
willSpeakRangeOfSpeechString characterRange: NSRange,
utterance: AVSpeechUtterance) {
let remainingText = utterance.speechString.dropFirst(characterRange.location)
//...
}
按照这些步骤,您可以在 Swift 中使用 WillSpeakRange Delegate 中断 AVSpeechUtterance 并恢复,如您的 post 标题中所述。
使用AVSpeechSynthesizer,如果一段话很长,我想提示用户是切断还是听完。
我正在跟踪 willSpeakRange 委托中的长度。
在某个时刻,我想暂停或停止演讲。然后询问用户是否继续
如果我在原始话语上使用合成器的暂停功能,它似乎不允许我用 "Do you want to hear to the end" 打断。
另一方面,如果我使用停止功能,它允许我询问 "Do you want to hear to the end" 但我们失去了原始话语中的位置。
如何暂停或停止原始话语,然后恢复或捕获剩余文本以开始有效完成原始话语的新话语。
这是我使用的代码:
let count = 0
func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, willSpeakRangeOfSpeechString characterRange: NSRange, utterance: AVSpeechUtterance) {
count = count+1
if (count==limit) {
count = 0
//Pause option does not seem to allow interjection
self.voice.pauseSpeaking(at: AVSpeechBoundary.immediate)
//stop option loses place
self.voice.stopSpeaking(at: .immediate)
//NEED TO CAPTURE UNSPOKEN TEXT IF I USE STOP OPTION
let speechString = utterance.speechString
let newRange = Range(characterRange, in: speechString)
//Store the remaining text to a variable
remainingText = ???
self.speakSomething(text:",,Should I stop or continue?")
}
If I use the Pause functionality of the synthesizer on the original utterance, it does not seem to allow me to interrupt with "Do you want to hear to the end".
pauseSpeaking
方法不会影响语音合成要说的 queue。只要你愿意,它就会暂停,并允许从你离开的地方继续,但是你不能在飞行中插入任何新的话语此时遵循这个模式。
On the other hand, if I use the Stop functionality, it allows me to ask "Do you want to hear to the end" but we lose the place in the original utterance.
stopSpeaking
方法 从合成器的 queue 中删除任何尚未说出的话语,这就是为什么您可以插入新话语但会丢失一切之前已经预定了。
How can I pause or stop the original utterance and then either resume or capture the remaining text to start a new utterance that effectively completes the original one.
根据我上面的解释,你别无选择,只能停止原话来问你的问题。我建议这种模式:
- 借助
AVSpeechSynthesizerDelegate
协议获取当前的语音。 - 触发
stopSpeaking
合成器方法,该方法将从 queue 中删除尚未说出的话语。 - 创建话语以提出选择问题并让合成器读出。
- 如果选择继续,请从在 1. 找到的位置创建一个新话语,直到文本结束,然后继续。
如果您不知道如何捕捉未说出的文本,请查看显示的 example (ObjC, Swift)粗体文本中的口语单词。
在此示例的委托方法中添加以下代码片段以捕获您剩余的文本:
func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer,
willSpeakRangeOfSpeechString characterRange: NSRange,
utterance: AVSpeechUtterance) {
let remainingText = utterance.speechString.dropFirst(characterRange.location)
//...
}
按照这些步骤,您可以在 Swift 中使用 WillSpeakRange Delegate 中断 AVSpeechUtterance 并恢复,如您的 post 标题中所述。