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 回调中可以查看错误信息:
  1. 无法创建引擎时返回错误码1002200001,原因:语种不支持、模式不支持、初始化超时、资源不存在等导致创建引擎失败
  2. 无法创建引擎时返回错误码1002200006,原因:引擎正在忙碌中,一般多个应用同时调用语音识别引擎时触发
  3. 无法创建引擎时返回错误码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。

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

10 回复

我在创建的时候报错报错信息如下:
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

为什么要传入音频流?speechRecognizer不是支持自动录音吗?

没有看到自动录音的配置和接口,

找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优化了语音识别性能,支持离线模式,适用于智能家居、车载等场景。详细代码示例可参考官方文档或开发者社区。

回到顶部