Azure语音转文本SpeechConfig.fromAuthorizationToken()调用失败,Chrome报WebSocket错误
核心问题
你误用了fromAuthorizationToken()方法:这个方法的第一个参数需要短期授权令牌,而非直接填入订阅密钥。你使用LUIS、API管理器等非语音服务的密钥,或直接传入认知语音的订阅密钥,都会导致鉴权失败,进而引发WebSocket连接错误。
两种正确的初始化方式
方式一:直接用订阅密钥初始化(快速测试推荐)
使用SpeechSDK.SpeechConfig.fromSubscription()方法,直接传入认知语音服务的订阅密钥和对应区域,无需手动处理令牌:
const audioConfig = SpeechSDK.AudioConfig.fromStreamInput(stream); // 替换为你的认知语音服务订阅密钥和区域 const config = SpeechSDK.SpeechConfig.fromSubscription( "YOUR_COGNITIVE_SPEECH_SUBSCRIPTION_KEY", "YOUR_REGION" ); config.speechRecognitionLanguage = "en-US"; recognition = new SpeechSDK.SpeechRecognizer(config, audioConfig); recognition.startContinuousRecognitionAsync();
注意:必须使用认知语音服务(Speech Service)专属的订阅密钥,LUIS等其他服务的密钥不适用。
方式二:使用短期授权令牌(生产环境推荐)
若需使用令牌,需先通过HTTP请求获取有效期10分钟的短期令牌,再传入fromAuthorizationToken():
// 获取短期授权令牌 async function getSpeechToken() { const response = await fetch(`https://${YOUR_REGION}.api.cognitive.microsoft.com/sts/v1.0/issueToken`, { method: 'POST', headers: { 'Ocp-Apim-Subscription-Key': 'YOUR_COGNITIVE_SPEECH_SUBSCRIPTION_KEY' } }); return await response.text(); } // 初始化语音识别器 async function initRecognizer() { const token = await getSpeechToken(); const audioConfig = SpeechSDK.AudioConfig.fromStreamInput(stream); const config = SpeechSDK.SpeechConfig.fromAuthorizationToken(token, "YOUR_REGION"); config.speechRecognitionLanguage = "en-US"; recognition = new SpeechSDK.SpeechRecognizer(config, audioConfig); recognition.startContinuousRecognitionAsync(); } // 执行初始化 initRecognizer();
令牌到期后需重新获取。
额外排查点
- 确保Chrome环境:页面需有麦克风访问权限(若使用麦克风流),且运行在HTTPS环境下(localhost本地测试不受限制)。
- 区域匹配:订阅密钥对应的Azure区域必须与代码中的
YOUR_REGION完全一致(如eastus、westus)。
内容的提问来源于stack exchange,提问作者Ulekrr
相关产品推荐
相关产品推荐

