HarmonyOS NEXT——【鸿蒙实现录音识别(语音转文字)】

语音识别(语音转文字)

在鸿蒙应用开发中,需要涉及到录音或者语音识别的功能,我们需要用到CoreSpeechKit这个API,使用语言引擎进行转换。

效果:

申请麦克风权限:

TypeScript 复制代码
{
  "name": "ohos.permission.MICROPHONE",
  "reason": "$string:MICROPHONE_reason",
  "usedScene": {
    "abilities": [
      "EntryAbility"
    ],
  }
},

初始化引擎

TypeScript 复制代码
// 创建引擎,通过callback形式返回
// 设置创建引擎参数
// 调用createEngine方法
asrEngine = await speechRecognizer.createEngine({
  language: 'zh-CN',
  online: 1,
  extraParams: { "locate": "CN", "recognizerMode": "short" }
});

设置回调函数对象

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}`);
  },
​
  // 识别结果回调,包括中间结果和最终结果
  // 箭头函数 的 this 会在创建时,绑定 当前所在作用域中的 this(当前组件)
  onResult: (sessionId: string, result: speechRecognizer.SpeechRecognitionResult) => {
    Text = result.result
    Logger.info(`onResult, sessionId: ${sessionId} sessionId: ${JSON.stringify(result)}`);
    Logger.info('result', result.result)
    // 保存 识别的结果
    // 通知 父组件
  },
  // 识别完成回调
  // 箭头函数 的 this 会在创建时,绑定 当前所在作用域中的 this(当前组件)
  onComplete: (sessionId: string, eventMessage: string) => {
    Logger.info(`onComplete, sessionId: ${sessionId} eventMessage: ${eventMessage}`);
  },
  // 错误回调,错误码通过本方法返回
  // 如:返回错误码1002200006,识别引擎正忙,引擎正在识别中
  // 更多错误码请参考错误码参考
  onError(sessionId: string, errorCode: number, errorMessage: string) {
    Logger.error(`onError, sessionId: ${sessionId} errorCode: ${errorCode} errorMessage: ${errorMessage}`);
  }
}
// 设置回调
asrEngine.setListener(setListener);

设置参数,启动回调

TypeScript 复制代码
// 语音 03 - 设置识别参数 开始识别
let recognizerParams: speechRecognizer.StartParams = {
  sessionId: sessionId,
  // 识别的语音的信息
  audioInfo: {
    audioType: 'pcm',
    sampleRate: 16000,
    soundChannel: 1,
    sampleBit: 16
  },
  extraParams: { "vadBegin": 2000, "vadEnd": 3000, "maxAudioDuration": 40000 }
};
// 调用开始识别方法
asrEngine.startListening(recognizerParams);

参考代码:

调用

TypeScript 复制代码
SysPermissionUtils.request(getContext() as common.UIAbilityContext, async (isGranted: boolean) => {
  if (!isGranted) {
    DialogUtils.showToastMsg('请开启音频录制权限')
    context.sendBridgeResult({ startRecord: "noPower" })
    return
  }
  SpeechRecognitionTool.startRecord()
}, "ohos.permission.MICROPHONE")

封装类:

TypeScript 复制代码
import { speechRecognizer } from '@kit.CoreSpeechKit'
import { audio } from '@kit.AudioKit'
import Logger from './Logger'
​
//录音音频捕获对象
let audioCapturer: audio.AudioCapturer | null = null
//语音识别引擎对象
let asrEngine: speechRecognizer.SpeechRecognitionEngine | null = null
// 语音识别的会话 ID
let sessionId: string = '123456';
let Text: string = ''
​
export class SpeechRecognitionTool {
  static async startRecord() {
​
​
    // 创建引擎,通过callback形式返回
    // 设置创建引擎参数
    // 调用createEngine方法
    asrEngine = await speechRecognizer.createEngine({
      language: 'zh-CN',
      online: 1,
      extraParams: { "locate": "CN", "recognizerMode": "short" }
    });
​
    // 语音 02 - 设置识别之后的回调函数
    // 创建回调对象
    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}`);
      },
​
      // 识别结果回调,包括中间结果和最终结果
      // 箭头函数 的 this 会在创建时,绑定 当前所在作用域中的 this(当前组件)
      onResult: (sessionId: string, result: speechRecognizer.SpeechRecognitionResult) => {
        Text = result.result
        Logger.info(`onResult, sessionId: ${sessionId} sessionId: ${JSON.stringify(result)}`);
        Logger.info('result', result.result)
        // 保存 识别的结果
        // 通知 父组件
      },
      // 识别完成回调
      // 箭头函数 的 this 会在创建时,绑定 当前所在作用域中的 this(当前组件)
      onComplete: (sessionId: string, eventMessage: string) => {
        Logger.info(`onComplete, sessionId: ${sessionId} eventMessage: ${eventMessage}`);
      },
      // 错误回调,错误码通过本方法返回
      // 如:返回错误码1002200006,识别引擎正忙,引擎正在识别中
      // 更多错误码请参考错误码参考
      onError(sessionId: string, errorCode: number, errorMessage: string) {
        Logger.error(`onError, sessionId: ${sessionId} errorCode: ${errorCode} errorMessage: ${errorMessage}`);
      }
    }
    // 设置回调
    asrEngine.setListener(setListener);
​
    // 语音 03 - 设置识别参数 开始识别
    let recognizerParams: speechRecognizer.StartParams = {
      sessionId: sessionId,
      // 识别的语音的信息
      audioInfo: {
        audioType: 'pcm',
        sampleRate: 16000,
        soundChannel: 1,
        sampleBit: 16
      },
      extraParams: { "vadBegin": 2000, "vadEnd": 3000, "maxAudioDuration": 40000 }
    };
    // 调用开始识别方法
    asrEngine.startListening(recognizerParams);
​
    // ---------- 下面是录音相关的逻辑  ----------
    // 录音 01 - 创建 录音 实例对象
    let audioCapturerOptions: audio.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
      }
    };
​
    // 调用 createAudioCapturer 创建 录音用的实例对象
    audioCapturer = await audio.createAudioCapturer(audioCapturerOptions)
​
    // 录音 02 监听录制的结果并 做一些事情
​
    // 回调函数中,将录制的音频信息,保存到  cacheDir 中
    audioCapturer.on('readData', (buffer: ArrayBuffer) => {
      // 语音04 - 写入音频留
      // 写入的音频流,转手传递给 识别引擎
      asrEngine?.writeAudio(sessionId, new Uint8Array(buffer));
      // Logger.info('readData 触发啦~~~')
    });
​
    // 录音 03 - 开启录制
    await audioCapturer.start();
​
​
  }
​
  static async closeRecord(callBack: RecognizerRes) {
    callBack.callBack(Text)
    // 录音 04 关闭 + 销毁
    audioCapturer?.stop()
    audioCapturer?.release()
​
    // 语音 05 关闭+释放
    asrEngine?.finish(sessionId)
    asrEngine?.shutdown()
​
  }
}
​
export interface RecognizerRes {
  callBack: (text: string) => void
}

ok,以上就是我在鸿蒙应用中将录音转为文字的分享。

相关推荐
小诸葛的博客4 小时前
华为ensp实现跨vlan通信
网络·华为·智能路由器
康康这名还挺多6 小时前
鸿蒙HarmonyOS list优化一: list 结合 lazyforeach用法
数据结构·list·harmonyos·lazyforeach
晚秋大魔王9 小时前
OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——nettle库
linux·开源·harmonyos
python算法(魔法师版)13 小时前
.NET 在鸿蒙系统上的适配现状
华为od·华为·华为云·.net·wpf·harmonyos
bestadc14 小时前
鸿蒙 UIAbility组件与UI的数据同步和窗口关闭
harmonyos
枫叶丹415 小时前
【HarmonyOS Next之旅】DevEco Studio使用指南(二十二)
华为·harmonyos·deveco studio·harmonyos next
ax一号街阿楠17 小时前
华为FAT AP配置 真机
网络·华为·智能路由器
吗喽对你问好17 小时前
华为5.7机考第一题充电桩问题Java代码实现
java·华为·排序
乱世刀疤19 小时前
深度 |国产操作系统“破茧而出”:鸿蒙电脑填补自主生态空白
华为·harmonyos
博睿谷IT99_1 天前
华为HCIP-AI认证考试版本更新通知
人工智能·华为