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

相关推荐
zhanshuo25 分钟前
在鸿蒙里优雅地处理网络错误:从 Demo 到实战案例
harmonyos
zhanshuo27 分钟前
在鸿蒙中实现深色/浅色模式切换:从原理到可运行 Demo
harmonyos
胡耀超4 小时前
DataOceanAI Dolphin(ffmpeg音频转化教程) 多语言(中国方言)语音识别系统部署与应用指南
python·深度学习·ffmpeg·音视频·语音识别·多模态·asr
whysqwhw6 小时前
鸿蒙分布式投屏
harmonyos
whysqwhw7 小时前
鸿蒙AVSession Kit
harmonyos
whysqwhw9 小时前
鸿蒙各种生命周期
harmonyos
whysqwhw10 小时前
鸿蒙音频编码
harmonyos
whysqwhw10 小时前
鸿蒙音频解码
harmonyos
whysqwhw10 小时前
鸿蒙视频解码
harmonyos
whysqwhw10 小时前
鸿蒙视频编码
harmonyos