开发中使用——鸿蒙CoreSpeechKit语音识别

文章目录


开发中使用------鸿蒙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)

我不知道怎么上传视频,还是算了吧。就上传一张图片吧。

六、参考文档

官方文档

七、代码奉上(仅供参考)

后续。。。

相关推荐
程序猿追3 小时前
kotlin-retry 接入鸿蒙后,怎样确认它真的会停止重试
开发语言·kotlin·harmonyos
懿路向前7 小时前
HarmonyOS 粒子特效实战:emitter.size 是双刃剑:粒子精确定位 [0,0] 与条带随机出生(HarmonyOS)
华为·harmonyos
马剑威(威哥爱编程)7 小时前
【共创稿事节】HarmonyOS 7 Agent 开发实战 04:云端 RAG 搭企业私有知识库问答
人工智能·华为·harmonyos
贾伟康8 小时前
【晨迹相机|20】HarmonyOS ArkTS AppGallery 发布复查实战:核对包名、版本、设备、素材和离线声明
harmonyos·arkts·appgallery·发布审核·上架复查
特立独行的猫a8 小时前
用仓颉写桌面应用:从 npx 建工程到串口实时示波器
开源·harmonyos·tauri·仓颉·cj-tarui
m0_6855350810 小时前
光学设计自学
华为·光学·光学设计·光学工程·镜头设计
懿路向前10 小时前
HarmonyOS 粒子特效实战:马赛克切块提速 17.6×~38×:desiredRegion 重复读盘与一次解码管线(HarmonyOS)
华为·harmonyos
糖糖单片机设计10 小时前
基于 STM32 的配网变压器涌流抑制器设计与实现
人工智能·stm32·嵌入式硬件·51单片机·语音识别
垆边人似月.11 小时前
华为题:LRU 缓存
缓存·华为
天府云创12 小时前
Agentic开发时代到来——鸿蒙PC三大原生开发工具公测
华为·操作系统·harmonyos·鸿蒙系统·cli·deveco·agentic