鸿蒙AI能力之语音识别 原创
【本文正在参与优质创作者激励】
文章旨在帮助大家开发录音及语音识别时少踩一点坑。
效果
图
左侧为简易UI布局及识别成果,右侧为网易云播放的测试音频
开发步骤
IDE安装、项目创建等在此略过。App采用SDK版本为API 6,使用JS UI
1.权限申请
AI语音识别不需要任何权限,但此处使用到麦克风录制音频,就需要申请麦克风权限。
在config.json配置文件中添加权限:
在MainAbility中显示申明麦克风权限
2.创建音频录制的工具类
首先创建音频录制的工具类AudioCaptureUtils
而音频录制需要用到AudioCapturer
类,而在创建AudioCapture
类时又会用到
AudioStreamInfo
类及AudioCapturerInfo
类,所以我们分别申明以上3个类的变量
在语音识别时对音频的录制是由限制的,限制如下:
所以我们在录制音频时需要注意:
1.采样率16000HZ
2.声道为单声道
3.仅支持普通话
作为工具类,为了使AudioCaptureUtils
能多处使用,我们在创建构造函数时,提供声道与频率的参数重载,并在构造函数中初始化AudioStreamInfo
类及AudioCapturerInfo
类
在init函数中进行audioCapturer
的初始化,在初始化时对音效进行设置,默认为降噪模式
初始化后提供start
、stop
和destory
方法,分别开启音频录制、停止音频录制和销毁,此处都是调用AudioCapturer
类中对应函数。
提供一个读取音频流的方法及获取AudioCapturer
实例的方法
3.创建语音识别的工具类
在上面我们已经创建好一个音频录制的工具类,接下来在创建一个语音识别的工具类 AsrUtils
我们再回顾一下语音识别的约束与限制:
在此补充一个隐藏限制,PCM流的长度只允许640与1280两种长度,也就是我们音频读取流时只能使用640与1280两种长度。
接下来我们定义一些基本常量:
因为要在后台持续录制音频,所以需要开辟一个新的线程。此处用到java的ThreadPoolExecutor
类进行线程操作。
定义一个线程池实例以及其它相关属性如下:
在构造函数中初始化相关属性
开启识别与停止识别的函数
识别结果是通过listener的回调获取的结果,所以我们在处理时是将结果赋值给result,通过getresult或getResultAndClear函数获取结果。
4.创建一个简易的JS UI,并通过JS调ServerAbility的能力调用Java
hml代码
样式代码
js逻辑控制代码
ServerAbility
至此简易的语音识别功能完毕。
相关演示:https://www.bilibili.com/video/BV1E44y177hv/
完整代码开源:https://gitee.com/panda-coder/harmonyos-apps/tree/master/AsrDemo
感谢排坑,很详细的代码和演示。
可以把视频也发在社区哟,可在发现-极客Show中发布。