Я реализовал распознавание речи, чтобы управлять приложением на основе команд.
Но, поскольку пользователь пытается непрерывно запускать распознавание речи в течение небольшого времени (менее 1 минуты), происходит сбой приложения с сообщением об ошибке: - libc ++ abi.dylib: завершается с невостребованным исключением типа NSException
Приложение падает только тогда, когда пользователь делает это очень быстро.
При обычной попытке запускаон работает нормально.
Не могу выяснить причину.
**
**
Начать речь: - /// Начать распознавание голоса
*
func startListening() {
if AVAudioSession.sharedInstance().category == AVAudioSessionCategorySoloAmbient
{
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(AVAudioSessionCategoryRecord)
try audioSession.setMode(AVAudioSessionModeMeasurement)
try audioSession.setActive(true, with: .notifyOthersOnDeactivation)
} catch {
print("audioSession properties weren't set because of an error.")
}
}
audioEngine = AVAudioEngine()
if !(audioEngine?.isRunning)! {
startRecording()
//print("start listening............")
}
}
*
/// Start recording/listening
private func startRecording() {
guard let audio_engine = self.audioEngine else {return}
if recognitionTask != nil {
recognitionTask?.cancel()
recognitionTask = nil
}
recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
let inputNode = audio_engine.inputNode
guard let recognitionRequest = recognitionRequest else {
// fatalError("Unable to create an SFSpeechAudioBufferRecognitionRequest object")
print("fatalError : Unable to create an SFSpeechAudioBufferRecognitionRequest object")
return
}
recognitionRequest.shouldReportPartialResults = true
recognitionTask = speechRecognizer?.recognitionTask(with: recognitionRequest, resultHandler: { (result, error) in
var isFinal = false
if result != nil {
if let transcript = result?.bestTranscription.formattedString{
self.speechResponse!(transcript,.authorized,nil)
}
isFinal = (result?.isFinal)!
}
if error != nil || isFinal {
audio_engine.stop()
inputNode.removeTap(onBus: 0)
self.recognitionRequest = nil
self.recognitionTask = nil
if self.isContinueListening == true{
self.startRecording()
}
}
})
let recordingFormat = inputNode.outputFormat(forBus: 0)
inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer, when) in
self.recognitionRequest?.append(buffer)
}
audio_engine.prepare()
do {
try audio_engine.start()
} catch {
print("audioEngine couldn't start because of an error")
}
}
Остановить распознавание речи: - /// Завершить распознавание голоса
func endListening() {
if AVAudioSession.sharedInstance().category != AVAudioSessionCategorySoloAmbient{
try? AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategorySoloAmbient )
try? AVAudioSession.sharedInstance().setActive(true)
}
if (audioEngine?.isRunning ?? false) {
audioEngine?.stop()
recognitionRequest?.endAudio()
if recognitionTask != nil {
recognitionTask?.cancel()
recognitionTask = nil
}
recognitionRequest = nil
audioEngine = nil
// print("end listening............")
}
}
Даже попытаться поставить некоторую задержку, но не повезло
Заранее спасибо!