Swift - 不谈话时停止语音识别[iOS 10]

时间:2017-07-06 14:18:21

标签: ios swift speech-recognition sirikit

我正在开发一个应用程序,该应用程序使用ios 10中的新语音框架来执行一些语音到文本的内容。当用户停止说话时停止识别的最佳方法是什么?

private func startRecording() {
    isRecording = true
    if let recognitionTask = recognitionTask {
        recognitionTask.cancel()
        self.recognitionTask = nil
    }

    let audioSession = AVAudioSession.sharedInstance()

    do {
        try audioSession.setCategory(AVAudioSessionCategoryRecord, mode: AVAudioSessionModeMeasurement)
        try audioSession.setActive(true, with: .notifyOthersOnDeactivation)
    } catch {
        print("audioSession properties weren't set because of an error.")
        return
    }

    recognitionRequest = SFSpeechAudioBufferRecognitionRequest()

    guard let inputNode = audioEngine.inputNode else {
        fatalError("Audio engine has no input node")
    }

    guard let recognitionRequest = recognitionRequest else {
        fatalError("Unable to create an SFSpeechAudioBufferRecognitionRequest object")
    }

    recognitionRequest.shouldReportPartialResults = true

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

        if let result = result {
            if error != nil || result.isFinal {
                self.audioEngine.stop()
                inputNode.removeTap(onBus: 0)
                self.recognitionRequest = nil
                self.recognitionTask = nil
                let questionText = result.bestTranscription.formattedString                    
                isRecording = false
                self.audioEngine.stop()
                recognitionRequest.endAudio()
                self.audioEngine.inputNode?.removeTap(onBus: 0)

            }       
        }  
    })

    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() {
    isRecording = false
    audioEngine.stop()
    recognitionRequest?.endAudio()
    audioEngine.inputNode?.removeTap(onBus: 0)

}

0 个答案:

没有答案