我有一个应用程序在说话(使用AVSpeechSynthesizer
)和收听(使用AVAudioSession
)之间来回传递。
如果我允许说话自然停止(其短语的结尾),然后开始聆听,一切运作良好。但是如果我允许用户中断说话,那么在连续4次中断之后,语音sythnesizer将停止并显示错误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首先尝试停用,但文档说
如果有任何关联的音频对象,则停用会话将失败 (目前,如队列,转换器,播放器或录像机) 运行
当用户中断语音合成时,如何安全地停用音频会话?
答案 0 :(得分:4)
我今天遇到了这个问题,经过一番尝试后,我发现在停止合成器之前暂停它可以无误地停用音频会话。因此,这就是我的stopSpeaking()
方法的样子:
var synthesizer = AVSpeechSynthesizer()
....
func stopSpeaking() {
synthesizer.pauseSpeaking(at: .immediate)
synthesizer.stopSpeaking(at: .immediate)
}
顺便说一句,只有在边界为stopSpeaking(at:)
的情况下调用.immediate
时才会发生错误。如果方法以.word
作为参数,至少就我而言,停用音频会话不会导致错误。