最近準(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);
});
})