在继续与speech.framework交谈时,我遇到了崩溃,并且在AVAudio引擎出现空值的情况下崩溃。
*由于未捕获异常‘com.apple.coreaudio o.avfaudio’,正在终止应用程序,原因:‘必需的条件为false: nullptr == Tap()’
这是由于在某些情况下我的AudioEngine获得了null。
下面是我的StartRecording函数代码:
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的情况?
有人在这方面给我指点吗?
提前感谢!
发布于 2020-09-20 06:58:10
我也有这个问题,添加audioEngine.inputNode.removeTap(onBus: 0)为我解决了这个问题。
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
}发布于 2018-10-15 05:49:52
正在传递installTap的非nil格式。仅当连接到未连接到另一个节点的输出总线时,才应执行此操作;否则将导致错误。指定总线上的分接和连接格式(如果非nil)应相同。否则,后面的操作将覆盖任何先前设置的格式。
https://stackoverflow.com/questions/45982930
复制相似问题