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()
                }
            }
        }
    }
相关推荐
大熊猫侯佩7 小时前
SwiftUI 6.0(iOS 18)自定义容器值(Container Values)让容器布局渐入佳境(下)
swiftui·swift·apple
Blossom.1188 小时前
人工智能在智能教育中的创新应用与未来趋势
java·人工智能·深度学习·目标检测·机器学习·计算机视觉·语音识别
大熊猫侯佩10 小时前
用接地气的例子趣谈 WWDC 24 全新的 Swift Testing 入门(二)
单元测试·swift·apple
我现在不喜欢coding10 小时前
swift中的self,Self,Class(struct).Type让你头大了嘛?
ios·swift
不二狗10 小时前
每日算法 -【Swift 算法】查找字符串数组中的最长公共前缀
开发语言·算法·swift
不二狗10 小时前
每日算法 -【Swift 算法】将整数转换为罗马数字
开发语言·算法·swift
InternLM16 小时前
论文分类打榜赛Baseline:ms-swift微调InternLM实践
swift·internlm·书生
YungFan1 天前
SwiftUI-Markdown渲染
swiftui·swift