目录
一、微信录音
使用微信自带的录音接口进行录音。这一部分非常麻烦,因为需要向微信官方申请权限,官方那边要求特别多,经历了一而再再而三的修改和与微信小程序客服的够同,最终是成功申请下来了录音的权限。
需要现在页面上方创建一个RecorederManager,如下:
let recorderManager = wx.getRecorderManager();
使用其中的四个功能。
其一是start。标志着录音从此刻开始。其中的options是录音的一些参数,我们这里将参数设置为百度语音识别接口中所要求的录音参数。
recorderManager.start(options);
百度语音识别要求音频文件最长时间为1分钟,采样率为16000,numberOfChannel为1,encodeBitRate为24000-64000之间,推荐为48000,音频格式为pcm等格式。Options如下:
let options = {
duration: 60000,
sampleRate: 16000,
numberOfChannels: 1,
encodeBitRate: 48000,
format: 'pcm',
}
其二是OnStart。其功能是监听录音开始的事件,我们这里用来显示录音是否开始,以便进行测试和调试。
recorderManager.onStart(() => {
console.log("Start Recording!")
})
其三是stop。标志着录音从此刻开始。
recorderManager.stop();
其四是OnStop。这个是监听录音结束事件的,会返回录音的音频临时地址TempFilePath。这个函数也是最最最最最让人无语的,因为经常性的不执行,而且还是间歇性的不执行。微信小程序开发社区中有29页反应这个问题。
我们需要接收临时的音频地址并储存,然后得到音频文件的长度,即bit数,这是组成向百度语音识别接口传递的json文件的必须品。因此调用wx.getFileInfo得到其长度。
完整的代码如下所示:
stopRecord: function() {
this.setData({
isRecording: false,
recordingTipVisible: false
});
recorderManager.stop();
recorderManager.onStop((res) => {
console.log("End Recording!")
this.setData({
tempVoicePath: res.tempFilePath
});
// 获取语音文件的长度
wx.getFileInfo({
filePath: this.data.tempVoicePath,
success: (res) => {
this.setData({
VoiceLength: res.size
})
console.log("length", res.size)
this.Recognize();
},
fail: (error) => {
console.log("fail", error)
}
})
})
},
二、百度语音识别
上一篇博客提到我们需要用Apikey和SecretKey通过百度智能云提供的接口换取token进行语音识别,我们这里不过多赘述,代码如下(Apikey和SecretKey已经码住):
// 获取token
getToken: function() {
const url = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + Apikey + '&client_secret=' + SecretKey;
wx.request({
url: url,
method: 'POST',
success: (res) => {
console.log("access_token", res)
this.setData({
token: res.data.access_token
})
}
})
},
我们需要把上面得到的音频文件和音频文件的长度、采样等信息一同打包成json文件发送给百度语音识别接口,然后得到返回值。
如果未能连接到百度语音识别的服务器或识别结果为空,我们会弹窗显示语音识别失败。
如果成功识别我们会把识别得到的信息添加到data.msg中,由于百度这个语音识别准确性不高,因此我们的返回信息会填到输入框中,供用户进行修改。然后点击发送即可发送内容。
代码如下:
// 获取语音识别
Recognize: function() {
console.log("filePath: ", this.data.tempVoicePath)
console.log("token:", this.data.token)
console.log("VoiceLength", this.data.VoiceLength)
wx.getFileSystemManager().readFile({
filePath: this.data.tempVoicePath,
encoding: 'base64',
success: (res) => {
wx.request({
url: 'http://vop.baidu.com/server_api',
data: {
token: this.data.token,
cuid: "zhaoxuhuihuixuzhao",
format: "pcm",
rate: 16000,
channel: 1,
speech: res.data,
len: this.data.VoiceLength
},
headers: {
'Content-Type': 'application/json'
},
method: "POST",
success: (res) => {
if (res.data.result == '') {
console.log("error", res)
wx.showToast({
title: "语音识别失败",
icon: "error",
duration: 1000
})
} else {
console.log("test", res.data)
this.setData({
msg: res.data.result
})
}
},
fail: (res) => {
console.log("error", res)
wx.showToast({
title: "语音识别失败",
icon: "error",
duration: 1000
})
}
})
}
})
},