在鸿蒙NEXT开发中实现一个语音识别组件

news/2025/3/20 17:38:52/文章来源:https://www.cnblogs.com/youlanjihua/p/18783528

鸿蒙系统发布以后都不知道叫它5.0版本还是NEXT版本了,哈哈,反正是最新版本就对了。
对于语音转换文字,鸿蒙系统提供了离线语音识别模型speechRecognizer,语种目前支持中文,识别效果非常不错。


今天要分享的是使用speechRecognizer实现一个语音识别组件。
要实现语音识别,首先要配置麦克风使用权限:

ohos.permission.MICROPHONE



然后我们要检查应用是否获取到了麦克风权限,这一步操作很多时候都会用到,所以为大家封装一个通用方法:

import { abilityAccessCtrl, bundleManager, common, Permissions } from '@kit.AbilityKit';export class PermissionManager {static checkPermission(permissions: Permissions[]): boolean {let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();let tokenID: number = 0;const bundleInfo =bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);tokenID = bundleInfo.appInfo.accessTokenId;if (permissions.length === 0) {return false;} else {return permissions.every(permission =>abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED ===atManager.checkAccessTokenSync(tokenID, permission));}}static async requestPermission(permissions: Permissions[]): Promise<boolean> {let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();let context: Context = getContext() as common.UIAbilityContext;const result = await atManager.requestPermissionsFromUser(context, permissions);return !!result.authResults.length && result.authResults.every(authResults => authResults === 0);}
}



语音识别的使用分为创建引擎、设置回调、开始监听几个步骤,同样为大家封装一个实体类:

import { speechRecognizer } from '@kit.CoreSpeechKit';class SpeechRecognizerManager {/*** 语种信息* 语音模式:长*/private static extraParam: Record<string, Object> = { "locate": "CN", "recognizerMode": "long" };private static initParamsInfo: speechRecognizer.CreateEngineParams = {/*** 地区信息* */language: 'zh-CN',/*** 离线模式:1*/online: 1,extraParams: this.extraParam};/*** 引擎*/private static asrEngine: speechRecognizer.SpeechRecognitionEngine | null = null/*** 录音结果*/static speechResult: speechRecognizer.SpeechRecognitionResult | null = null/*** 会话ID*/private static sessionId: string = "as" + Date.now()/*** 创建引擎*/private static async createEngine() {// 设置创建引擎参数SpeechRecognizerManager.asrEngine = await speechRecognizer.createEngine(SpeechRecognizerManager.initParamsInfo)}/*** 设置回调*/private static setListener(callback: (srr: speechRecognizer.SpeechRecognitionResult) => void = () => {}) {// 创建回调对象let setListener: speechRecognizer.RecognitionListener = {// 开始识别成功回调onStart(sessionId: string, eventMessage: string) {console.log('onstart')},// 事件回调onEvent(sessionId: string, eventCode: number, eventMessage: string) {},// 识别结果回调,包括中间结果和最终结果onResult(sessionId: string, result: speechRecognizer.SpeechRecognitionResult) {SpeechRecognizerManager.speechResult = resultcallback && callback(result)},// 识别完成回调onComplete(sessionId: string, eventMessage: string) {console.log('complete')},// 错误回调,错误码通过本方法返回// 如:返回错误码1002200006,识别引擎正忙,引擎正在识别中// 更多错误码请参考错误码参考onError(sessionId: string, errorCode: number, errorMessage: string) {console.log('error')},}// 设置回调SpeechRecognizerManager.asrEngine?.setListener(setListener);}/*** 开始监听* */static startListening() {// 设置开始识别的相关参数let recognizerParams: speechRecognizer.StartParams = {// 会话idsessionId: SpeechRecognizerManager.sessionId,// 音频配置信息。audioInfo: {// 音频类型。当前仅支持“pcm”audioType: 'pcm',// 音频的采样率。当前仅支持16000采样率sampleRate: 16000,// 音频返回的通道数信息。当前仅支持通道1。soundChannel: 1,// 音频返回的采样位数。当前仅支持16位sampleBit: 16},//   录音识别extraParams: {// 0:实时录音识别  会自动打开麦克风 录制实时语音"recognitionMode": 0,//   最大支持音频时长maxAudioDuration: 60000}}// 调用开始识别方法SpeechRecognizerManager.asrEngine?.startListening(recognizerParams);};/*** 取消识别*/static cancel() {SpeechRecognizerManager.asrEngine?.cancel(SpeechRecognizerManager.sessionId)}/*** 释放ai语音转文字引擎*/static shutDown() {SpeechRecognizerManager.asrEngine?.shutdown()}/*** 停止并且释放资源*/static async release() {SpeechRecognizerManager.cancel()SpeechRecognizerManager.shutDown()}/*** 初始化ai语音转文字引擎*/static async init(callback: (srr: speechRecognizer.SpeechRecognitionResult) => void = () => {}) {try {await SpeechRecognizerManager.createEngine()} catch (err) {console.log('err',JSON.stringify(err))}SpeechRecognizerManager.setListener(callback)SpeechRecognizerManager.startListening()}
}export default SpeechRecognizerManager



最后在需要使用的地方调用上面封装的方法就可以了:

const permissions: Permissions[] = ["ohos.permission.MICROPHONE"]// 检查是否拥有权限const isPermission = await PermissionManager.checkPermission(permissions)if (!isPermission) {//   如果没权限,就主动申请PermissionManager.requestPermission(permissions)}else {SpeechRecognizerManager.init(res => {console.log("实时语音识别", JSON.stringify(res))this.text = res.result})}

 

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

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

相关文章

激光代加工产品一览-代加工-外协加工-委外加工-激光代加工-河南郑州亚克力切割雕刻代加工-芯晨微纳(河南)

关键词:河南省郑州市、激光代加工、激光打标、激光切割、激光雕刻、激光打孔、激光毛化、激光分切 简介:芯晨微纳(河南)光电科技有限公司,专注于激光微纳代加工、设备/耗材代理销售、设备租赁、技术推广服务,可处理材料类型及应用范围十分广泛,欢迎来电咨询(韩经理1823…

20242801 2024-2025-2 《网络攻防实践》第4次作业

20242801 2024-2025-2 《网络攻防实践》第4次作业 一、实验内容 ​ 在虚拟机环境中完成TCP/IP协议栈重点协议的攻击实验,学习ARP缓存欺骗攻击、ICMP重定向攻击、SYN Flood攻击、TCP RST攻击、TCP会话劫持攻击的原理和相关知识,并动手进行实践。 二、实验过程 (一)ARP缓存欺…

缓存监控治理在游戏业务的实践和探索

通过对 Redis 和 Caffeine 的缓存监控快速发现和定位问题降低故障的影响面。作者:来自 vivo 互联网服务器团队- Wang Zhi 通过对 Redis 和 Caffeine 的缓存监控快速发现和定位问题降低故障的影响面。 一、缓存监控的背景游戏业务中存在大量的高频请求尤其是对热门游戏而言,而…

从零开始驯服Linux(一):ZYNQ-Linux启动文件构建全解析

从零开始驯服Linux(一):ZYNQ-Linux启动文件构建全解析 ZYNQ系列芯片集成了ARM处理器和FPGA(可编程逻辑单元),正是因为由于ARM处理器的存在,所以我们可以在ZYNQ系列芯片上面运行Linux系统。 在ZYNQ系列芯片上运行Linux会给我们带来很多优势:首先,我们可以将部分逻辑处理…

# 20241902 2024-2025-2 《网络攻防实践》第六周作业

1.实验内容 通过本周的学习和实践,学习使用metasploitable对windows进行远程的渗透测试实验;学习利用wireshark进行日志文件的分析和攻击取证,解读攻击者所利用的攻击、攻击者的具体操作以及如何对攻击行为进行防范;实践同一内网中对利用metasploitable对其他windows系统进…

gitlab+jenkins+harbor+k8s安装操作流程之rancher

关闭防火墙 systemctl stop firewalld yum安装依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 下载docker-ce.repo源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo 安装docker yum install…

win11优化pyenv-venv虚拟环境切换

问题 使用 pyenv-venv activate env_name 命令激活虚拟环境后无法使用tab自动完善命令无法上下键切换历史命令脚本 #!/usr/bin/bashvenvs="/d/JavaProgramFiles/pyenv-win/pyenv-win-venv/envs" # #!/bin/bashactivate () {# 设置 PATHORIGIN_PATH="${ORIGIN_P…

安装Harbor

环境:OS:Centos 7说明:需要docker和 docker compose[root@node1 data]# docker version Client: Docker Engine - CommunityVersion: 26.1.4API version: 1.45Go version: go1.21.11Git commit: 5650f9bBuilt: Wed Jun 5 11:32:04…

Linux学习路线

Linux 学习路线Linux 学习路线 by 程序员鱼皮💂 + 💻 = 👴🏽 建议先观看视频入门:https://www.bilibili.com/video/BV1ev411G7VE/ 为什么学 Linux? 相比于 Windows,Linux 免费、开源、安全、灵活、稳定、便于开发,所以更受企业青睐,甚至 90% 以上 的企业应用都是用…

【无问AI网络安全大模型】协助渗透测试挖掘sql注入

在日常工作中发现了一个登录框,话不多说,搞搞看看存不存在SQL注入。输入用户名密码开始抓包,可以看出用户名密码都进行了加密这个时候输入单引号,发现页面报错。 输入双引号,页面恢复正常这个时候,可以判断这个系统存在注入的可能非常大, 手工使用了报错注入、盲注都不行…

20242934 2024-2025-2 《网络攻防实践》第四周作业

1.实践内容 在网络攻防实验环境中完成TCP/IP协议栈重点协议的攻击实验,包括ARP缓存欺骗攻击、ICMP重定向攻击、SYN Flood攻击、TCP RST攻击、TCP会话劫持攻击。 ARP缓存欺骗攻击:通过伪造ARP消息,欺骗目标设备将攻击者的MAC地址与合法IP地址关联,从而截获或篡改网络数据,造…

ConcurrentHashMap和锁

为什么HashMap数组的长度是2的指数次幂? 因为HashMap的底层是数组+链表+红黑树,在插入元素时,需要通过索引获得插入元素的位置,计算索引的方法是使用哈希函数,将元素的哈希值与数组长度取模,当数组长度是2的指数次幂时,取模操作相当于对元素的哈希值进行二进制位与运算(…