使用microsoft-cognitiveservices-speech-sdk出现HTTP协议不支持错误如何解决
报错根因说明
你碰到的
ERR_INVALID_PROTOCOL报错本质和你的站点使用HTTP还是HTTPS没有直接关系,是近期microsoft-cognitiveservices-speech-sdk部分小版本的内部端点拼接逻辑存在bug,会随机把微软语音服务的HTTPS接口拼接成HTTP协议,请求发出去后微软服务端不接受HTTP请求,返回的错误被SDK包装成了500状态码,所以你在两种环境下都能复现问题。
排查思路
- 先确认当前安装的SDK版本:执行
npm list microsoft-cognitiveservices-speech-sdk查看版本号,如果是1.33.0及以上版本,90%以上概率是SDK本身的bug导致。 - 打印验证SDK自动生成的端点:在初始化
speechConfig后添加日志console.log(speechConfig.speechSynthesisEndpoint),复现报错时看日志里的端点是不是http:开头。 - 排除本地代理干扰:关闭所有浏览器代理、系统代理后再次测试,排除代理把HTTPS请求转成HTTP的可能性。
解决方案
方案1:回退到稳定SDK版本(最省心)
直接把package.json中microsoft-cognitiveservices-speech-sdk的版本固定为1.32.1,删除node_modules和package-lock.json/yarn.lock后重新安装依赖即可,这个版本不存在端点拼接的bug。
方案2:强制指定HTTPS端点(不降级也可以解决)
如果不想降级SDK版本,就不要用fromSubscription方法初始化配置,改用fromEndpoint方法手动指定HTTPS协议的服务端点,直接规避SDK的拼接逻辑bug,修改后的初始化代码如下:
import * as Azure from "microsoft-cognitiveservices-speech-sdk"; // 手动拼接HTTPS端点,替换为你的服务区域 const speechSynthesisEndpoint = `https://${SPEECH_REGION}.tts.speech.microsoft.com/cognitiveservices/v1`; const speechConfig = Azure.SpeechConfig.fromEndpoint(speechSynthesisEndpoint, SPEECH_KEY); speechConfig.speechSynthesisOutputFormat = Azure.SpeechSynthesisOutputFormat.Audio48Khz192KBitRateMonoMp3; // 后续的合成器初始化、SSML、调用逻辑全部保持不变 const synthesizer = new Azure.SpeechSynthesizer(speechConfig);
本地开发额外适配
如果本地用HTTP开发服务器调试时还有偶发异常,可以给浏览器添加启动参数--allow-insecure-localhost临时放行本地的跨协议请求,生产环境无需额外配置。
内容的提问来源于stack exchange,提问作者bbullis
相关产品推荐
相关产品推荐

