语音识别系统是基于系统的speech.framework来实现的
1.首先,获取权限
在Info.plist文件中,加入这两项权限
// Privacy - Speech Recognition Usage Description 录音权限
// Privacy - Microphone Usage Description 话筒权限
申请权限
// case notDetermined = 0
// case denied = 1
// case restricted = 2
// case authorized = 3
SFSpeechRecognizer.requestAuthorization { [weak self](status) in
}
2. 基本类
private let audioEngine = AVAudioEngine() // 录音引擎
private let speechRecognizer = SFSpeechRecognizer(locale: Locale.init(identifier: "zh-CN")) // 录音识别器,初始化识别的语言
private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest? // 录音识别请求
3. 开启识别任务
功能完善:开启录音后,可以做一个一秒的定时器,作为一句话的停顿后回调,一秒后停止录音,isFinal为true,为true时回调说话的内容,否则,录音回调的isFinal一直未false,不知道何时录音结束,何时回调。
self.recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
self.recognitionRequest?.shouldReportPartialResults = true // 实时翻译
self.speechRecognizer?.recognitionTask(with: self.recognitionRequest!, resultHandler: { [weak self] (result, error) in
guard let isFinal = result?.isFinal, error == nil else {
self?.logWithMessage(message: "录音出错:\(error?.localizedDescription ?? "识别出错")")
// 如果想要一直录音,在录音冷却时间会抛出异常,抛出异常后,先停止再开启
self?.stopRecording()
self?.startRecording()
return
}
let content: String = result?.bestTranscription.formattedString ?? ""
let message = "完成识别标识\(isFinal), 识别信息:\(content)"
self?.logWithMessage(message: message)
if isFinal == true {
self?.delegate?.speechRecognizer(content: content)
self?.startRecording()
return
}
self?.listeningAudioTimer()
})
let recordingFormat = self.audioEngine.inputNode.outputFormat(forBus: 0)
self.audioEngine.inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { [weak self](buffer, _) in
self?.recognitionRequest?.append(buffer)
}
self.audioEngine.prepare()
try? self.audioEngine.start()
4.停止录音
self.audioEngine.inputNode.removeTap(onBus: 0)
self.audioEngine.stop()
self.recognitionRequest?.endAudio()
self.recognitionRequest = nil
注意:亲测!!开启录音引擎,只能开启一次,再次调用之前需先停止,再次调用开启,否则self.audioEngine.inputNode.installTap方法会抛出异常