专栏首页小程序解决方案的专栏基于腾讯云智能语音的实时语音识别微信小程序的开发
原创

基于腾讯云智能语音的实时语音识别微信小程序的开发

微信小程序的基础库升级到了 1.6.0 之后,提供了许多新的 API,其中新增了录音管理的 API,不同于以前只有 wx.startRecordwx.stopRecord 两个简单的录音功能,新的 wx.getRecorderManager 接口提供了包括扩展时长、采样率、录音通道、码率、格式等在内的许多配置项。基于此,我们能更加轻松的控制录音,新提供的 onFrameRecorded 的事件,甚至可以实现流式语音识别。

本文就介绍一下使用 Wafer Node.js SDK 提供的腾讯云智能语音识别接口来实现录音转文字的功能。请您先从 Github 下载语音识别 Demo,本文会根据 Demo 来介绍 SDK 中语音识别接口的使用。

使用语音识别需要开通腾讯云智能语音

打开server/config.js,添加上qcloudAppIdqcloudSecretIdqcloudSecretKey三个配置项,并在代码目录中打开 CMD,运行如下代码:

cd server && npm i

安装完成依赖,选择小程序开发者工具右上角的【腾讯云】按钮,点击【上传测试环境】上传代码到测试环境中,一键部署程序。你也可以自行部署代码,部署过程同《自行部署 Node.js Demo》,这里不再介绍。

最终实现的效果如下:

具体是如何实现的呢?接下来我们来分析一下 Demo 里的有关代码。

首先查阅 SDK API 文档可知,SDK 提供的语音识别接口是分片识别接口,原理是将语音文件切分成一个个分片,将每个分片以 buffer 格式传入接口,最后一个分片调用接口时需要将 isEnd 参数置为 true,最后会返回完整的识别结果,以此来流式识别语音。

由于智能语音识别只支持以下几种编码格式的音频文件:

  • pcm
  • adpcm
  • feature
  • speex
  • amr
  • silk
  • wav

所以小程序端通过 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 行开始对音频文件进行处理,首先先生成了 voiceIdvoiceId 告诉了语音识别接口每个语音分片属于哪个语音,每个语音的 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 格式,与真机行为不完全相同,所以录音相关的测试请直接使用真机调试。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 自己部署 PHP 版本的 Wafer2 Demo

    自行部署适用于想将腾讯云 Wafer SDK 和 Demo 部署在自己的服务器上以获得更高的灵活性和操纵权限的用户。部署过程需要从零开始搭建线上环境,需要有一定...

    Jason
  • 微信小程序基于万象优图实现图片 OCR

    随着小程序开放越来越多的类目,越来越多的企业将各种各样的需求开发成小程序,而基于图像识别的名片识别、身份证识别或者普通文字的 OCR 也越来越多的被应用于各种场...

    Jason
  • 基于 Wafer 2.0 搭建自己的第一个小程序

    临近 2017 年末尾了,距离微信小程序上线也已经一年多了,随着微信在上半年放开了个人申请微信小程序的限制,越来越多的开发者选择开发微信小程序而不是开发一个 A...

    Jason
  • 依图要修AI语音双学位,左手摸底考第一名成绩单,右手开放平台方案

    这家以“图”起家的AI公司,现在宣布修个“语音”双学位,而且出场便是学霸的方式——随手甩出一张摸底考第一名成绩单。

    量子位
  • 为运营分析而设计的数据系统

    OPAP系统构建了一个实时查询的系统可以使用者立马能够查询到实时数据。举个简单的例子,当用户参加一项活动时,产品经理或者是运营人员希望能够马上获得用户的参与效果...

    哒呵呵
  • netty案例,netty4.1源码分析篇二《ServerBootstrap配置与绑定启动》

    结合上一章节介绍NioEventLoopGroup,本章节继续介绍ServerBootstrap相关代码。

    小傅哥
  • WINDOWS下使用虚拟机安装ubuntu及其上网设置的安装说明

    LINUX是个好东西,可是如果是新手.而且是想多系统共存的话,安装就会有点难。建议初装LINUX的朋友试试用虚拟机VMware workstation安装...

    闵开慧
  • 微软对话语音识别再获突破,首次达到人类专业水平

    1 新智元推荐1 来源:微软研究院AI头条 【新智元导读】继 9月13日微软将对话语音识别错误率降至6.3%的记录后,前天再次宣布进一步将错误率降至 5.9%...

    新智元
  • Nacos源码编译

    Nacos同时支持基于DNS和基于RPC(如Dubbo/gRPC)的服务发现,并提供服务的实时健康检查,基于Nacos更方便的实现服务断路器。Nacos提供的服...

    java乐园
  • 新型颅底手术机器人非常精确,可以大大减轻外科医生的工作量

    在颅底钻孔是一个非常精细的活,往往需要几个小时的时间,并且需要外科医生进行最大限度的干预。荷兰埃因霍温理工大学的研究人员开发了一款新型的手术机器人,可以完成这项...

    机器人网

扫码关注云+社区

领取腾讯云代金券