0

Video not playing after SpeechRecognizer. Not getting any error just stuck on AVPlayerViewController. I have stopped speechRecognizer also. then after I am trying to play video. The video perfectly plays before speechRecognizer.

Maybe that possible speechRecognizer is not stopping by this code. So, Maybe the problem is in stopRecording().

enter image description here

@IBAction func btnRecord(_ sender: Any) {
    player.pause()
    player.seek(to: CMTime.init(value: 0, timescale: player.currentTime().timescale))

    if self.audioEngine.isRunning {
        self.audioEngine.stop()
        self.recognitionRequest?.endAudio()
    }
    else {
        try! self.startRecording()
    }
}

private func startRecording() throws {

    // Cancel the previous task if it's running.
    if let recognitionTask = recognitionTask {
        recognitionTask.cancel()
        self.recognitionTask = nil
    }

    let audioSession = AVAudioSession.sharedInstance()
    try audioSession.setCategory(AVAudioSession.Category.record, mode: .default, options: [])
    try audioSession.setMode(AVAudioSession.Mode.measurement)
    try audioSession.setActive(true, options: .notifyOthersOnDeactivation)

    recognitionRequest = SFSpeechAudioBufferRecognitionRequest()

    let inputNode = audioEngine.inputNode
    //else { fatalError("Audio engine has no input node") }
    guard let recognitionRequest = recognitionRequest else { fatalError("Unable to created a SFSpeechAudioBufferRecognitionRequest object") }

    // Configure request so that results are returned before audio recording is finished
    recognitionRequest.shouldReportPartialResults = true

    // A recognition task represents a speech recognition session.
    // We keep a reference to the task so that it can be cancelled.
    recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest) { result, error in
        var isFinal = false

        if let result = result {
            self.text = result.bestTranscription.formattedString
            self.lblText.text = self.text
            isFinal = result.isFinal
        }

        if error != nil || isFinal {
            self.audioEngine.stop()
            inputNode.removeTap(onBus: 0)

            self.recognitionRequest = nil
            self.recognitionTask = nil
        }
    }

    let recordingFormat = inputNode.outputFormat(forBus: 0)
    inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in
        self.recognitionRequest?.append(buffer)
    }

    audioEngine.prepare()

    try audioEngine.start()
}

private func stopRecording() {
    audioEngine.stop()
    recognitionRequest?.endAudio()

    if let recognitionTask = recognitionTask {
        recognitionTask.cancel()
        self.recognitionTask = nil
    }
}

@IBAction func btnDonePopup(_ sender: Any) {
    self.stopRecording()
    self.playVideo()
}
Pramod Tapaniya
  • 1,228
  • 11
  • 30

1 Answers1

0

Please change audioSession.setCategory to default value:

    if error != nil || isFinal {
        self.audioEngine.stop()
        inputNode.removeTap(onBus: 0)

        self.recognitionRequest = nil
        self.recognitionTask = nil

        do {
            try audioSession.setCategory(.soloAmbient, mode: .measurement, options: [])
        } catch { }
    }
zmag
  • 7,825
  • 12
  • 32
  • 42