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()
                }
            }
        }
    }
相关推荐
东坡肘子3 小时前
完成 Liquid Glass 的适配了吗?| 肘子的 Swift 周报 #0102
swiftui·swift·apple
龙腾-虎跃13 小时前
FreeSWITCH FunASR语音识别模块
人工智能·语音识别·xcode
HarderCoder21 小时前
【Swift Concurrency】深入理解 `async let` 与 `TaskGroup`:并发任务的生命周期与错误传播机制
swift
HarderCoder21 小时前
深入理解 Swift Concurrency:从 async/await 到 Actor 与线程池的完整运行机制
swift
HarderCoder21 小时前
Swift 结构化并发 6 条铁律 —— 一张图 + 一套模板,让 `async let` / `TaskGroup` / `Task {}` 不再踩坑
swift
东方佑2 天前
从音频到Token:构建原神角色语音识别模型的完整实践
人工智能·音视频·语音识别
M-finder2 天前
Mac菜单栏综合工具FancyTool更新啦
mac·swift
一条数据库3 天前
南京方言数据集|300小时高质量自然对话音频|专业录音棚采集|方言语音识别模型训练|情感计算研究|方言保护文化遗产数字化|语音情感识别|方言对话系统开发
人工智能·音视频·语音识别
殷忆枫3 天前
基于STM32的智能语音识别饮水机系统设计
stm32·嵌入式硬件·语音识别
HarderCoder4 天前
在同步代码里调用 async/await:Task 就是你的“任意门”
swift