是上周的一个新调整,之前用的是永久密钥,现在需要改成临时密钥,我查了文档还下载了js版的代码改成了vue版本,在我本地上可以成功运行起来

临时密钥比永久密钥需要多传一个token

文件构成大概是这个样子,当时我是把线上项目后端返回来的数据直接写死在了config.js文件里,

/* eslint-disable */
/* global WebAudioSpeechRecognizer, config */
export let config = {
  // 用户参数
  secretKey:'',
  secretId:  '',
  appId:'',
  token: '',
}
window.config = config;
// export default config

然后params来接config里的数据传递给new WebAudioSpeechRecognize中

this.webAudioSpeechRecognizer = new WebAudioSpeechRecognizer(params);

是可以识别语音的,说明后端返回的数据没问题

线上项目是将后端返回的数据直接传递到new WebAudioSpeechRecognize中,免去了config存储数据,错就错在这儿了

但是我怎么都没找出来,因为我打印了传递前后的数据,跟本地明明是一模一样的,当时改过大小写的问题,还找过腾讯云的客服,把voice_id发给他,但是客服只说报错4002的话就要看是否传参错误,然后我就更凌乱了,因为传递之前我都console.log了都没问题

后来还是后端哥帮我发现的,在asrauthentication.js文件里有这样一段代码

// 签名函数示例
export function signCallback(signStr) {
  const secretKey = config.secretKey;
  const hash = window.CryptoJSTest.HmacSHA1(signStr, secretKey);
  const bytes = Uint8ArrayToString(toUint8Array(hash));
  return window.btoa(bytes);
}

这里用到了config!!!

于是我老老实实把后端返回的数据放到config里面再给params,然后成功了

经验:我目前还很不擅长去排错,这次也是直接接手别人的项目帮忙解决bug,下意识还是拿到手想先把这一个文件看懂(但是看不懂

其实还是直接去找到掉接口的位置,然后传递之前输出参数,都传递了没有空值那就再去本地试一下子,看看后端的数据到底有没有问题,没有问题的话那就是前端这块

当时那个报错一直让我以为是传递数据不对

现在想想这个报错就是在提示我去看签名的那块逻辑

希望下次可以自己独立解决难bug!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐