node.js对接百度语音识别api(微信小程序)

最近准备做毕业设计,想搞智能家居相关的,要用到语音识别的功能。于是便有了下文...
第一步,当然是查询语音识别api,有腾讯云的,百度的,阿里的等等等等,听说百度的识别率挺高的,所以首先选择了百度的api来研究。客户端是用微信小程序写的,可能用腾讯云的语音识别会比较好对接,因为他们是一家的(我也没具体对比过,大家可以去试试)。
额度
1.百度:语音识别标准版 不限制;语音识别极速版 每账号共50000次
2.腾讯云:免费额度为每月15000次

--------下面主要说说对接百度的语音识别api---------

创建应用

首先,在百度AI开发平台控制台创建新应用,后续要用到 API Key 和 Secret Key 。然后...

小程序前端


//index.js
Page({
  //长按开始录音
  speechStart() {
    recorderManager = wx.getRecorderManager();
    const options = {       //录音参数
      duration: 10000,      //10秒后自动停止录音
      sampleRate: 16000,    //采样率
      numberOfChannels: 1,  //录音通道数
      encodeBitRate: 48000, //编码码率
      format: 'PCM'         //音频格式 pcm/ wav/ aac/
    }
    recorderManager.start(options);      //开始录音
    recorderManager.onStop((res)=>{      //监听录音停止
      this.setData({ speeching: false });
      this.uploadFile(res.tempFilePath);      //上传文件操作
    })
  }
})

主要用微信录音api,完成录音并上传服务器。
到这里前端的代码就完成了,接下来我们用node.js写一下后台。

注意,微信开发者工具上有坑,需在真机上测试

node.js后台

1.获取上传的文件。

装好各种包之后引入到index.js中。

//index.js
var express = require('express');
const app = express();
var path = require("path");
var Multiparty = require('multiparty');

app.post('/upload', function (req, res, next) {
  //生成multiparty对象,并配置上传目标文件夹 'uploads'
  var form = new Multiparty.Form({
    uploadDir: path.join(__dirname, 'uploads/')
  });
  //上传完成后处理
  form.parse(req, function (err, fields, files) {
    var inputFile = files.file[0]; // file 为微信 上传录音文件代码中 定义的 name属性
    var uploadedPath = inputFile.path;    
    const voice = fs.readFileSync(uploadedPath);
        var voiceBuffer = new Buffer(voice);
        if (voice) {
          client.recognize(voiceBuffer, 'pcm', 16000).then((result) => {
            console.log(result);
            res.json(result);
          }, function (err) {
            console.log(err);
          });
        }
  })
})

到这里就完成了。
-------------------------------------------------手动分割-------------------------------------------------

附:给微信小程序录音文件转格式 aac -->wav/pcm
(原来小程序录音文件好像只支持.aac/.mp3:????不然为啥我有下面的内容)

转pcm操作我百度了一下,一般都是用ffmpeg命令行的方式。node.js的没有发现很多资料可以参考。所以我先试一下手动将" uploads "文件夹里上传的录音转成.pcm。来,装个包,大家可以从这里进去下载。解压后配置一下环境变量。欸最后发现语音识别是没问题的,识别率还令人满意。
然后再来用node操作命令。这里用到node的子进程,大家可以去了解一下。再新建一个文件夹用来保存转码后的音频文件(这里的文件夹名为" transers ")。
下面介绍一下windows的使用方法:

//index.js  

const BD_API_SDK = require('baidu-aip-sdk'); // 引入百度api sdk
const SpeechClient = BD_API_SDK.speech; // 获取客户端
const fs = require('fs'); // node文件系统
const child_process = require('child_process'); // node子进程

var appid = "18****76";
var apikey = "Kv********Py";
var secretkey = "lT*******CU";
const client = new SpeechClient(appid, apikey, secretkey);

//上传录音完成的回调 
// ***********接1.获取上传的文件。****************
    const entry = `${uploadedPath}`;                                    //需转码的文件路径
    const output = `./transers/${new Date().getTime()}.pcm`;            //转码后输出路径

    var indos = `ffmpeg -i ${entry} -acodec pcm_s16le -f s16le -ac 1 -ar 16000 ${output}`;  //ffmpeg转码命令

    child_process.exec(indos, {             //执行子进程
      encoding: 'GBK'
    }, (error) => {
      if (error) {
        reject(false);
      } else {
        const voice = fs.readFileSync(output);
        var voiceBuffer = new Buffer(voice);
        if (voice) {
          client.recognize(voiceBuffer, 'pcm', 16000).then((result) => {
            console.log(result);
            res.json(result);
          }, function (err) {
            console.log(err);
          });
        }
        //完事,刪掉音频文件
        fs.unlink(uploadedPath, function (err) {
          if (err) console.log(err)
        })
        fs.unlink(output, function (err) {
          if (err) console.log(err)
        })
      }
    })

用linux转的可以参照一下一位大佬写的这篇blog。

将.aac文件转成wav格式。你只需要npm i fluent-ffmpeg,github地址,然后saveToFile('./transers/16k.wav')一句搞定。

//index.js
var ffmpeg = require('fluent-ffmpeg');

//上传录音完成的回调
// ***********接1.获取上传的文件。****************
    var command = ffmpeg();
    command.addInput(uploadedPath)
    // 将.aac 变为.wav
    .saveToFile('./transers/16k.wav')
    .on('error', function (err) {
      console.log(err);
    })
    .on('end', function () {
      var voice = fs.readFileSync("./transers/16k.wav");
      // 将录音文件转为buffer
      var voiceBuffer = new Buffer(voice);

      // 发送buffer到百度接口 返回语音对应的字符串
      client.recognize(voiceBuffer, 'wav', 16000).then((result) => {
        console.log(result);
        res.json(result);
      }, function (err) {
        console.log(err);
      });
    })
OK完事
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容