今天意外发现微信小游戏也能轻松实现语音识别功能,在此记录一下。
项目背景:微信小游戏+云开发
使用接口:百度语音识别接口
步骤:
1.到百度-语音识别注册并申请语音识别服务(个人申请能有五万条免费测试),拿到AppID、APIkey和SECRETKEY
2.小游戏前端js代码
mystart(){ //开始录音按钮回调函数
let recorderManager = wx.getRecorderManager()
recorderManager.onStart(() => {
console.log('recorder start')
})
const options = {
duration: 10000,
sampleRate: 8000, //录音采样率
numberOfChannels: 1,
format: 'PCM',
}
recorderManager.start(options)
}
mypause(){ //结束录音按钮回调函数
var that=this;
wx.cloud.init()
let recorderManager = wx.getRecorderManager()
recorderManager.stop()
recorderManager.onStop((res) => {
console.log('recorder stop', res)
let tf=res.tempFilePath
that.logg.text=tf //logg是我的一个label组件的名字
setTimeout(function () {
wx.getFileSystemManager().readFile({
filePath: tf,
success: res => { //成功的回调
that.logg.text=res.data
wx.cloud.init()
wx.cloud.callFunction({
name: 'getbaidu',
data: {
sound:res.data
},
// 成功回调
success(res){
console.log("getbaidu成功",res)
that.logg.text="成功"+res.result
},
fail(res){
console.log("getbaidu失败",res)
that.logg.text="失败"+res
}
})
}})
},1000)
})
}
注意事项:
(1)录音采样率很重要,后端接口参数中的采样率要和这里设置的一样。另外,我发现当采样率为16000时,在微信开发工具上能正常语音识别,而在真机上可能会出现文件过大无法识别的情况,因此这里设成了8000。
(2)录音格式要选择‘PCM’,微信现在已经能直接录成pcm格式了,不需要再像网上很多教程那样额外地转换格式
(3)结束录音返回的是一个临时文件地址,直接把这个地址传到后端是没有用的,使用 wx.getFileSystemManager().readFile来读文件,格式选择默认的arraybuffer即可,通过 wx.cloud.callFunction传入到云函数
(4)真机上语音识别的准确率比开发者工具上高
3.后端配置
ps:下面步骤的前提是已经配置好云开发环境和node.js,这两个都可以百度出很详细的教程。
(1)在cloudfunctions中新建一个node.js云函数
(2)右击新建的云函数,在外部终端窗口中打开,在命令行中输入npm install baidu-aip-sdk安装百度sdk,安装后再输入npm install
完成后package.json里应该是这样的
(3)云函数中的index.js
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
var AipSpeechClient = require("baidu-aip-sdk").speech;
// 设置APPID/AK/SK
var APP_ID = "你的APP_ID";
var API_KEY = "你的API_KEY";
var SECRET_KEY = "你的SECRET_KEY";
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
var client = new AipSpeechClient(APP_ID, API_KEY, SECRET_KEY);
let fs = require('fs');
let voiceBuffer = Buffer.from(event.sound);
// 识别本地文件
return await client.recognize(voiceBuffer, 'pcm', 8000).then(function (result) {
console.log('<recognize>: ' + JSON.stringify(result));
return JSON.stringify(result)
}, function(err) {
console.log(err);
});
}
注意事项:
(1)云函数修改后要重新上传并部署,且上传完成会有两条消息而不是一条
(2)return await中的await很重要,否则可能返回null
4.结果展示