swift -- 系统语音识别(转文字)

文章目录

  • 一、系统类
    • [1. 导入系统库](#1. 导入系统库)
    • [2.` SFSpeechRecognizer`声音处理器](#2. SFSpeechRecognizer声音处理器)
    • [3. `SFSpeechAudioBufferRecognitionRequest` 语音识别器](#3. SFSpeechAudioBufferRecognitionRequest 语音识别器)
    • [4. `AVAudioEngine` 处理声音的数据](#4. AVAudioEngine 处理声音的数据)
    • [5. `SFSpeechRecognitionTask` 语言识别任务管理器](#5. SFSpeechRecognitionTask 语言识别任务管理器)
  • 二、代码整理
    • [1. 初始化属性](#1. 初始化属性)
    • [2. 判断权限](#2. 判断权限)
    • [3. 开始语音识别](#3. 开始语音识别)
    • [4. 停止语音识别](#4. 停止语音识别)
    • [5. 调用方法](#5. 调用方法)

系统语音识别API,支持iOS10级以上的版本,需要麦克风权限和语音识别权限。

一、系统类

1. 导入系统库

复制代码
import Speech

2. SFSpeechRecognizer声音处理器

复制代码
SFSpeechRecognizer(locale: Locale(identifier: "zh-CN"))

根据传入的语言简称来返回一个声音处理器

3. SFSpeechAudioBufferRecognitionRequest 语音识别器

复制代码
  lazy var recognitionRequest: SFSpeechAudioBufferRecognitionRequest = {
        let recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
        // 结果报告
        recognitionRequest.shouldReportPartialResults = true
        return recognitionRequest
    }()

4. AVAudioEngine 处理声音的数据

复制代码
    private let audioEngine = AVAudioEngine()

5. SFSpeechRecognitionTask 语言识别任务管理器

启用和关闭任务

复制代码
speechTask = speechRecognizer.recognitionTask(with: recognitionRequest) { (speechResult, error) in
}
speechTask?.cancel()

二、代码整理

1. 初始化属性

复制代码
// 声音处理器
    private var speechRecognizer: SFSpeechRecognizer?
    // 语言识别任务管理器
    private var speechTask: SFSpeechRecognitionTask?
    // 语音识别器
    lazy var recognitionRequest: SFSpeechAudioBufferRecognitionRequest = {
        let recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
        // 结果报告
        recognitionRequest.shouldReportPartialResults = true
        return recognitionRequest
    }()
    
    // 处理声音数据
    private let audioEngine = AVAudioEngine()

2. 判断权限

复制代码
// 判断语音识别权限
    private func checkRecognizerAuthorization(_ recongStatus: @escaping (_ resType: Bool) -> Void) {
        let authorStatus = SFSpeechRecognizer.authorizationStatus()
        if authorStatus == .authorized {
            recongStatus(true)
        } else if authorStatus == .notDetermined {
            SFSpeechRecognizer.requestAuthorization { (status) in
                if status == .authorized {
                    recongStatus(true)
                } else {
                    recongStatus(false )
                }
            }
        } else {
            recongStatus(false)
        }
    }
    
    // 检测麦克风
    private func checkmicroPhoneAuthorization(_ authoStatus: @escaping (_ resultStatus: Bool) -> Void) {
        let microPhoneStatus = AVCaptureDevice.authorizationStatus(for: .audio)

        if microPhoneStatus == .authorized {
            authoStatus(true)
        } else if microPhoneStatus == .notDetermined {
            AVCaptureDevice.requestAccess(for: .audio, completionHandler: {(res) in
                if res {
                    authoStatus(true)
                } else {
                    authoStatus(false)
                }
            })
        } else {
            authoStatus(false)
        }
    }

3. 开始语音识别

复制代码
// 开始进行
    private func startDictating() {
        self.speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "zh-CN"))
        guard let speechRecognizer = self.speechRecognizer else {
            GXAlertManager.showDefaultAlert(title: "温馨提示", msg: "抱歉,暂不支持当前地区使用语音输入")
            return
        }
        let audioSession = AVAudioSession.sharedInstance()
        
        do {
            try audioSession.setCategory(.record)
            try audioSession.setMode(.measurement)
            try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
        } catch {
            fatalError("会话建立失败")
        }
        setStatusCallBack(type: .start, text: nil)
        do {
            try audioEngine.start()
            // 开启授权任务
            speechTask = speechRecognizer.recognitionTask(with: recognitionRequest) { (speechResult, error) in
                // 识别结果,识别后的操作
                guard let speechResult = speechResult, error == nil else {
                    return
                }
                self.setStatusCallBack(type: .finished, text: speechResult.bestTranscription.formattedString)
            }
        } catch {
            print(error)
            self.setStatusCallBack(type: .finished, text: nil)
        }
    }

4. 停止语音识别

复制代码
// 停止声音处理器,停止语音识别请求进程
    func stopDictating() {
        setStatusCallBack(type: .stop, text: nil)
        recognitionRequest.endAudio()
        audioEngine.stop()
        speechTask?.cancel()
    }

5. 调用方法

复制代码
func startSpeech() {
        
        checkmicroPhoneAuthorization { (microStatus) in
            guard microStatus == true else {
                // 麦克风没有授权
                GXAlertManager.showDefaultAlert(title: "温馨提示", msg: "您已取消授权使用麦克风,如果需要使用语音识别功能,可以到设置中重新开启!")
                self.setStatusCallBack(type: .authDenied, text: nil)
                return
            }
            self.checkRecognizerAuthorization { recStatus in
                guard recStatus == true else {
                    GXAlertManager.showDefaultAlert(title: "温馨提示", msg: "您已取消授权使用语音识别,如果需要使用语音识别功能,可以到设置中重新开启!")
                    self.setStatusCallBack(type: .authDenied, text: nil)
                    return
                }
                // 初始化语音处理器的输入模式 语音处理器准备就绪(会为一些audioEngine启动时所必须的资源开辟内存)
                let inputNode = self.audioEngine.inputNode
                
                self.audioEngine.prepare()
                if self.speechTask?.state == .running {   // 如果当前进程状态是进行中
                    // 停止语音识别
                   self.stopDictating()
                } else {   // 进程状态不在进行中
                    // 开启语音识别
                    self.startDictating()
                }
            }
        }
    }
相关推荐
不会飞的鲨鱼16 小时前
腾讯语音识别 一句话识别python接口
人工智能·python·语音识别
Koma_zhe19 小时前
【文本转语音工具VibeVoice】告别单调配音,VibeVoice+cpolar 让多角色音频创作随时随地搞定
linux·人工智能·ai·音视频·语音识别
开开心心_Every2 天前
文件数量统计工具:支持多层文件夹数量统计
游戏·微信·pdf·excel·语音识别·swift·lisp
蚍蜉撼树谈何易2 天前
二、ctc基础--待完善
学习·语音识别
博思云为2 天前
企业级智能PPT生成:Amazon云+AI驱动,全流程自动化提效
人工智能·语言模型·云原生·数据挖掘·云计算·语音识别·aws
geffen16882 天前
支持语音识别并控制的混合高清矩阵:革新视听体验,开启智能控制新时代
人工智能·矩阵·语音识别
小明_GLC3 天前
智能语音助手项目
开源·语音识别
Mixtral3 天前
2026年面试记录转写工具深度测评:3款工具准确率与效率对比
人工智能·面试·职场和发展·语音识别·语音转文字
HySpark4 天前
基于语音转文字与语义分析的智能语音识别技术
人工智能·语音识别
开开心心_Every4 天前
图片批量压缩工具:支持有损无损两种模式
python·游戏·微信·django·pdf·excel·语音识别