微信小程序的基础库升级到了 1.6.0 之后,提供了许多新的 API,其中新增了 录音管理 的 API,不同于以前只有 wx.startRecord 和 wx.stopRecord 两个简单的录音功能,新的 wx.getRecorderManager 接口提供了包括扩展时长、采样率、录音通道、码率、格式等在内的许多配置项。基于此,我们能更加轻松的控制录音,新提供的 onFrameRecorded 的事件,甚至可以实现流式语音识别。
本文就介绍一下使用 Wafer Node.js SDK 提供的腾讯云智能语音识别接口来实现录音转文字的功能。请您先从 Github 下载 语音识别 Demo ,本文会根据 Demo 来介绍 SDK 中语音识别接口的使用。
使用语音识别需要开通腾讯云智能语音。
打开 server/config.js ,添加上 qcloudAppId , qcloudSecretId , qcloudSecretKey 三个配置项,并在代码目录中打开 CMD,运行如下代码:
cd server && npm i
安装完成依赖,选择小程序开发者工具右上角的【腾讯云】按钮,点击【上传测试环境】上传代码到测试环境中,一键部署程序。你也可以自行部署代码,部署过程同 《自行部署 Node.js Demo》 ,这里不再介绍。
最终实现的效果如下:
具体是如何实现的呢?接下来我们来分析一下 Demo 里的有关代码。
首先查阅 SDK API 文档可知,SDK 提供的语音识别接口是分片识别接口,原理是将语音文件切分成一个个分片,将每个分片以 buffer 格式传入接口,最后一个分片调用接口时需要将 isEnd 参数置为 true ,最后会返回完整的识别结果,以此来流式识别语音。
由于智能语音识别只支持以下几种编码格式的音频文件:
所以小程序端通过 recorderManager 获取到的录音文件需要提前转换为这几种格式中的一种,然后才能识别。Demo 里选择了将 mp3 格式转换为 wav 格式文件的形式。
Demo 中采用了 ffmpeg 对语音文件进行转码,使用 ffmpeg 的前提是需要在环境中安装 ffmpeg ,然后在 Node.js 中使用 fluent-ffmpeg 调用 ffmpeg 实现转码。
注意: ffmpeg 并没有默认预装在开发环境和生产环境中,如果您需要使用语音识别的转码功能,可以提交工单,我们会为您配置好环境。
打开 Demo 中的 server/controllers/recognize.js 文件,首先调用了 multiparty 从请求体中读取出上传上来的音频数据,接着对语音的类型进行一些判断。
... const { files } = await resolveUploadFileFromRequest(ctx.req); ... if (!resultType || !['audio/mpeg', 'audio/mp3'].includes(resultType.mime)) { throw new Error('上传的文件格式不是 mp3') } ...
第 46 行开始对音频文件进行处理,首先先生成了 voiceId , voiceId 告诉了语音识别接口每个语音分片属于哪个语音,每个语音的 voiceId 应当是先进。
接着调用了 convertMp3ToWav 函数对语音进行转换, convertMp3ToWav 函数的实现如下:
/** * mp3 转 wav * @param {string} srcPath 源文件地址 * @param {string} newPath 新文件地址 */ function convertMp3ToWav (srcPath, newPath) { return new Promise((resolve, reject) => { ffmpeg(srcPath) .format('wav') .on('error', reject) .on('end', function () { resolve(newPath) }) .save(newPath) }) }
由于每次识别的文件大小较好不要超过 10K byte,所以需要对音频文件进行切片,原理就是将音频文件读取为 buffer,然后按每 9K byte 大小切片识别。
// 将文件读取为 Buffer const voiceBuffer = fs.readFileSync(newVoicePath); const taskList = []; let leftBufferSize = 0; let idx = 0; // 按 9K 大小切分分片并识别 while (leftBufferSize < voiceBuffer.length) { const newBufferSize = leftBufferSize + 9 * 1024; // 切分分片 const chunk = voiceBuffer.slice( leftBufferSize, newBufferSize > voiceBuffer.length ? voiceBuffer.length : newBufferSize ) // 提交每个切片去识别,并将任务推入任务列表 taskList.push( voice.recognize( chunk, newBufferSize > voiceBuffer.length, voiceId, idx ) ); leftBufferSize = newBufferSize; idx++; }
以上就是语音识别 Demo 代码的分析,您可以直接运行 Demo,在手机端 真机调试 体验。
注意:开发者工具的录音接口返回的数据不是 MP3 格式,与真机行为不完全相同,所以录音相关的测试请直接使用真机调试。
原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。
如有侵权,请联系zhuanlan_guanli@qq.com删除。
编辑于 15 小时前
2019-03-21 17:28:12 2668
2019-03-21 17:27:07 2948
2019-03-21 17:25:57 3047
2019-03-21 17:24:53 2952
2019-03-21 17:23:46 3021
公司正在筹划上市,为扩大市场占有率,将在近3个月内每日赠送6个免费服务名额。
今日仅剩下2个免费名额
关于微信小程序web-view组件内嵌h5的具体配置流程
目前, 微信 小程序 开发 呈现出 持续火热 的状态 ,越来越多的商家开始关注并开发自己的小程序, 但是,我们也看到,还有一部分的 商家 持观望的态度,不知道是...
微信小程序 对于许多企业的发展是有助力作用的,因此,现在 许多公司在小程序出现已经开始申请自己的账号,一些提前开始运营 微信小程序 的公司已经取得了不错的成绩,...
了解大连的微信公众号代运营价格,花最少钱干最多事
现在, 微信小程序 成为了企业在进行微信营销时又一个有效的方式,许多企业通过 微信小程序 开发的方式建立起微信上的营销覆盖网络,但是,有些企业在开发小程序之后,...
关于微信小程序web-view组件内嵌h5的具体配置流程
目前, 微信 小程序 开发 呈现出 持续火热 的状态 ,越来越多的商家开始关注并开发自己的小程序, 但是,我们也看到,还有一部分的 商家 持观望的态度,不知道是...
微信小程序 对于许多企业的发展是有助力作用的,因此,现在 许多公司在小程序出现已经开始申请自己的账号,一些提前开始运营 微信小程序 的公司已经取得了不错的成绩,...
了解大连的微信公众号代运营价格,花最少钱干最多事
现在, 微信小程序 成为了企业在进行微信营销时又一个有效的方式,许多企业通过 微信小程序 开发的方式建立起微信上的营销覆盖网络,但是,有些企业在开发小程序之后,...
基于腾讯云智能语音的实时语音识别微信小程序的开发