我有一个在说(使用AVSpeechSynthesizer
)和听(使用AVAudioSession
)之间来回移动的应用程序。
如果我允许讲话自然停止(词组的结尾),然后开始聆听,则一切正常。但是,如果我允许用户中断讲话,则连续(完全!)连续4次中断后,语音合成器将停止并显示错误Deactivating an audio session that has running I/O
。
这是我的AVSpeechSynthesizer
方法:
func speakMessage(theMessage: String) {
let synth = AVSpeechSynthesizer()
let utterance = AVSpeechUtterance(string: theMessage)
utterance.voice = AVSpeechSynthesisVoice(language: "en-US")
utterance.rate = 0.52
synth.speak(utterance)
}
func stopSpeaking() {
let synth = AVSpeechSynthesizer()
if synth.isSpeaking {
synth.stopSpeaking(at: .immediate)
let utterance = AVSpeechUtterance(string: "")
synth.speak(utterance)
synth.stopSpeaking(at: .immediate)
}
}
这是
AVAudioSession
方法,直到发生错误为止:private func startRecording() throws {
// Cancel the previous task if it's running.
if let recognitionTask = recognitionTask {
recognitionTask.cancel()
self.recognitionTask = nil
}
let audioSession = AVAudioSession.sharedInstance()
try audioSession.setCategory(AVAudioSessionCategoryRecord)
try audioSession.setActive(true, with: .notifyOthersOnDeactivation)
recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
...
我假设错误发生的地方是呼叫
try audioSession.setActive(true ..
-AVAudioSession首先尝试停用,但是文档说如果有任何关联的音频对象,则停用会话将失败
(例如队列,转换器,播放器或记录器)当前
跑步
当用户中断语音合成时,如何安全地停用音频会话?
最佳答案
我今天遇到了这个问题,经过一番试验后,我发现在停止合成器之前暂停它可以无误地停用音频会话。因此,这就是我的stopSpeaking()
方法的样子:
var synthesizer = AVSpeechSynthesizer()
....
func stopSpeaking() {
synthesizer.pauseSpeaking(at: .immediate)
synthesizer.stopSpeaking(at: .immediate)
}
顺便说一句,仅当使用
stopSpeaking(at:)
边界调用.immediate
时,才会发生错误。如果方法以.word
作为参数,至少就我而言,停用音频会话不会导致错误。关于ios - 在AVSpeechSynthesis和AVAudioSession之间交替,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48722346/