鸿蒙Next - 原生API实现实时语音识别

鸿蒙原生提供的许多方法方便了应用的各种复杂业务实现,这期来分享一下原生的语音识别实现思路和流程。

官方文档

实现思路

具体的的实现主要分为两个部分:语音识别引擎和音频捕获。

在代码实现时,顺序不重要,关键在于分别启动语音识别器和音频捕获器后通过后者的回调函数使前者工作。


1. 语音识别引擎的初始化

在实现实时语音识别功能时,首先需要创建并配置语音识别引擎。以下是关键步骤:

步骤1:创建引擎

TypeScript 复制代码
let extraParam = { "locate": "CN", "recognizerMode": "short" };
let initParamsInfo = {
  language: 'zh-CN',
  online: 1,
  extraParams: extraParam
};
this.asrEngine = await speechRecognizer.createEngine(initParamsInfo);

先调用createEngine方法来初始化语音识别引擎。设置语言为中文,并指定识别模式。

步骤2:设置回调监听器

TypeScript 复制代码
// 创建回调对象
let setListener: speechRecognizer.RecognitionListener = {
  // 开始识别成功回调
  onStart(sessionId: string, eventMessage: string) {
    Logger.info(`onStart, sessionId: ${sessionId} eventMessage: ${eventMessage}`);
  },
  // 事件回调
  onEvent(sessionId: string, eventCode: number, eventMessage: string) {
    Logger.info(`onEvent, sessionId: ${sessionId} eventCode: ${eventCode} eventMessage: ${eventMessage}`);
  },
  // 识别结果回调,包括中间结果和最终结果
  onResult: (sessionId: string, result: speechRecognizer.SpeechRecognitionResult) => {
    Logger.info(`onResult, sessionId: ${sessionId} sessionId: ${JSON.stringify(result)}`);
    this.onChange(result.result)    //结合具体业务修改即可
    this.keyword = result.result  //结合具体业务修改即可
  },
  // 识别完成回调
  onComplete: (sessionId: string, eventMessage: string) => {
    this.voiceState = VoiceState.DEFAULT
    Logger.info(`onComplete, sessionId: ${sessionId} eventMessage: ${eventMessage}`);
    this.onComplete(this.keyword)    //结合具体业务修改即可
    this.keyword = ''    //结合具体业务修改即可
  },
  // 错误回调
  onError(sessionId: string, errorCode: number, errorMessage: string) {
    Logger.error(`onError, sessionId: ${sessionId} errorCode: ${errorCode} errorMessage: ${errorMessage}`);
  }
}
this.asrEngine.setListener(setListener);

我们创建了一个setListener对象来接收语音识别的回调信息,包括识别开始、结果返回和错误处理。每当识别结果更新时,我们将其存储到this.keyword中,以便页面展示使用。

步骤3:开始语音识别

TypeScript 复制代码
let audioParam = {
  audioType: 'pcm',
  sampleRate: 16000,
  soundChannel: 1,
  sampleBit: 16
};
let extraParams: Record<string, Object> = { "vadBegin": 2000, "vadEnd": 3000, "maxAudioDuration": 40000 };
let recognizerParams: speechRecognizer.StartParams = {
  sessionId: this.sessionId,
  audioInfo: audioParam,
  extraParams: extraParams
};
this.asrEngine.startListening(recognizerParams);

在调用startListening方法时,设置音频信息参数,包括采样率和声道。注意这里的参数需要与后面捕获的音频格式一致


2. 音频输入的捕获

捕获音频的具体步骤如下:

步骤1:创建音频捕获器

TypeScript 复制代码
let audioCapturerOptions = {
  streamInfo: {
    samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_16000,
    channels: audio.AudioChannel.CHANNEL_1,
    sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
    encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
  },
  capturerInfo: {
    source: audio.SourceType.SOURCE_TYPE_MIC,
    capturerFlags: 0
  }
};
this.audioCapturer = await audio.createAudioCapturer(audioCapturerOptions);

配置音频捕获器的参数,确保与语音识别引擎接收格式一致。这里指定了采样率、声道及编码格式,以确保音频数据的质量。

步骤2:处理音频数据

TypeScript 复制代码
let readDataCallback = (buffer) => {
  let uint8Array = new Uint8Array(buffer);
  this.asrEngine?.writeAudio(this.sessionId, uint8Array);
};
this.audioCapturer.on('readData', readDataCallback);

为音频捕获器设置了数据读取的回调函数。当捕获到音频数据时,它将被转换为Uint8Array格式并发送到语音识别引擎进行处理。这一步确保了音频数据能够实时传递给识别引擎,从而实现语音识别结果实时的根据输入变化。

步骤3:开始录音

TypeScript 复制代码
await this.audioCapturer.start();
this.voiceState = VoiceState.VOICING;  //根据业务变化,用于判断当前识别的状态

在成功设置音频捕获器和回调后,调用start()方法开始录音并更新语音状态,准备进行语音识别。


关闭语音识别
TypeScript 复制代码
// 结束语音识别
async closeRecord() {
  this.audioCapturer?.stop() // 停止录制
  this.audioCapturer?.release() // 释放资源
  this.asrEngine?.finish(this.sessionId) // 结束识别
  this.asrEngine?.shutdown() // 释放引擎资源
  this.voiceState = VoiceState.VOICEOVER  //根据业务变化,用于判断当前识别的状态
}

总结

没有总结,用于简单的应用场景很合适。

相关推荐
陈随易几秒前
兔小巢收费引发的论坛调研Node和Deno有感
前端·后端·程序员
熊的猫14 分钟前
webpack 核心模块 — loader & plugins
前端·javascript·chrome·webpack·前端框架·node.js·ecmascript
速盾cdn21 分钟前
速盾:vue的cdn是干嘛的?
服务器·前端·网络
互联网时光机1 小时前
HarmonyOS第一课 07 从网络获取数据-习题
华为·harmonyos
四喜花露水1 小时前
Vue 自定义icon组件封装SVG图标
前端·javascript·vue.js
前端Hardy1 小时前
HTML&CSS: 实现可爱的冰墩墩
前端·javascript·css·html·css3
web Rookie2 小时前
JS类型检测大全:从零基础到高级应用
开发语言·前端·javascript
Au_ust2 小时前
css:基础
前端·css
帅帅哥的兜兜2 小时前
css基础:底部固定,导航栏浮动在顶部
前端·css·css3
yi碗汤园2 小时前
【一文了解】C#基础-集合
开发语言·前端·unity·c#