语音识别会话崩溃

时间:2019-09-19 17:14:38

标签: ios swift avaudiosession avaudioengine sfspeechrecognizer

我知道已经问过类似的问题,但是建议的解决方案对我没有帮助。

在我的应用中,我必须识别用户的语音并合成文本到语音。问题是,当应用尝试识别时(尤其是在文本到语音转换之后,但在其他情况下:例如在第二次识别尝试中),我会随机崩溃。

我有一个特殊的演讲者类,带有几个明显的var(某些私有)和两个主要功能:startRecordkillRecord

func startRecord() {

    session = AVAudioSession.sharedInstance()

    do {
        try session.setCategory(AVAudioSession.Category.playAndRecord, mode: .spokenAudio, options: [.defaultToSpeaker, .mixWithOthers])
    } catch {
        print("audio session \(error)")
        return
    }

    audioEngine = AVAudioEngine()

    inputNode = audioEngine.inputNode
    inputNode.removeTap(onBus: 0)
    let recordingFormat = inputNode.inputFormat(forBus: 0)

    recognitionRequest = SFSpeechAudioBufferRecognitionRequest()

    guard let recognitionRequest = recognitionRequest else { fatalError("Unable to create a SFSpeechAudioBufferRecognitionRequest object") }
    recognitionRequest.shouldReportPartialResults = true

    if #available(iOS 13, *) {
        recognitionRequest.requiresOnDeviceRecognition = true
    }

    inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { buffer, _ in
        self.recognitionRequest.append(buffer)
    }

    audioEngine.prepare()

    do {
        try audioEngine.start()
    } catch {
        return print("audio engine start error \(error)")
    }

    guard let myRecognizer = SFSpeechRecognizer() else {
        print("recognizer error")
        return
    }

    if !myRecognizer.isAvailable {
        print("Recognizer is not available right now error")
        return
    }

    recognitionTask = speechRecognizer?.recognitionTask(with: recognitionRequest, resultHandler: { result, error in
            if let result = result {

                let bestString = result.bestTranscription.formattedString
                print(bestString)
                self.speecherDelegate?.sendSpeechString(str: bestString)
            } else if let error = error {
                print("result error \(error)")
            }
        })

}

在我尝试使用文本到语音转换或想要取消/停止识别会话之前,将调用下一个功能:

func killRecord() {
    if recognitionRequest != nil {
        recognitionRequest.endAudio()
    }


    if audioEngine != nil {

        audioEngine.stop()

        if audioEngine.inputNode != nil {
            audioEngine.inputNode.removeTap(onBus: 0)
        }
    }

    if recognitionTask != nil {
        recognitionTask?.cancel()
    }

    if session != nil {

        do {
            try session.setCategory(AVAudioSession.Category.playback, mode: .spokenAudio, options: [.allowBluetooth, .allowBluetoothA2DP, .defaultToSpeaker, .mixWithOthers])
            try session.setActive(false, options: .notifyOthersOnDeactivation)
        } catch {
            print("switch audiosession error not nil \(error)")
            return
        }

    } else {
        session = AVAudioSession.sharedInstance()

        do {
            try session.setCategory(AVAudioSession.Category.playback, mode: .spokenAudio, options: [.allowBluetooth, .allowBluetoothA2DP, .defaultToSpeaker, .mixWithOthers])
            try session.setActive(false, options: .notifyOthersOnDeactivation)
        } catch {
            print("switch audiosession error \(error)")
            return
        }
    }
}

我得到很多的是lldb错误。看起来像这样:

enter image description here

代码中的问题字符串似乎是inputNode = audioEngine.inputNode,但我不知道如何解决。我已经在audioEngine.inputNode.removeTap(onBus: 0)之前尝试过inputNode = audioEngine.inputNode,但无济于事。

0 个答案:

没有答案