node對接百度語音識別
官方文檔
第一步
- 進入控制檯
- 人工智能
- 語音識別
- 先創建應用:獲得appid、apikey、secritkey
第二步
- 創建一個文件夾test
- cd test 進入文件夾
- 創建index.js文件
- 安裝依賴:npm i baidu-aip-sdk
示例代碼說明
- 百度語音需要的格式是pcm,所以需要轉碼
轉碼用的是ffmpeg:
- 由於node版本更新後,npm上的ffmpeg 包使用不上,則採用命令行使用官方下載的 build 包
- 官方地址:點這裏:http://ffmpeg.org/ffmpeg.html
- 百度語音使用ffmpeg的使用說明:點這裏:https://ai.baidu.com/docs#/ASR-Tool-convert/ec5eb053
這裏比較煩的是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;
}
}