5

I am repeatedly getting this error message when I tap the reset button for my app with speech recognition. It only happens if I tap the button while the app is actively listening for speech recognition. The app looks like it is still recording, but it won't take in any more input. It also won't let me stop recording. Code below.

@IBAction func resetTapped(_ sender: Any) {

    if audioEngine.isRunning {

        audioEngine.stop()
        recognitionRequest?.endAudio()

    }

    globalVariables.tempText = ""
    globalVariables.finalText = ""
    globalVariables.boolRecording = false

    self.inView.text = ""
    self.resultView.text = ""

    inView.backgroundColor = UIColor.red

}

private let speechRecognizer = SFSpeechRecognizer(locale: Locale.init(identifier: "en-US"))
private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest?
private var recognitionTask: SFSpeechRecognitionTask?
private let audioEngine = AVAudioEngine()

func startRecording() -> String {

    self.inView.text = ""

    if recognitionTask != nil {

        recognitionTask?.cancel()
        recognitionTask = nil

    }

    let audioSession = AVAudioSession.sharedInstance()

    do {

        try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
        try audioSession.setMode(AVAudioSessionModeMeasurement)
        try audioSession.setActive(true, with: .notifyOthersOnDeactivation)

    } catch {

        print("audioSession properties weren't set because of an error.")

    }

    recognitionRequest = SFSpeechAudioBufferRecognitionRequest()

    guard let recognitionRequest = recognitionRequest else {

        fatalError("Unable to create an SFSpeechAudioBufferRecognitionRequest object")

    }

    recognitionRequest.shouldReportPartialResults = true

    recognitionTask = speechRecognizer?.recognitionTask(with: recognitionRequest, resultHandler: { (result, error) in

        var isFinal = false

        if result != nil {

            if globalVariables.boolRecording == true {

                self.inView.text = result?.bestTranscription.formattedString
                globalVariables.tempText = self.spaceChanges(String: self.recordingChanges(String: self.inView.text))
                self.resultView.text = globalVariables.finalText + globalVariables.tempText

            }

            isFinal = (result?.isFinal)!

        }

        if error != nil || isFinal {

            self.audioEngine.stop()
            self.audioEngine.inputNode.removeTap(onBus: 0)

            self.recognitionRequest = nil
            self.recognitionTask = nil

        }

    })

    audioEngine.inputNode.removeTap(onBus: 0)

    let recordingFormat = audioEngine.inputNode.outputFormat(forBus: 0)

    audioEngine.inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer, when) in self.recognitionRequest?.append(buffer) }

    audioEngine.prepare()

    do {
        try audioEngine.start()
    } catch {
        print("audioEngine couldn't start because of an error.")
    }
    return self.inView.text
}
aequinox
  • 113
  • 1
  • 14

0 Answers0