最近准备做毕业设计,想搞智能家居相关的,要用到语音识别的功能。于是便有了下文...
第一步,当然是查询语音识别api,有腾讯云的,百度的,阿里的等等等等,听说百度的识别率挺高的,所以首先选择了百度的api来研究。客户端是用微信小程序写的,可能用腾讯云的语音识别会比较好对接,因为他们是一家的(我也没具体对比过,大家可以去试试)。
额度
1.百度:语音识别标准版 不限制;语音识别极速版 每账号共50000次
2.腾讯云:免费额度为每月15000次
--------下面主要说说对接百度的语音识别api---------
创建应用
首先,在百度AI开发平台控制台创建新应用,后续要用到 API Key 和 Secret Key 。然后...
小程序前端
//index.js
Page({
//长按开始录音
speechStart() {
recorderManager = wx.getRecorderManager();
const options = { //录音参数
duration: 10000, //10秒后自动停止录音
sampleRate: 16000, //采样率
numberOfChannels: 1, //录音通道数
encodeBitRate: 48000, //编码码率
format: 'PCM' //音频格式 pcm/ wav/ aac/
}
recorderManager.start(options); //开始录音
recorderManager.onStop((res)=>{ //监听录音停止
this.setData({ speeching: false });
this.uploadFile(res.tempFilePath); //上传文件操作
})
}
})
主要用微信录音api,完成录音并上传服务器。
到这里前端的代码就完成了,接下来我们用node.js写一下后台。
注意,微信开发者工具上有坑,需在真机上测试
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对象,并配置上传目标文件夹 '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);
});
}
})
})
到这里就完成了。
-------------------------------------------------手动分割-------------------------------------------------
附:给微信小程序录音文件转格式 aac -->wav/pcm
(原来小程序录音文件好像只支持.aac/.mp3:????不然为啥我有下面的内容)
转pcm操作我百度了一下,一般都是用ffmpeg命令行的方式。node.js的没有发现很多资料可以参考。所以我先试一下手动将" uploads "文件夹里上传的录音转成.pcm。来,装个包,大家可以从这里进去下载。解压后配置一下环境变量。欸最后发现语音识别是没问题的,识别率还令人满意。
然后再来用node操作命令。这里用到node的子进程,大家可以去了解一下。再新建一个文件夹用来保存转码后的音频文件(这里的文件夹名为" 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文件系统
const child_process = require('child_process'); // node子进程
var appid = "18****76";
var apikey = "Kv********Py";
var secretkey = "lT*******CU";
const client = new SpeechClient(appid, apikey, secretkey);
//上传录音完成的回调
// ***********接1.获取上传的文件。****************
const entry = `${uploadedPath}`; //需转码的文件路径
const output = `./transers/${new Date().getTime()}.pcm`; //转码后输出路径
var indos = `ffmpeg -i ${entry} -acodec pcm_s16le -f s16le -ac 1 -ar 16000 ${output}`; //ffmpeg转码命令
child_process.exec(indos, { //执行子进程
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转的可以参照一下一位大佬写的这篇blog。
将.aac文件转成wav格式。你只需要npm i fluent-ffmpeg,github地址,然后saveToFile('./transers/16k.wav')一句搞定。
//index.js
var ffmpeg = require('fluent-ffmpeg');
//上传录音完成的回调
// ***********接1.获取上传的文件。****************
var command = ffmpeg();
command.addInput(uploadedPath)
// 将.aac 变为.wav
.saveToFile('./transers/16k.wav')
.on('error', function (err) {
console.log(err);
})
.on('end', function () {
var voice = fs.readFileSync("./transers/16k.wav");
// 将录音文件转为buffer
var voiceBuffer = new Buffer(voice);
// 发送buffer到百度接口 返回语音对应的字符串
client.recognize(voiceBuffer, 'wav', 16000).then((result) => {
console.log(result);
res.json(result);
}, function (err) {
console.log(err);
});
})