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,以上就是我在鸿蒙应用中将录音转为文字的分享。

相关推荐
逢生博客3 小时前
阿里 FunASR 开源中文语音识别大模型应用示例(准确率比faster-whisper高)
人工智能·python·语音识别·funasr
卓应5 小时前
2025年华为H31-831题库
网络·华为
鸿蒙布道师6 小时前
鸿蒙NEXT开发Base64工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
The 旺7 小时前
《HarmonyOS Next开发实战:从零构建响应式Todo应用的基石》
华为·harmonyos
Industio_触觉智能7 小时前
鸿蒙北向开发OpenHarmony5.0 DevEco Studio开发工具安装与配置
harmonyos·鸿蒙系统·openharmony·开源鸿蒙·鸿蒙开发·嵌入式开发板
tinghai_2167 小时前
华为手机如何文字转语音:智能配音轻松实现
华为·智能手机
卓应7 小时前
2025年华为HCIP题库分享
网络·华为·智能路由器
小2不语11 小时前
Huawei H151-370 5G CPE 5 SE Review
5g·华为
秋叶先生_12 小时前
HarmonyOS NEXT——【鸿蒙监听网络状态变化】
华为·harmonyos·鸿蒙
东林知识库12 小时前
鸿蒙NEXT小游戏开发:围住神经猫
harmonyos