iOS基于系统原生的语音识别助手

语音识别系统是基于系统的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方法会抛出异常

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值