1、概述通過微信小程序wx.startRecord()和wx.stopRecord()接口錄音并上傳silk錄音文件至服務器,通過ffmpeg將silk錄音文件轉(zhuǎn)成wav錄音文件,再通過百度語音識別 REST API 獲取語音識 ...
//index.js
//開始錄音。當主動調(diào)用wx.stopRecord,
//或者錄音超過1分鐘時自動結(jié)束錄音,返回錄音文件的臨時文件路徑。
//當用戶離開小程序時,此接口無法調(diào)用。
wx.startRecord({
success: function (res) {
console.log('錄音成功' + JSON.stringify(res));
that.setData({
voiceButtonName: '語音識別',
voicePlayButtonName: '開始播放',
tempFilePath: res.tempFilePath
})
//上傳語音文件至服務器
wx.uploadFile({
url: 'https://你的域名/upload',
filePath: res.tempFilePath,
name: 'file',
// header: {}, // 設置請求的 header
formData: {
'msg': 'voice'
}, // HTTP 請求中其他額外的 form data
success: function (res) {
// success
console.log('begin');
console.log(res.data);
var json = JSON.parse(res.data);
console.log(json.msg);
var jsonMsg = JSON.parse(json.msg);
console.log(jsonMsg.result);
wx.navigateTo({
url: '../voicePage/voicePage?voiceData=' + jsonMsg.result.join('')
})
},
fail: function (err) {
// fail
console.log(err);
},
complete: function () {
// complete
}
})
},
fail: function (res) {
//錄音失敗
that.setData({
voiceButtonName: '語音識別'
})
console.log('錄音失敗' + JSON.stringify(res));
}
})
setTimeout(function () {
//結(jié)束錄音
wx.stopRecord()
}, 60000)
node.js服務端接收語音文件代碼
//upload.js
//使用koa-multer這個組件
var multer = require('koa-multer');
var router = require('koa-router')();
var path = require('path');
//存儲文件至path.resolve('./voice-file')路徑
var upload = multer({ dest: path.resolve('./voice-file')});
router.post('/', upload.single('file'), async function (ctx, next) {
//這是就文件的具體信息
console.log(ctx.req.file);
});
silk文件轉(zhuǎn)wav文件
我使用的是silk-v3-decoder將silk文件轉(zhuǎn)wav文件
//upload.js
var exec = require('child_process').exec;
function silkToWav(file){
return new Promise(function (resolve, reject) {
exec('sh converter.sh ' + file + ' wav', function(err,stdout,stderr){
if(err) {
resolve({
result : false,
msg : stderr
});
} else {
//var data = JSON.parse(stdout);
console.log(stdout);
console.log(stderr);
//console.log(err);
resolve({
result : true,
msg : ''
});
}
});
});
}
1、通過API Key和Secret Key獲取的access_token
//speech.js
speech.getAccessToken = function(){
return new Promise(function (resolve, reject) {
request({
url: 'https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=(你自己的API key)&client_secret=(你自己的Secret Key)',
method: 'get',
headers: {
'content-type': 'application/json'
}
}, function (error, response, data) {
if (error){
resolve({
'result' : false,
'msg' : '出現(xiàn)錯誤: ' + JSON.stringify(error)
});
}else {
resolve({
'result' : true,
'msg' : data
});
}
});
});
}
2、通過token 調(diào)用百度語音識別 REST API識別接口
//speech.js
speech.recognize = function(base64String, size){
return new Promise(function (resolve, reject) {
request({
url: 'http://vop.baidu.com/server_api',
method: 'post',
headers: {
'content-type': 'application/json'
},
// len + speech方式
body: JSON.stringify({
"format":"wav",
"rate":16000,
"channel":1,
"token":'(你的token)',
"cuid":"9e:eb:e8:d4:67:00",
"len":size,
"speech":base64String
})
//url + callback方式
//body: JSON.stringify({
// "format":"wav",
// "rate":16000,
// "channel":1,
// "token":'(你的token)',
// "cuid":'9eebe8d46700',
// "url":'http://ihealth-wx.s1.natapp.cc/download?name=123.wav',
// "callback":'http://ihealth-wx.s1.natapp.cc/callback'
//})
}, function (error, response, data) {
if (error){
resolve({
result : false,
msg : '出現(xiàn)錯誤: ' + JSON.stringify(error)
});
}else {
resolve({
result : true,
msg : data
});
}
});
});
}
通過上述操作后,發(fā)現(xiàn)識別的內(nèi)容和實際內(nèi)容差別很大
查看文檔可知:采樣率:8000/16000 僅支持單通道
在ffmpeg里對應的設置方式分別是:
-ar rate 設置采樣率
-ac channels 設置聲道數(shù)
修改converter.sh文件,修改為下圖所示
工作日 8:30-12:00 14:30-18:00
周六及部分節(jié)假日提供值班服務