文章目录
开发中使用——鸿蒙CoreSpeechKit语音识别
不再是一个安安静静的“APP”,做一个可以发出声音,甚至讲话、与人进行交互,是一个APP孜孜不倦的追求和最终理想。————一个APP的独白。
一、不得不说"小艺"
渊源:华为手机自带语言助手"小艺",也是一个语言AI,手机系统自带,同样支持鸿蒙Next(你懂得)。
特点:短语音模式不超过60s,长语音模式不超过8h。
场景:手机/平板等设备在无网状态下,为听障人士或不方便收听音频场景提供音频转文本能力。(无网络也用,就说牛不牛)。
语言:支持的语种中文普通话(其实英文也可以识别)。
支持的模型类型:离线。
AI: 实打实的AI,这是基于手机系统提供的CoreSpeechKit基础语言服务,属于AI模块。
有下图为证。
二、具体实现(只需四步)
- 实现原理,要初始化语音转文本的引擎(SpeechRecognitionEngine),然后给它配置参数、配置回调;然后就可以使用它进行操作了,让它干活了。
1.创建语音转文本引擎(SpeechRecognitionEngine)
调用createEngine接口,创建SpeechRecognitionEngine实例。并初始化引擎。使用callback异步回调。
createEngine(){
// 创建引擎,通过callback形式返回
// 设置创建引擎参数
this.extraParam = {"locate": "CN", "recognizerMode": "short"};
let initParamsInfo: speechRecognizer.CreateEngineParams = {
language: 'zh-CN',
online: 1,
extraParams: this.extraParam
};
// 调用createEngine方法
speechRecognizer.createEngine(initParamsInfo, (err: BusinessError, speechRecognitionEngine: speechRecognizer.SpeechRecognitionEngine) => {
if (!err) {
console.info('Succeeded in creating engine.');
// 接收创建引擎的实例
this.asrEngine = speechRecognitionEngine;
} else {
console.error(`Failed to create engine. Code: ${err.code}, message: ${err.message}.`);
}
});
}
2.创建回调对象,用来识别语言
回调中,能一步步打印识别的内容。
initListener(){
// 创建回调对象
this.setListener = {
// 开始识别成功回调
onStart(sessionId: string, eventMessage: string) {
console.info(`onStart, sessionId: ${sessionId} eventMessage: ${eventMessage}`);
},
// 事件回调
onEvent(sessionId: string, eventCode: number, eventMessage: string) {
console.info(`onEvent, sessionId: ${sessionId} eventCode: ${eventCode} eventMessage: ${eventMessage}`);
},
// 识别结果回调,包括中间结果和最终结果
onResult(sessionId: string, result: speechRecognizer.SpeechRecognitionResult) {
console.info(`onResult, sessionId: ${sessionId} result: ${JSON.stringify(result)}`);
console.info('识别结果',JSON.stringify(result));
},
// 识别完成回调
onComplete(sessionId: string, eventMessage: string) {
console.info(`onComplete, sessionId: ${sessionId} eventMessage: ${eventMessage}`);
},
// 错误回调,错误码通过本方法返回
// 返回错误码1002200002,开始识别失败,重复启动startListening方法时触发
// 更多错误码请参考错误码参考
onError(sessionId: string, errorCode: number, errorMessage: string) {
console.error(`onError, sessionId: ${sessionId} errorCode: ${errorCode} errorMessage: ${errorMessage}`);
},
}
// 设置回调
this.asrEngine?.setListener(this.setListener);
}
3.设置相关参数
分别为音频文件转文字和麦克风转文字功能设置开始识别的相关参数。
private startListeningForRecording() {
let audioParam: speechRecognizer.AudioInfo = { audioType: 'pcm', sampleRate: 16000, soundChannel: 1, sampleBit: 16 }//audioInfo参数配置请参考AudioInfo
let extraParam: Record<string, Object> = {
"recognitionMode": 0,
"vadBegin": 2000,
"vadEnd": 3000,
"maxAudioDuration": 20000
}
let recognizerParams: speechRecognizer.StartParams = {
sessionId: this.sessionId,
audioInfo: audioParam,
extraParams: extraParam
}
console.info('startListening start');
this.asrEngine?.startListening(recognizerParams);
}
4.调用语音识别方法
让它干活,调用播报方法,开发者可以通过修改speakParams主动设置播报策略
public async startRecording() {
try {
this.startListeningForRecording();
// 录音获取音频
let data: ArrayBuffer;
console.info(TAG, 'create capture success');
this.mAudioCapturer.init((dataBuffer: ArrayBuffer) => {
console.info(TAG, 'start write');
console.info(TAG, 'ArrayBuffer ' + JSON.stringify(dataBuffer));
data = dataBuffer
let uint8Array: Uint8Array = new Uint8Array(data);
console.info(TAG, 'ArrayBuffer uint8Array ' + JSON.stringify(uint8Array));
// 写入音频流
this.asrEngine?.writeAudio(this.sessionId, uint8Array);
});
} catch (err) {
// this.generatedText = `Message: ${err.message}.`;
console.info(TAG,err.message);
}
};
5.停止识别
让它结束时,当需要停止时,有下面几种方式。
/**
* 结束识别
*/
public finishRecognizer(){
this.asrEngine?.finish(this.sessionId);
}
/**
* 取消识别
*/
public cancelRecognizer(){
this.asrEngine?.cancel(this.sessionId);
}
/**
* 释放识别引擎资源
*/
public shutdownEngine(){
this.asrEngine?.shutdown();
}
三、如何使用
1.得到语言引擎管理实例
我是将上述的方法,整理出了一个单例类TextToSpeechManager,方便在APP中全局使用。
private speechManager = SpeechRecognizerManager.getInstance();
2.初始化语言引擎和配置
在将要进入页面时,在方法aboutToAppear()中进行初始化。
aboutToAppear() {
/// 初始化语音识别引擎
this.speechManager.createEngine();
this.sleep(500).then(()=>{
this.speechManager.getInstance().initListener();
});
}
3.开始语音识别
await this.speechManager.startRecording();
四、使用技巧
我是用到了就写一下,后面用到了再进行补充。
五、展示(Show your Time)
我不知道怎么上传视频,还是算了吧。就上传一张图片吧。
六、参考文档
七、代码奉上(仅供参考)
后续。。。