node.js對接百度語音識別api(微信小程序)

最近準(zhǔn)備做畢業(yè)設(shè)計,想搞智能家居相關(guān)的,要用到語音識別的功能。于是便有了下文...
第一步,當(dāng)然是查詢語音識別api,有騰訊云的,百度的,阿里的等等等等,聽說百度的識別率挺高的,所以首先選擇了百度的api來研究??蛻舳耸怯梦⑿判〕绦?qū)懙?,可能用騰訊云的語音識別會比較好對接,因為他們是一家的(我也沒具體對比過,大家可以去試試)。
額度
1.百度:語音識別標(biāo)準(zhǔn)版 不限制;語音識別極速版 每賬號共50000次
2.騰訊云:免費額度為每月15000次

--------下面主要說說對接百度的語音識別api---------

創(chuàng)建應(yīng)用

首先,在百度AI開發(fā)平臺控制臺創(chuàng)建新應(yīng)用,后續(xù)要用到 API Key 和 Secret Key 。然后...

小程序前端


//index.js
Page({
  //長按開始錄音
  speechStart() {
    recorderManager = wx.getRecorderManager();
    const options = {       //錄音參數(shù)
      duration: 10000,      //10秒后自動停止錄音
      sampleRate: 16000,    //采樣率
      numberOfChannels: 1,  //錄音通道數(shù)
      encodeBitRate: 48000, //編碼碼率
      format: 'PCM'         //音頻格式 pcm/ wav/ aac/
    }
    recorderManager.start(options);      //開始錄音
    recorderManager.onStop((res)=>{      //監(jiān)聽錄音停止
      this.setData({ speeching: false });
      this.uploadFile(res.tempFilePath);      //上傳文件操作
    })
  }
})

主要用微信錄音api,完成錄音并上傳服務(wù)器。
到這里前端的代碼就完成了,接下來我們用node.js寫一下后臺。

注意,微信開發(fā)者工具上有坑,需在真機(jī)上測試

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對象,并配置上傳目標(biāo)文件夾 '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);
          });
        }
  })
})

到這里就完成了。
-------------------------------------------------手動分割-------------------------------------------------

附:給微信小程序錄音文件轉(zhuǎn)格式 aac -->wav/pcm
(原來小程序錄音文件好像只支持.aac/.mp3:????不然為啥我有下面的內(nèi)容)

轉(zhuǎn)pcm操作我百度了一下,一般都是用ffmpeg命令行的方式。node.js的沒有發(fā)現(xiàn)很多資料可以參考。所以我先試一下手動將" uploads "文件夾里上傳的錄音轉(zhuǎn)成.pcm。來,裝個包,大家可以從這里進(jìn)去下載。解壓后配置一下環(huán)境變量。欸最后發(fā)現(xiàn)語音識別是沒問題的,識別率還令人滿意。
然后再來用node操作命令。這里用到node的子進(jìn)程,大家可以去了解一下。再新建一個文件夾用來保存轉(zhuǎn)碼后的音頻文件(這里的文件夾名為" 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文件系統(tǒng)
const child_process = require('child_process'); // node子進(jìn)程

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

//上傳錄音完成的回調(diào) 
// ***********接1.獲取上傳的文件。****************
    const entry = `${uploadedPath}`;                                    //需轉(zhuǎn)碼的文件路徑
    const output = `./transers/${new Date().getTime()}.pcm`;            //轉(zhuǎn)碼后輸出路徑

    var indos = `ffmpeg -i ${entry} -acodec pcm_s16le -f s16le -ac 1 -ar 16000 ${output}`;  //ffmpeg轉(zhuǎn)碼命令

    child_process.exec(indos, {             //執(zhí)行子進(jìn)程
      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轉(zhuǎn)的可以參照一下一位大佬寫的這篇blog。

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

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

//上傳錄音完成的回調(diào)
// ***********接1.獲取上傳的文件。****************
    var command = ffmpeg();
    command.addInput(uploadedPath)
    // 將.aac 變?yōu)?wav
    .saveToFile('./transers/16k.wav')
    .on('error', function (err) {
      console.log(err);
    })
    .on('end', function () {
      var voice = fs.readFileSync("./transers/16k.wav");
      // 將錄音文件轉(zhuǎn)為buffer
      var voiceBuffer = new Buffer(voice);

      // 發(fā)送buffer到百度接口 返回語音對應(yīng)的字符串
      client.recognize(voiceBuffer, 'wav', 16000).then((result) => {
        console.log(result);
        res.json(result);
      }, function (err) {
        console.log(err);
      });
    })
OK完事
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容