一、遇到的问题
出现30011报错后,无法继续录音 ,
调用manager.stop()仍无法录音
二、原因
- manager.start(),短时间内调用了两次,
第一次的stop()没有生效,仍然是录音状态,第二次 start() 就报错
- 导致现象:30011,提示录音尚未结束
- 失效时长:并不是一直不可用,最长60秒,恢复可用状态
根据start方法中设置的duration
三、解决方式
1.思路
确保0.5秒内,不触发第二次manager.start()
2.步骤
- 1.通过setTimeout, 点击语音按钮后,延迟0.5s调用manager.start()
- 2.等到0.5s之后,setTimout开始执行,判断手指是否已离开按钮,若已离开,不再调用manager.start();
注:设置一个全局变量,记录手指是否离开按钮
3.代码(封装好的js,可直接使用)
const plugin = requirePlugin('WechatSI');
//获取全局唯一的语音识别管理器recordRecoManager
const manager = plugin.getRecordRecognitionManager();
var recordState=false; //录音状态
var content="";
var yuyinCallback = null;
initRecord();
function initRecord() {
manager.onRecognize = function (res) {
console.log("成功开始识别", res)
}
manager.onStart = function (res) {
console.log("成功开始录音", res)
}
manager.onError = function (res) {
console.error("error msg", res)
}
manager.onStop = function (res) {
let text = res.result;
console.log('结束录音,语音内容: ' + text);
//--mock start--
// text = '向上'
//--mock end---
if (!text || text.lenth == 0) {
wx.showModal({
title: '提示',
content: '听不清楚,请重新说一遍!',
showCancel: false,
success: function (res) { }
})
return;
}
content = text.replace("。","");
console.log("松开按钮到获取语音文本时间:"+(new Date().getTime()- endTime))
if (yuyinCallback){
yuyinCallback(content);
}else{
yuyinCallback = null;
}
}
}
function getRecordAuth() {
// 获取用户是否授权录音
wx.getSetting({
success: (res) => {
// 如果未授权提示用户,当前功能需要录音功能才能使用
if (!res.authSetting['scope.record']) {
wx.authorize({
scope: 'scope.record',
success() {
console.log("用户允许录音")
},
fail(res) {
wx.showModal({
title: '授权提示',
content: '该应用需要使用你的录音权限,是否同意?',
success: function (res) {
if (res.confirm) {
console.log('用户同意使用录音权限')
// 当用户第一次授权拒绝时,根据最新的微信获取权限规则,不会再次弹框提示授权,需要用户主动再设置授权页面打开授权,需要做对应的文案提示
wx.openSetting()
} else if (res.cancel) {
console.log('用户不同意使用录音权限');
}
}
})
}
})
} else {
console.log("已有录音权限")
}
}
})
}
var startTime = 0;
var endTime = 0;
var startOver = true;
var endEnable = true;
function onMikeStart(e) {
if (!startOver){
endEnable = false;
return;
}else{
startOver = false;
endEnable = true;
}
startTime = new Date().getTime();
console.log("点击开始:" + startTime)
recordState=true;
setTimeout(function(){
if (!recordState){
console.log("时间小于0.5秒,认为误点,不进行录音");
startOver = true;
return;
}
console.log("开始录音,调用manager.start()")
manager.start({
duration:30000,
lang: 'zh_CN',// 识别的语言,目前支持zh_CN en_US zh_HK sichuanhua
});
console.log("开始录音,调用manager.start完成")
startOver = true;
},500)
}
function onMikeEnd(callback) {
if(!endEnable){
return;
}
recordState=false
endTime = new Date().getTime();
console.log("点击结束:" + endTime)
let time = endTime - startTime;
console.log("按钮时间:"+time);
if(time < 500){
console.log("时间太短,不调用调用manager.stop()")
return;
}
// 语音结束识别
console.log("调用manager.stop()结束录音")
manager.stop();
console.log("调用manager.stop()结束录音完成")
yuyinCallback = callback;
}
module.exports = {
onMikeStart: onMikeStart,
onMikeEnd: onMikeEnd,
getRecordAuth: getRecordAuth
}
四、总结
- 1.查看源代码,没有暴露可强制停止的方法
- 2.copy源码,想本地运行,但其中的服务接口不让调用,扑街
- 3.其实可以不用这个插件,只使用微信本身的录音功能,把音频文件传到服务端解析,服务端集成科大讯飞的接口(但这样成本更大,也不知道是不是免费的)
- 4.如果上面的代码有bug,希望道友回复