Распознавание речи: сбой при быстром начале, окончании? - PullRequest
0 голосов
/ 24 ноября 2018

Я реализовал распознавание речи, чтобы управлять приложением на основе команд.

Но, поскольку пользователь пытается непрерывно запускать распознавание речи в течение небольшого времени (менее 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............")
    }
}

Даже попытаться поставить некоторую задержку, но не повезло

Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...