uniapp百度语音识别ios手机超级大坑

459 阅读2分钟

超级超级大坑,用时两天,最近老板跟我提了一个需求,希望实现语音转文字,我寻思这有啥难的,结果写了三天

大坑是安卓手机百度语音识别文字毫无问题,但是ios同样的写法确实怎么识别都不对,转换的什么牛马话。

获取设备信息

const systemInfo = uni.getSystemInfoSync();

语音开始的时候,ios得用wav格式的后缀,百度语音识别才可以识别正确。 但是uniapp没有wav的内置选项,只能设置pcm,但是实际输出是wav格式,这是uniapp的bug

// 准备开始录音
const startVoice = (e) => {
  recording.value = true;
  isStopVoice.value = false;
  canSend.value = true;
  voiceIconText.value = '正在录音...';
  pointY.value = e.touches[0].clientY;
  // ios端设置pcm获取的文件是wav,大恶心bug
  Recorder.start({
   format: systemInfo.platform === 'ios' ? 'pcm' : 'mp3',
  });
};

因为百度语音识别需要base64字符串,所以我就封装了一个适用于app的方法


/**
 * 录音语音文件转base64字符串
 * @param {Object} path
 * @param callback
 */
export function audio2dataURL(path, callback) {
  plus.io.resolveLocalFileSystemURL(path, function (entry) {
   entry.file(
    function (file) {
     const reader = new plus.io.FileReader();
     reader.onloadend = function (e) {
      callback({
       code: 0,
       message: '读取成功!',
       data: e.target.result,
       size: file.size,
      });
     };
     reader.readAsDataURL(file);
    },
    function (e) {}
   );
  });
}

调用方法转化为base64,还要获取size,接口需要

audio2dataURL(tempFilePath, ({ code, data, size }) => {
  if (code === 0) {
   const base64 = data.split(',')[1];
   uploadFile(base64, size);
  }
});

语音转文字,这里需要尤其注意format和rate两个选项,他需要判断平台差异,他们需要的参数都不一样,这样调用百试百灵

const uploadFile = (speech, len) => {
  serverApi({
   format: systemInfo.platform === 'ios' ? 'wav' : 'm4a',
   rate: systemInfo.platform === 'ios' ? 8000 : 16000,
   dev_pid: 1537,
   channel: 1,
   token: accessToken.value,
   cuid: 'AL2TpZPxiNp5sDHqv7Q3GaoShIMSBhYF',
   len,
   speech, // xxx为 base64(FILE_CONTENT)
  }).then((data) => {
   console.log(data);
   if (data.err_no === 0) {
    // 用户语音输入文字
    text.value = data.result[0];
    getTextToWorkTask(); // 调用方法依次执行任务
   }
  });
};

如果这样还不行你找我,我来跟你研究,如果觉得对你有帮助请点赞收藏,之后你肯定会用到,我的口号是:你的大坑我来踩