我有一个在说(使用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/

10-12 14:39