HarmonyOS 鸿蒙Next原生智能之语音识别实战
HarmonyOS 鸿蒙Next原生智能之语音识别实战
HarmonyOS 原生智能之语音识别实战
背景
公司很多业务场景使用到了语音识别功能,当时我们的语音团队自研了语音识别模型,方案是云端模型加端侧SDK交互,端侧负责做语音采集、VAD、opus编码,实时传输给云端,云端识别后返回识别结果。这些业务场景在适配鸿蒙的过程发现HarmonyOS 原生智能中提供了本地语音识别SDK,动手封装一波。
场景介绍
原生语音识别能力支持两种模式:
- 短语音模式(不超过60s)
- 长语音模式(不超过8h)
API接口介绍
1. 引擎初始化
let asrEngine: speechRecognizer.SpeechRecognitionEngine;
// 创建引擎,通过callback形式返回
// 设置创建引擎参数
let extraParam: Record<string, Object> = {"locate": "CN", "recognizerMode": "short"};
let initParamsInfo: speechRecognizer.CreateEngineParams = {
language: 'zh-CN',
online: 1,
extraParams: extraParam
};
// 调用createEngine方法
speechRecognizer.createEngine(initParamsInfo, (err: BusinessError, speechRecognitionEngine: speechRecognizer.SpeechRecognitionEngine) => {
if (!err) {
console.info('Succeeded in creating engine.');
// 接收创建引擎的实例
asrEngine = speechRecognitionEngine;
} else {
// 无法创建引擎时返回错误码1002200008,原因:引擎正在销毁中
console.error(`Failed to create engine. Code: ${err.code}, message: ${err.message}.`);
}
});
主要是需要构建引擎参数speechRecognizer.CreateEngineParams:
- language:语言
- online:模式,1为离线,目前只支持离线引擎
- extraParams:区域信息等
- locate:区域信息,可选,不设置时默认为“CN”,当前仅支持“CN”
- recognizerMode:识别模式,包含短语音short与场语音long 回调中可以查看错误信息:
- 无法创建引擎时返回错误码1002200001,原因:语种不支持、模式不支持、初始化超时、资源不存在等导致创建引擎失败
- 无法创建引擎时返回错误码1002200006,原因:引擎正在忙碌中,一般多个应用同时调用语音识别引擎时触发
- 无法创建引擎时返回错误码1002200008,原因:引擎正在销毁中
2、设置RecognitionListener回调
回调主要处理识别过程中的事件,最主要的就是onResult处理识别内容,不同的对话对应不同的sessionId:
// 创建回调对象
let setListener: speechRecognizer.RecognitionListener = {
// 开始识别成功回调
onStart(sessionId: string, eventMessage: string) {
},
// 事件回调
onEvent(sessionId: string, eventCode: number, eventMessage: string) {
},
// 识别结果回调,包括中间结果和最终结果
onResult(sessionId: string, result: speechRecognizer.SpeechRecognitionResult) {
},
// 识别完成回调
onComplete(sessionId: string, eventMessage: string) {
},
// 错误回调,错误码通过本方法返回,如:返回错误码1002200006,识别引擎正忙,引擎正在识别中
onError(sessionId: string, errorCode: number, errorMessage: string) {
}
}
// 设置回调
asrEngine.setListener(setListener);
3、开始识别
let audioParam: speechRecognizer.AudioInfo = {audioType: 'pcm', sampleRate: 16000, soundChannel: 1, sampleBit: 16};
let extraParam: Record<string, Object> = {"vadBegin": 2000, "vadEnd": 3000, "maxAudioDuration": 40000};
let recognizerParams: speechRecognizer.StartParams = {
sessionId: sessionId,
audioInfo: audioParam,
extraParams: extraParam
};
// 调用开始识别方法
asrEngine.startListening(recognizerParams);
主要是设置开始识别的相关参数:
- sessionId:会话id,与onResult回调中的sessionId要对应
- audioInfo:音频配置信息,可选
- audioType:目前只支持PCM,如果要识别MP3文件等需要解码后再传给引擎
- sampleRate:音频的采样率,当前仅支持16000采样率
- sampleBit:音频返回的采样位数,当前仅支持16位
- soundChannel:音频返回的通道数信息,当前仅支持通道1
- extraParams:音频的压缩率,pcm格式音频默认为0
- extraParams:额外配置信息,主要包含:
- recognitionMode:实时语音识别模式(不传时默认为1)
- 0:实时录音识别(需应用开启录音权限:ohos.permission.MICROPHONE),若需结束录音,则调用finish方法
- 1:实时音频转文字识别,开启此模式时需要额外调用writeAudio方法,传入待识别音频流;
- vadBegin:Voice Activity Detection(VAD)前端点设置,参数范围是
[500,10000],不传参时默认为10000ms - vadEnd:Voice Activity Detection(VAD)后端点设置。参数范围是
[500,10000],不传参时默认为800ms。 - maxAudioDuration:最大支持音频时长
- 短语音模式支持范围
[20000-60000]ms,不传参时默认20000ms。 - 长语音模式支持范围
[20000 - 8 * 60 * 60 * 1000]ms。
- 短语音模式支持范围
- recognitionMode:实时语音识别模式(不传时默认为1)
VAD作用主要是语音活动检测,对静音数据不进行识别
4、传入音频流
asrEngine.writeAudio(sessionId, uint8Array);
向引擎写入音频数据,可以从麦克风或者音频文件中读取音频流。 注意:音频流长度仅支持640或1280。
5、其他接口
- listLanguages:查询语音识别服务支持的语种信息
- finish:结束识别
- 取消识别:cancel
- shutdown:释放识别引起资源
最佳实践
实时识别的场景需要从麦克风实时读取音频,写入到asrEngine,在onResult回调中获取识别结果。 配置音频采集参数并创建AudioCapturer实例:
import { audio } from '@kit.AudioKit';
let audioStreamInfo: audio.AudioStreamInfo = {
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_16000, // 采样率
channels: audio.AudioChannel.CHANNEL_1, // 通道
sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 采样格式
encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式
};
let audioCapturerInfo: audio.AudioCapturerInfo = {
source: audio.SourceType.SOURCE_TYPE_MIC,
capturerFlags: 0
};
let audioCapturerOptions: audio.AudioCapturerOptions = {
streamInfo: audioStreamInfo,
capturerInfo: audioCapturerInfo
};
audio.createAudioCapturer(audioCapturerOptions, (err, data) => {
if (err) {
console.error(`Invoke createAudioCapturer failed, code is ${err.code}, message is ${err.message}`);
} else {
console.info('Invoke createAudioCapturer succeeded.');
let audioCapturer = data;
}
});
这里注意采样率和声道以及采样位数要符合ASR引擎要求:16k采样、单声道、16位采样位数。 接着调用on(‘readData’)方法,订阅监听音频数据读入回调:
import { BusinessError } from '@kit.BasicServicesKit';
import { fileIo } from '@kit.CoreFileKit';
let bufferSize: number = 0;
class Options {
offset?: number;
length?: number;
}
let readDataCallback = (buffer: ArrayBuffer) => {
//将buffer写入asr引擎
asrEngine.writeAudio(sessionId, new Uint8Array(buffer));
}
audioCapturer.on('readData', readDataCallback);
这里注意写入buffer的大小显示,ASR只支持640或1280。
总结
本文介绍了 HarmonyOS 官方提供的语音识别能力,详解介绍了ASR引擎接口,最后基于麦克风采集数据实现了实时麦克风语音识别功能。
更多关于HarmonyOS 鸿蒙Next原生智能之语音识别实战的实战教程也可以访问 https://www.itying.com/category-93-b0.html
我在创建的时候报错报错信息如下:
errCode: 1002200001 errMessage: “Asr CreateEngineParams is wrong!”
初始化引擎是这样写的:
createByCallback() {
// Setting Engine Creation Parameters
let extraParam: Record<string, Object> = { "locate": "CN", "recognizerMode": "short" };
let initParamsInfo: speechRecognizer.CreateEngineParams = {
language: 'zh-CN',
online: 1,
extraParams: extraParam
};
try {
// Invoke the createEngine method.
speechRecognizer.createEngine(initParamsInfo, (err: BusinessError, speechRecognitionEngine: speechRecognizer.SpeechRecognitionEngine) => {
if (!err) {
console.info(TAG, 'createEngine is success');
// Receive an instance of the creation engine
asrEngine = speechRecognitionEngine;
} else {
console.error("errCode: " + err.code + " errMessage: " + JSON.stringify(err.message));
}
});
} catch (error) {
let message = (error as BusinessError).message;
let code = (error as BusinessError).code;
console.error(`createEngine failed, error code: ${code}, message: ${message}.`)
}
}
请问有什么问题么,怎么改
更多关于HarmonyOS 鸿蒙Next原生智能之语音识别实战的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
姓名:张三
职位:软件工程师
简介:拥有5年软件开发经验,熟悉Java、Python和C++。参与过多个大型项目,擅长系统架构设计和优化。
技能:
- Java
- Python
- C++
- 系统架构设计
- 项目管理
联系信息:
电话:123-456-7890
邮箱:zhangsan@example.com
感谢支持,
基本信息
姓名: 张三
职位: 软件工程师
邮箱: zhangsan@example.com
没有看到自动录音的配置和接口,
找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:BV1S4411E7LY/?p=17
启动录音时recognitionMode传0就是自动录音
let recognizerParams: speechRecognizer.StartParams = {
sessionId: this.sessionId,
audioInfo: { audioType: 'pcm', sampleRate: 16000, soundChannel: 1, sampleBit: 16 },
extraParams: {
'recognitionMode':0
}
}
this.speechEngine?.startListening(recognizerParams)
官方文档的说明:
'recognitionMode', number 实时语音识别模式。
- 0:实时录音识别(需应用开启录音权限:ohos.permission.MICROPHONE),若需结束录音,则调用finish方法;
- 1:实时音频转文字识别,开启此模式时需要额外调用writeAudio方法,传入待识别音频流;
可选,不传参时默认为1。
学习了,
基本信息
技能
- 技能1
- 技能2
经验
- 工作经验1
- 工作经验2
教育背景
- 学历1
- 学历2
HarmonyOS Next的语音识别功能基于其内置的AI引擎,支持多种语言的语音输入和实时转文本。通过HarmonyOS的分布式技术,语音识别可以在多个设备间无缝切换,例如从手机切换到智能音箱。开发者可以使用HarmonyOS提供的SpeechRecognizer API实现语音识别功能。该API支持离线识别和在线识别,离线识别依赖于设备本地模型,在线识别则通过云端服务提供更高的准确率。
在实战中,首先需要在config.json中声明ohos.permission.MICROPHONE权限,确保应用能够访问麦克风。接着,初始化SpeechRecognizer实例,设置识别参数如语言类型和识别模式。通过监听onResult回调,获取识别结果并进行处理。示例代码如下:
import speech from '@ohos.speech';
let speechRecognizer = speech.createRecognizer({
mode: speech.RecognizerMode.ONLINE,
language: 'zh-CN'
});
speechRecognizer.on('result', (event) => {
console.log('识别结果: ' + event.result);
});
speechRecognizer.start();
此外,HarmonyOS Next还支持自定义唤醒词和语音指令,开发者可以通过WakeupWord API实现。语音识别结果可以通过Intent传递给其他应用或服务,实现跨应用协作。整体而言,HarmonyOS Next的语音识别功能具备高效、低延迟和跨设备协同的优势,适用于智能家居、车载系统等场景。
在HarmonyOS鸿蒙Next中,语音识别功能通过集成华为的语音识别SDK实现。首先,在项目中引入huawei-hiai库,并在config.json中配置权限。接着,创建SpeechRecognizer实例并设置监听器,调用startListening方法启动识别。识别结果通过回调返回,开发者可处理文本或执行相应操作。鸿蒙Next优化了语音识别性能,支持离线模式,适用于智能家居、车载等场景。详细代码示例可参考官方文档或开发者社区。


