今天,終於成功使用nodejs研究出百度語音識別了。目前使用小程序最新錄音管理api測試,小程序錄音只支持aac,mp3格式,並且保持的是臨時地址。而百度語音識別目前只支持pcm,wav,amr格式。因此服務端需要先存儲好錄音文件並經過一次音頻轉換。具體步驟如下:
1、安裝ffmpeg插件。我使用的windows系統,具體安裝方法看http://blog.csdn.net/yy3097/article/details/51063950,該博主文章講的非常詳細,按照步驟走即可。這個插件是使用fluent-ffmpeg依賴的前提條件
2、使用express生成器生成項目開發接口。需要提前安裝好幾個個依賴:
npm install fluent-ffmpeg –save-dev//mp3轉wav依賴
npm install multiparty –save-dev//獲取multipart/form-data上傳文件依賴
npm install baidu-aip-sdk –save-dev//百度AI依賴
routes文件夾下創建AiSpeechRecognition.js::
var express=require('express');
var router=express.Router();
var fs=require('fs');
var Multiparty =require('multiparty');
var ffmpeg=require('fluent-ffmpeg');//創建一個ffmpeg命令
var AipSpeechServer=require('baidu-aip-sdk').speech;
//設置appid/appkey/appsecret
var APP_ID = "申請的應用appid";
var API_KEY = "申請的應用appkey";
var SECRET_KEY = "申請的應用secretkey";
// 新建一個對象,建議只保存一個對象調用服務接口
var client =new AipSpeechServer(APP_ID, API_KEY, SECRET_KEY);
router.post('/recognition', function(req, res, next){
//生成multiparty對象,並配置上傳目標路徑
var form =new Multiparty.Form({ uploadDir: './public/audio'});
//上傳完成后處理
form.parse(req, function(err, fields, files){
var filesTemp=JSON.stringify(files, null, 2);
if(err){
//console.log('parse error: '+err);
res.json({
ret: -1,
data:{},
msg: '未知錯誤'
});
}else{
//console.log('parse files: '+filesTemp);
var inputFile=files.file[0];
var uploadedPath=inputFile.path;
var command=ffmpeg();
command.addInput(uploadedPath)
//.saveToFile('./public/audio/222.wav')//保存編碼文件到文件夾 --保存成wav是可以的,但是pcm報錯
.saveToFile('./public/audio/16k.wav')
.on('error', function(err){
console.log(err)
})
.on('end', function(){
//調用百度語音合成接口
var voice = fs.readFileSync('./public/audio/16k.wav');
var voiceBuffer=new Buffer(voice);
client.recognize(voiceBuffer, 'wav', 16000).then(function(result){
//console.log(result);
var data=[];
if(result.err_no===0){
data=result.result;
}
res.json({
ret: result.err_no,
data: {
data: data
},
msg: result.err_msg
});
}, function(err){
console.log(err);
});
//語音識別 end
//刪除上傳的臨時音頻文件
fs.unlink(uploadedPath, function(err){
if(err){
console.log(uploadedPath+'文件刪除失敗');
console.log(err);
}else{
console.log(uploadedPath+'文件刪除成功');
}
});
//刪除mp3轉成wav格式的音頻
fs.unlink('./public/audio/16k.wav', function(err){
if(err){
console.log('16k.wav文件刪除失敗');
console.log(err);
}else{
console.log('16k.wav文件刪除成功');
}
});
});
}
});
});
module.exports=router;
前端代碼
const recorderManager = wx.getRecorderManager(); Page({ data: { result: '',//語音識別結果 recording: false//是否正在錄音 }, //開始錄制語音 startRecord(e){ this.setData({recording: true}); recorderManager.start({ duration: 60000,//百度最多支持60s語音 sampleRate: 16000, //encodeBitRate: 48000, numberOfChannels: 1,//必須指定錄音通道數 format: 'mp3' }); recorderManager.onStart(() => { //console.log('recorder start') }); }, //停止錄音 stopRecord(e) { let that=this; this.setData({ recording: false }); recorderManager.stop();//停止錄音 recorderManager.onStop((res)=>{ const { tempFilePath } = res; //uploadfile start wx.uploadFile({ url: 'http://你的ip:3000/baiduAI2/recognition', filePath: tempFilePath, name: 'file', success(res){ //console.log(res); let data=typeof res.data==='string'? JSON.parse(res.data) : res.data; if(data.ret==0){ //console.log(data.data.data[0]) that.setData({ result: data.data.data[0] }); }else{ that.setData({ result: '我不知道你在說什么' }); } }, fail(err){ console.log(err); } }); }) } })
<view class="title">語音識別</view> <view class="test" bindtap="startRecord" wx:if="{{!recording}}">開始錄音</view> <view class="test" bindtap="stopRecord" wx:if="{{recording}}">停止錄音</view> <view class="result" wx:if="{{result}}"> <view class="title">語音識別結果:</view> {{result}} </view>
