Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 语音识别会话崩溃_Ios_Swift_Avaudiosession_Avaudioengine_Sfspeechrecognizer - Fatal编程技术网

Ios 语音识别会话崩溃

Ios 语音识别会话崩溃,ios,swift,avaudiosession,avaudioengine,sfspeechrecognizer,Ios,Swift,Avaudiosession,Avaudioengine,Sfspeechrecognizer,我知道已经有人问过类似的问题,但提出的解决方案对我没有帮助 在我的应用程序中,我必须识别用户的语音,并将文本合成语音。问题是,当应用程序尝试识别时(特别是在文本到语音之后,但在其他情况下:例如,在第二次识别尝试时),我会随机崩溃 我有一个特殊的类Speecher,有几个明显的变量(一些是私有的)和两个主要功能:startRecord和killRecord func startRecord() { session = AVAudioSession.sharedInstance()

我知道已经有人问过类似的问题,但提出的解决方案对我没有帮助

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

我有一个特殊的类Speecher,有几个明显的变量(一些是私有的)和两个主要功能:
startRecord
killRecord

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错误。看起来是这样的:

代码中的问题字符串似乎是
inputNode=audioEngine.inputNode
,但我不知道如何解决它。就在
inputNode=audioEngine.inputNode
之前,我已经尝试了
audioEngine.inputNode.removeTap(onBus:0)
,但没有效果