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