node對接百度語音識別

node對接百度語音識別

官方文檔
第一步
  • 進入控制檯
  • 人工智能
  • 語音識別
  • 先創建應用:獲得appid、apikey、secritkey
第二步
  • 創建一個文件夾test
  • cd test 進入文件夾
  • 創建index.js文件
  • 安裝依賴:npm i baidu-aip-sdk
示例代碼說明
  • 百度語音需要的格式是pcm,所以需要轉碼
  • 轉碼用的是ffmpeg:

  • 這裏比較煩的是ffmpeg的配置,由於linux和Windows不同,所以配置環境變量的方式也不一樣

  • 配置windows

    • 設置命令行執行指令:

    set path=D:\dev\ffmpeg-20180903-23fe072-win64-static\bin;%path%
    call ffmpeg -y -i 【音頻路徑】 -acodec pcm_s16le -f s16le -ac 1 -ar 16000 【轉碼後存放音頻路徑】

  • 配置linux

    • 設置命令行執行指令:

    export PATH=$PATH:/data/ffmpeg/ffmpeg-git-20180831-64bit-static
    ffmpeg -y -i 【音頻路徑】 -acodec pcm_s16le -f s16le -ac 1 -ar 16000 【轉碼後存放音頻路徑】

  • 如何在代碼中執行指令:

    • nodejs給我們提供了,子進程的方法

      • 官方文檔有提供示例
          const exec = require('child_process').exec; // node自帶的子進程方法
      
          // 執行時會出現編碼問題,設置參數,編碼格式gbk或者utf-8
          // 代碼中自執行
          // 這句是設置ffmpeg路徑,注意到bin目錄即可
          exec('set path=D:\\dev\\ffmpeg-20180903-23fe072-win64-static\\bin;%path%', { 'encoding': 'GBK' });
  • 
    // 示例如下:
    /* 百度ai(人工智能)接入 */
    
    const BDAIPSDK = require('baidu-aip-sdk');
    const AipSpeechClient = BDAIPSDK.speech;
    
    const incfg = {
      appid: appid,
      apikey: apikey,
      secretkey: secretkey
    };
    
    // 新建一個對象,建議只保存一個對象調用服務接口
    const client = new AipSpeechClient(incfg.appid, incfg.apikey, incfg.secretkey);
    
    const fs = require('fs');
    const os = require('os');
    const exec = require('child_process').exec; // node自帶的子進程方法
    
    /* 設置dos命令行的參數編碼格式 */
    const inEncoding = "GBK";
    
    const log = require('../util/log')('logic/baidu');
    
    export default class Baidu {
    
      static async parseAudio(data) {
        let rc = null;
        try {
          if (!data) {
            return;
          }
    
          let indos = '';
          let indos2 = '';
    
          const entry = `${data.filePath}${data.fileName}`;
          const outPath = `${data.filePath}${new Date().getTime()}.pcm`;
    
          if (os && os.EOL === '\r\n') {
            indos = 'set path=D:\\dev\\ffmpeg-20180903-23fe072-win64-static\\bin;%path%';
            indos2 = `call ffmpeg -y  -i ${entry} -acodec pcm_s16le -f s16le -ac 1 -ar 16000 ${outPath}`;
          } else {
            indos = 'export PATH=$PATH:/data/ffmpeg/ffmpeg-git-20180831-64bit-static';
            indos2 = `ffmpeg -y  -i ${entry} -acodec pcm_s16le -f s16le -ac 1 -ar 16000 ${outPath}`;
          }
    
          log.debug('parse param:', { entry, outPath, indos, indos2 });
    
          await new Promise((resolve, reject) => {
            exec(indos, { 'encoding': inEncoding });
            exec(indos2, { 'encoding': inEncoding }, function (error, stdout, stderr) {
              /* log.debug('indos2',{error,stdout: iconv.decode(stdout, inEncoding),stderr: iconv.decode(stderr, inEncoding)}); */
    
              if (error) {
                reject(error);
              } else {
                resolve(stderr);
              }
            });
          });
    
          const voice = fs.readFileSync(outPath);
          log.debug('voice:', voice);
    
          if (voice) {
            const voiceBuffer = new Buffer(voice);
    
            rc = await new Promise((resolve, reject) => {
              client.recognize(voiceBuffer, 'pcm', 16000).then(function (result) {
                log.debug('parse result:', result);
                resolve(result);
              }, function (err) {
                log.debug('parse err:', err);
                reject(err);
              });
            });
          }
        } catch (e) {
          log.error('baidu parse error:', e.message);
        }
    
        return rc;
      }
    }
    
    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章