使用SpeechRecognitionEngine将语音转文字实践
在鸿蒙应用开发过程中,发送语音消息是很常见的用户需求,有了语音消息但是在不方便打开听筒的情况下就迫切需要将语音转换为文字了。好在鸿蒙SDK提供了@kit.CoreSpeechKit组件包,该组件包提供了一个speechRecognizer.SpeechRecognitionEngine接口,可用于声明一个语音转化引擎实例。首先第一步要声明一个创建引擎参数的配置实例,示例代码如下:
const vttEngineConfig: speechRecognizer.CreateEngineParams = { language: 'zh-CN', online: 1, extraParams: { "locate": "CN", // 流式识别模式 "recognizerMode": "short" } };
根据上面的配置参数实例,再声明一个speechRecognizer.SpeechRecognitionEngine实例,示例代码如下:
this.vttEngine = await speechRecognizer.createEngine(this.vttEngineConfig)
设置语音识别过程中的五种事件回调,示例代码如下:
const listenerConfig: speechRecognizer.RecognitionListener = { // 启动成功回调 onStart(sessionId: string, eventMessage: string) { console.info("onStart sessionId: ", sessionId, "eventMessage: ", eventMessage); }, // 事件回调 onEvent(sessionId: string, eventCode: number, eventMessage: string) { console.error("onEvent sessionId: ", sessionId, "eventCode: ", eventCode, "eventMessage: ",eventMessage); }, // 得到转换文字时的回调 onResult(sessionId: string, result: speechRecognizer.SpeechRecognitionResult) { resultCallback(result) if (result.isLast) { this.vttEngine.finish(sessionId) } }, // 识别完成回调 onComplete(sessionId: string, eventMessage: string) { console.error("onComplete sessionId: ", sessionId, "eventMessage: ", eventMessage); }, // 转换语音发生错误时的回调 onError(sessionId: string, errorCode: number, errorMessage: string) { console.error("onError sessionId: ", sessionId, "errorCode: ", errorCode, "errorMessage: ", errorMessage); }, } // 设置回调 this.vttEngine.setListener(listenerConfig);
第四步就是调用实例的startListen方法启动监听回调函数了,示例代码如下:
this.vttEngine.startListen()
接下来就是最重要的一步了,持续将音频文件写入到speechRecognizer.SpeechRecognitionEngine实例中,示例代码如下:
async writeAudio(audioFilePath: string) { let file = fileIo.openSync(audioFilePath, fileIo.OpenMode.READ_WRITE); try { let buf: ArrayBuffer = new ArrayBuffer(1280); let offset: number = 0; while (1280 == fileIo.readSync(file.fd, buf, { offset: offset })) { let uint8Array: Uint8Array = new Uint8Array(buf); this.vttEngine.writeAudio(this.sessionId, uint8Array); await SleepUtil.sleep(40); offset = offset + 1280; } } catch (err) { console.error(`写入音频时发生错误:Code: ${err.code}, message: ${err.message}.`); } finally { if (null != file) { fileIo.closeSync(file); } } }
最终实现了将一段从抖音录制的40秒左右的音频,点击“语音转文字”按钮后,全部转化为文字了。因为录屏转GIF时长的原因,下面展示的GIF只有29秒。录屏演示转换过程如下所示:

当然实现语音转文字的过程不是一帆风顺的,也遇到了很多困难与坑。下面我将挑几个点简单介绍一下