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

文章目录

  • 一、系统类
    • 1. 导入系统库
    • 2.` SFSpeechRecognizer`声音处理器
    • 3. `SFSpeechAudioBufferRecognitionRequest` 语音识别器
    • 4. `AVAudioEngine` 处理声音的数据
    • 5. `SFSpeechRecognitionTask` 语言识别任务管理器
  • 二、代码整理
    • 1. 初始化属性
    • 2. 判断权限
    • 3. 开始语音识别
    • 4. 停止语音识别
    • 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 = truereturn 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 = truereturn 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) inif 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) inif 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) inguard microStatus == true else {// 麦克风没有授权GXAlertManager.showDefaultAlert(title: "温馨提示", msg: "您已取消授权使用麦克风,如果需要使用语音识别功能,可以到设置中重新开启!")self.setStatusCallBack(type: .authDenied, text: nil)return}self.checkRecognizerAuthorization { recStatus inguard recStatus == true else {GXAlertManager.showDefaultAlert(title: "温馨提示", msg: "您已取消授权使用语音识别,如果需要使用语音识别功能,可以到设置中重新开启!")self.setStatusCallBack(type: .authDenied, text: nil)return}// 初始化语音处理器的输入模式 语音处理器准备就绪(会为一些audioEngine启动时所必须的资源开辟内存)let inputNode = self.audioEngine.inputNodeself.audioEngine.prepare()if self.speechTask?.state == .running {   // 如果当前进程状态是进行中// 停止语音识别self.stopDictating()} else {   // 进程状态不在进行中// 开启语音识别self.startDictating()}}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/705013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器权限:Error: EACCES: permission denied, open‘/Cardiac/uniquC.csv

背景: 我想在服务器上传一个文件uniquC.csv,但是服务器说我没有权限 解决方案: 1. 查看目前是否存在对文件夹的权限 ls -ld /Cardiac/ # your fold path 此时,我发现 这也意味着root也没有赋予写的权限。 2. 拿到root权限 …

关于Ajax的入门基础教学

AJAX概述 AJAX(Asynchronous JavaScript and XML)是一种用于创建交互式网页应用程序的技术,它可以在不重新加载整个页面的情况下向服务器发送请求并接收响应。这种技术使得网页可以实现异步通信,提高了用户体验和页面的响应速度。…

Kotlin多线程

目录 线程的使用 线程的创建 例一:创建线程并输出Hello World Thread对象的用法 start() join() interrupt() 线程安全 原子性 可见性 有序性 线程锁 ReentrantLock ReadWriteLock 线程的使用 Java虚拟机中的多线程可以1:1映射至CPU中,即…

ARM 版银河麒麟桌面系统下 Qt 开发环境搭建指南

目录 前言安装Linux ARM 版 QtCreator配置 Qt Creator配置构建套件 第一个麒麟 Qt 应用程序小结 前言 在上一篇文章信创ARM架构QT应用开发环境搭建中建议大家使用 Ubuntu X86 系统作为信创 ARM 架构 QT 应用的开发环境,里面使用了交叉编译的方式。这对于自己的 Qt …

vue3 + vite + ts 中使用less文件全局变量

文章目录 安装依赖新建css变量文件全局引入css变量文件使用css变量 一、安装依赖 npm install less less-loader --save-dev 二、新建CSS变量文件 (1) :在根目录下的src文件中 src-> asset -> css ->glibal.less // glibal.less :root{--public_background_font_Col…

Dubbo知识点大全

“ 分布式应用场景有高并发,高可扩展和高性能的要求。还涉及到,序列化/反序列化,网络,多线程以及设计模式的问题。幸好 Dubbo 框架将上述知识进行了封装,让程序员能够把注意力放到业务上。 概念和架构 Provider:暴露服务的服务提供方Consumer:调用远程服务消费方Regist…

CUDA编程 - 用向量化访存优化 elementwise 核函数 - 学习记录

Cuda elementwise 一、简介1.1、ElementWise1.2、 float4 - 向量化访存 二、实践2.1、如何使用向量化访存2.2、Cuda elementwise - Add2.3、Cuda elementwise - Sigmoid2.3.1、简单的 Sigmoid 函数2.3.2、ElementWise Sigmoid float4(向量化访存) 2.4、C…

商家入驻平台怎么让资金自动分配给商家

最近很多上线了多商户电商系统的朋友咨询,我们平台的用户支付后,钱进入了我们的对公账户,怎样让钱在走完流程后,自动进入商家的账户呢?今天商淘云为您分享商户入驻平台自动分配给商家资金的三种方法。 首先是平台应建立…

Docker基础(一)

文章目录 1. 基础概念2. 安装docker3. docker常用命令3.1 帮助命令3.2 镜像命令3.3 容器命令3.4 其他命令 4. 使用案例 1. 基础概念 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官…

node14下运行项目报错:regeneratorRuntime is not defined

regeneratorRuntime is not defined,这是由于配置babel出错问题,由于使用了es7语法如async/await而当前babel版本过低 解决: npm install -D babel-plugin-transform-runtime babel-runtime 安装完成后在.babelrc文件下配置: &qu…

vue2与vue3的diff算法有什么区别

在 Vue 中,虚拟 DOM 是一种重要的概念,它通过将真实的 DOM 操作转化为对虚拟 DOM 的操作,从而提高应用的性能。Vue 框架在虚拟 DOM 的更新过程中采用了 Diff 算法,用于比较新旧虚拟节点树,找出需要更新的部分&#xff…

远程连接Redis

以连接阿里云上的Redis为例 1. 在阿里云安全组中开放端口 2.修改Redis启动时所用的配置文件(redis.conf) 2.1 修改ip地址 如图:将默认的本地ip bind 127.0.0.1地址改为bind 0.0.0.0 2.2 将保护模式关闭 将默认的 supervised yes 改为 n…

Transformer视频理解学习的笔记

今天复习了Transformer,ViT, 学了SwinTransformer, 还有观看了B站视频理解沐神系列串讲视频上(24.2.26未看完,明天接着看) 这里面更多论文见:https://github.com/mli/paper-reading/ B站视频理解沐神系列串讲视频下(明天接着看&a…

QPair和QMap

QPair和QMap是Qt框架中用于不同目的的两种容器类型,它们各自有不同的使用场景和特点。 QPair QPair是一个模板类,用于存储一对值,这对值可以是任意类型。它类似于C标准库中的std::pair。QPair通常用于当函数需要返回两个值时或者需要将两个…

认证模式~

认证方式 基于Cookie和Session的认证方式 基于Cookie和Session的认证是传统的Web应用认证机制。它依赖于HTTP协议无状态的特性,在客户端(浏览器)和服务器之间保持用户的状态。 工作原理 用户登录:用户通过输入用户名和密码来登…

速盾网络:组建CDN服务器加速

在当前互联网时代,网站的速度对用户体验和搜索引擎排名至关重要。为了提升网站的访问速度和性能,越来越多的网站选择使用CDN(内容分发网络)服务。本文将介绍如何利用速盾网络来组建CDN服务器,以加速网站访问。 1. 选择…

Spring Boot:全面解析现代微服务构建利器

Spring Boot 是基于 Java 平台的开源框架,它通过提供一系列标准化的快速开发和部署功能,彻底革新了传统 Spring 应用程序的创建与管理方式。自2014年发布以来,Spring Boot 已经成为构建企业级、云原生以及微服务架构应用的首选工具之一&#…

嵌入式C语言(三)

typeof() 使用typeof可以获取一个变量或表达式的类型。 typeof的参数有两种形式:表达式或类型。 int i;typeof(i) j 20; --> int j 20;typeof(int *) a; -->int *a; int f(); -->typeof(f()) k;--? int k我们可以看出通过typeof获取一个变量的…

合并spark structured streaming处理流式数据产生的小文件

备注: By 远方时光原创,可转载,不能复制到其他平台 背景:做流批一体,湖仓一体的大数据架构,常见的做法就是 数据源->spark Streaming->ODS(数据湖)->spark streaming->…

Vue 实现页面导出A4标准大小的PDF文件,以及处理图片跨域不能正常展示的问题等

效果预览: 代码流程:首先在utils文件夹下创建htmlToPdf的js工具文件,然后在main.js中注册引用 htmlToPdf.js // 导出页面为PDF格式 import html2Canvas from html2canvas import JsPDF from jspdfexport default {install(Vue, options) {V…