处理微信同声传译插件30011问题:please wait recognition finished

一、遇到的问题

出现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,希望道友回复
原创文章 20 获赞 21 访问量 3万+

猜你喜欢

转载自blog.csdn.net/lanxing_huangyao/article/details/103542648