语音识别(语音转文字)
在鸿蒙应用开发中,需要涉及到录音或者语音识别的功能,我们需要用到CoreSpeechKit这个API,使用语言引擎进行转换。
效果:
申请麦克风权限:
{
"name": "ohos.permission.MICROPHONE",
"reason": "$string:MICROPHONE_reason",
"usedScene": {
"abilities": [
"EntryAbility"
],
}
},
初始化引擎
// 创建引擎,通过callback形式返回
// 设置创建引擎参数
// 调用createEngine方法
asrEngine = await speechRecognizer.createEngine({
language: 'zh-CN',
online: 1,
extraParams: { "locate": "CN", "recognizerMode": "short" }
});
设置回调函数对象
// 创建回调对象
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);
参考代码:
调用
SysPermissionUtils.request(getContext() as common.UIAbilityContext, async (isGranted: boolean) => {
if (!isGranted) {
DialogUtils.showToastMsg('请开启音频录制权限')
context.sendBridgeResult({ startRecord: "noPower" })
return
}
SpeechRecognitionTool.startRecord()
}, "ohos.permission.MICROPHONE")
封装类:
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,以上就是我在鸿蒙应用中将录音转为文字的分享。