代码之家  ›  专栏  ›  技术社区  ›  Pramod Tapaniya

语音识别器后不播放视频

  •  0
  • Pramod Tapaniya  · 技术社区  · 7 年前

    语音识别器后未播放视频。没有收到任何错误,只是卡在了AVPlayerViewController上。我也停止了语音识别。然后在我尝试播放视频之后。视频在语音识别器前完美播放。

    也许说话人识别器并没有被这段代码阻止。所以,问题可能出在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()
    }
    
    0 回复  |  直到 7 年前
        1
  •  0
  •   zmag    6 年前

    请换衣服 audioSession.setCategory 要设置默认值:

        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 { }
        }
    
    推荐文章