在AVSpeechSynthesis和AVAudioSession

时间:2018-02-10 15:26:16

标签: ios avaudiosession avspeechsynthesizer

我有一个应用程序在说话(使用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首先尝试停用,但文档说

  

如果有任何关联的音频对象,则停用会话将失败   (目前,如队列,转换器,播放器或录像机)   运行

当用户中断语音合成时,如何安全地停用音频会话?

1 个答案:

答案 0 :(得分:4)

我今天遇到了这个问题,经过一番尝试后,我发现在停止合成器之前暂停它可以无误地停用音频会话。因此,这就是我的stopSpeaking()方法的样子:

var synthesizer = AVSpeechSynthesizer()

....

func stopSpeaking() {
    synthesizer.pauseSpeaking(at: .immediate)
    synthesizer.stopSpeaking(at: .immediate)
}

顺便说一句,只有在边界为stopSpeaking(at:)的情况下调用.immediate时才会发生错误。如果方法以.word作为参数,至少就我而言,停用音频会话不会导致错误。