You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue.js项目中Azure Cognitive Speech SDK麦克风调用报错问题

Vue项目中使用microsoft-cognitiveservices-speech-sdk点击麦克风报错的解决方案

问题分析

你提供的代码存在几个明显问题,同时结合语音SDK的使用规范,这些是导致报错的核心原因:

  • 错误使用await创建实例:SpeechRecognizer是同步构造函数,不需要加await,这会引发逻辑错误
  • 未处理麦克风权限:浏览器需要用户主动授权麦克风访问,无授权会直接触发报错
  • 实例管理混乱:多次点击可能重复创建recognizer实例,导致资源冲突
  • 错误回调参数类型错误:recognizeOnceAsync的错误回调参数是SpeechRecognitionCanceledEventArgs而非字符串,原代码无法正确解析报错信息

修正后的代码

import * as SDK from "microsoft-cognitiveservices-speech-sdk";
import { RecognitionResult, SpeechRecognitionCanceledEventArgs } from "microsoft-cognitiveservices-speech-sdk";

// 全局维护recognizer实例,避免重复创建
let recognizer = null;

export default {
  data() {
    return {
      subscriptionKey: "", // 替换为你的Azure语音订阅密钥
      serviceRegion: "", // 替换为你的服务区域(如eastus)
      isMicClicked: false,
      capturedText: ""
    };
  },
  methods: {
    async startSpeechRecognition() {
      // 已有实例则先销毁,避免冲突
      if (recognizer) {
        recognizer.close();
        recognizer = null;
        this.isMicClicked = false;
        return;
      }

      try {
        // 主动请求麦克风权限
        const mediaStream = await navigator.mediaDevices.getUserMedia({ audio: true });
        mediaStream.getTracks().forEach(track => track.stop()); // 临时释放,交给SDK接管

        // 初始化语音配置
        const speechConfig = SDK.SpeechConfig.fromSubscription(
          this.subscriptionKey,
          this.serviceRegion
        );
        speechConfig.speechRecognitionLanguage = "en-US";
        const audioConfig = SDK.AudioConfig.fromDefaultMicrophoneInput();
        
        // 同步创建识别器实例
        recognizer = new SDK.SpeechRecognizer(speechConfig, audioConfig);

        this.isMicClicked = true;

        // 单次识别回调
        recognizer.recognizeOnceAsync(
          (result: RecognitionResult) => {
            console.log("识别结果:", result);
            this.capturedText = result.text;
            this.cleanupRecognizer();
          },
          (event: SpeechRecognitionCanceledEventArgs) => {
            // 解析具体错误信息
            let errorMsg = "";
            if (event.errorDetails) {
              errorMsg = event.errorDetails;
            } else if (event.reason === SDK.CancellationReason.EndOfStream) {
              errorMsg = "语音输入已结束";
            } else {
              errorMsg = `识别取消:${SDK.CancellationReason[event.reason]}`;
            }
            console.error("识别失败:", errorMsg);
            this.cleanupRecognizer();
          }
        );
      } catch (permError) {
        console.error("麦克风权限被拒绝:", permError);
        this.isMicClicked = false;
      }
    },
    cleanupRecognizer() {
      // 统一清理实例状态
      this.isMicClicked = false;
      if (recognizer) {
        recognizer.close();
        recognizer = null;
      }
    },
    setCapturedText(text) {
      this.capturedText = text;
    }
  },
  beforeUnmount() {
    // 组件销毁时强制清理资源
    this.cleanupRecognizer();
  }
};

额外排查步骤

  • 验证配置正确性:确认subscriptionKey和serviceRegion与Azure语音资源的配置完全一致,区域必须使用短代码(如eastus,不能用全称)
  • 检查浏览器权限:在地址栏左侧权限图标中,确认麦克风权限已设置为"允许"
  • 查看详细错误:通过错误回调中的event.errorDetails获取SDK返回的具体报错原因(如密钥无效、网络超时、区域不匹配等)

内容的提问来源于stack exchange,提问作者Sonali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:43:31