我知道已经问过类似的问题,但是建议的解决方案对我没有帮助。
在我的应用中,我必须识别用户的语音并合成文本到语音。问题是,当应用尝试识别时(尤其是在文本到语音转换之后,但在其他情况下:例如在第二次识别尝试中),我会随机崩溃。
我有一个特殊的演讲者类,带有几个明显的var(某些私有)和两个主要功能: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
,但我不知道如何解决。我已经在audioEngine.inputNode.removeTap(onBus: 0)
之前尝试过inputNode = audioEngine.inputNode
,但无济于事。