使用IBM Cloud API时如何发送apikey?Angular调用语音转文字接口问题
你当前的API密钥传递方式不符合IBM Cloud服务的认证规范,属于错误写法,同时代码还有其他会导致调用失败的问题,具体修正方案如下:
核心错误说明
IBM Cloud的所有Watson系列API(你当前调用的是文本转语音API,不是你描述的语音转文本,属于笔误)的API密钥认证要求使用Basic Auth认证规则:
- 需要先把字符串
apikey:<你的实际API密钥>整体做Base64编码 - 编码后的字符串前拼接
Basic前缀,再放到Authorization请求头中 - 你当前直接将未编码的
apikey:xxx放在请求头中,会直接触发401未授权错误
修正后的完整代码
getAudioFile (text: string) { // 生成符合要求的Basic认证头内容 const authHeader = 'Basic ' + btoa('apikey:' + this.apiKey); return this.http.post(this.apiUrl, { text: text }, { headers: { 'Content-Type' : 'application/json', 'Accept' : 'audio/wav', 'Authorization' : authHeader }, params: { voice: 'en-US_AllisonV3Voice' }, // 必须指定响应类型为blob,否则Angular默认将二进制音频当作JSON解析,直接抛出格式错误 responseType: 'blob' }).pipe( map(res => { // 生成可直接用于audio标签播放的音频链接 return URL.createObjectURL(res); }), catchError(this.handleError) ) }
额外注意事项
- 不要在前端生产环境代码中直接写死API密钥,前端代码可被用户抓包直接提取密钥,会导致你的IBM Cloud账号被盗用,产生不必要的资源消耗和费用,建议加一层后端代理,由后端携带API密钥调用IBM接口,前端仅调用自有后端接口即可。
- 你原有代码的map操作仅打印响应结果没有返回值,会导致后续订阅该方法的逻辑拿不到可用的音频数据,上述代码已经调整为返回可直接使用的音频对象链接。
内容的提问来源于stack exchange,提问作者Qiimiia
相关产品推荐
相关产品推荐

