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()
                }
            }
        }
    }
相关推荐
烟雨江南78516 小时前
大型展会和行业活动如何做实时字幕?——灵声智库多会场流式 ASR、统一转写与内容沉淀实践
人工智能·语音识别·ai客服·企业agent
烟雨江南78517 小时前
医院门诊医患沟通如何实时转写?——灵声智库流式 ASR、医学术语与双角色记录实践
人工智能·语音识别·agent
极创信息1 天前
系统安全隐患全方位排查方案:标准化渗透测试全流程
java·opencv·struts·数据挖掘·eclipse·语音识别·hibernate
浪潮BB机2 天前
2026飞书妙记与通义听悟会议录音转写工具实测横评
飞书·语音识别·效率工具·ai工具·录音转写·会议纪要
Generalzy2 天前
Whisper + VAD + TTS:一套完整的 Python 本地语音处理流水线
python·whisper·语音识别
怪奇云呼军2 天前
从声音特征到 CRM 回流:闪电智能 Voice Agent 沟通策略自适应系统 v1 实战
android·人工智能·python·音视频·语音识别
leoZ2312 天前
Vue3 还原一个企业级后台-06-主布局设计
人工智能·opencv·机器学习·计算机视觉·数据挖掘·语音识别·caffe
大熊猫侯佩3 天前
Xcode 预览新升级:arguments 让界面调试井井有条
swiftui·xcode·swift
2501_931819703 天前
黎语标注的方言标注,行业到现在没有统一标准
语音识别
江畔柳前堤3 天前
LLM 训练核心机制深度解析:Warmup、Cosine Decay 与 Perplexity 的完整知识体系
网络·人工智能·深度学习·算法·机器学习·语音识别