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完事
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352