开发中使用——鸿蒙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 小时前
Flutter开源鸿蒙跨平台训练营 Day11从零开发商品详情页面
flutter·开源·harmonyos
一只大侠的侠3 小时前
React Native开源鸿蒙跨平台训练营 Day18自定义useForm表单管理实战实现
flutter·开源·harmonyos
一只大侠的侠3 小时前
React Native开源鸿蒙跨平台训练营 Day20自定义 useValidator 实现高性能表单验证
flutter·开源·harmonyos
听麟4 小时前
HarmonyOS 6.0+ 跨端智慧政务服务平台开发实战:多端协同办理与电子证照管理落地
笔记·华为·wpf·音视频·harmonyos·政务
前端世界4 小时前
从单设备到多设备协同:鸿蒙分布式计算框架原理与实战解析
华为·harmonyos
一只大侠的侠5 小时前
Flutter开源鸿蒙跨平台训练营 Day12从零开发通用型登录页面
flutter·开源·harmonyos
前端不太难6 小时前
HarmonyOS App 工程深水区:从能跑到可控
华为·状态模式·harmonyos
万少6 小时前
端云一体 一天开发的元服务-奇趣故事匣经验分享
前端·ai编程·harmonyos
一只大侠的侠6 小时前
Flutter开源鸿蒙跨平台训练营 Day 15React Native Formik 表单实战
flutter·开源·harmonyos
ujainu6 小时前
《零依赖!用 Flutter + OpenHarmony 构建鸿蒙风格临时记事本(一):内存 CRUD》
flutter·华为·openharmony