首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在语音框架ios 10上继续转换时出现崩溃

在语音框架ios 10上继续转换时出现崩溃
EN

Stack Overflow用户
提问于 2017-08-31 21:40:29
回答 2查看 1.2K关注 0票数 1

在继续与speech.framework交谈时,我遇到了崩溃,并且在AVAudio引擎出现空值的情况下崩溃。

*由于未捕获异常‘com.apple.coreaudio o.avfaudio’,正在终止应用程序,原因:‘必需的条件为false: nullptr == Tap()’

这是由于在某些情况下我的AudioEngine获得了null

下面是我的StartRecording函数代码:

代码语言:javascript
复制
func startRecording(){

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

    let audioSession = AVAudioSession.sharedInstance()
    do{
        try audioSession.setCategory(AVAudioSessionCategoryRecord)
        try audioSession.setMode(AVAudioSessionModeSpokenAudio)
        try audioSession.setActive(true, with: .notifyOthersOnDeactivation)
    } catch {
        print("Audion session properies weren't set because of an error.")
    }

    recognizationRequest = SFSpeechAudioBufferRecognitionRequest()

    guard let inputNode = audioEngine.inputNode as AVAudioInputNode? else {
        fatalError("Audio engine has no input node")
    }

    guard let recognizationRequest = recognizationRequest else {
        fatalError("Unable to create an SFSpeechAudioBufferRecognizationRequest object.")
    }

    recognizationRequest.shouldReportPartialResults = true

    recognizationTask = speechRecognizer?.recognitionTask(with: recognizationRequest, resultHandler: { (result, error) in
        var isFinal = false

        if result != nil{
            self.txtViewSiriDetecation.text = result?.bestTranscription.formattedString
            isFinal = (result?.isFinal)!
        }

        if error != nil || isFinal {
            self.audioEngine.stop()
            inputNode.removeTap(onBus:0)

            self.recognizationRequest = nil
            self.recognizationTask = nil

            self.btnSiri.isEnabled = true

        }


    })

    let recordingFormat = inputNode.outputFormat(forBus: 0)
    inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer, when) in
        self.recognizationRequest?.append(buffer)
    }

    audioEngine.prepare()

    do {
        try audioEngine.start()
    } catch {
        print("audio engine couldn't start b'cus of an error.")
    }

    txtViewSiriDetecation.text = "Say something, I'm listening!"

}

如何克服这种获取NULL的情况?

有人在这方面给我指点吗?

提前感谢!

EN

回答 2

Stack Overflow用户

发布于 2020-09-20 06:58:10

我也有这个问题,添加audioEngine.inputNode.removeTap(onBus: 0)为我解决了这个问题。

代码语言:javascript
复制
  fileprivate func stopRecording() {
      recordingMic.isHidden = true
      audioEngine.stop()
      audioEngine.inputNode.removeTap(onBus: 0)
      recognitionRequest?.endAudio()
      recognitionTask?.cancel()

      self.detectSpeechButton.isEnabled = true
      self.detectSpeechButton.setTitle("Detect Speech", for: .normal)
      recordingMic.isHidden = true
      self.textView.isHidden = false
  }
票数 0
EN

Stack Overflow用户

发布于 2018-10-15 05:49:52

正在传递installTap的非nil格式。仅当连接到未连接到另一个节点的输出总线时,才应执行此操作;否则将导致错误。指定总线上的分接和连接格式(如果非nil)应相同。否则,后面的操作将覆盖任何先前设置的格式。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45982930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档