Sfoglia il codice sorgente

fix(nls): 采到全静音时点名当前输入设备(定位到 Steam 虚拟麦克风)

用户回报的音轨日志:label="麦克风 (Steam Streaming Microphone)",muted=false enabled=true state=live,
但采集电平连续 20 秒 峰值=0.0000 RMS=0.0000。

根因:**浏览器抓到的是 Steam 装的虚拟输入设备 "Steam Streaming Microphone"**(永远输出静音)。
用户对着真麦说话,Chrome 在听那个虚拟设备 → 电平恒 0 → 音频"推出去了"但内容全是静音 →
网关一条识别结果都不回(也没报错)。**与协议、组帧、token 都无关**
(组帧路径已在 verify-nls-browser-path.mjs 里用真实网关证明可用)。

改法:连续 3 秒全静音时打一条**点名设备**的告警,把常见坑写进日志(虚拟设备 / 系统静音 /
隐私开关 / 被会议软件独占),并给出两步操作位置(Windows 声音设置、浏览器站点设置)。

验证:vue-tsc 无错、npm run build 通过、verify-nls-realtime 44/44。

Co-Authored-By: Claude Code <noreply@anthropic.com>
gongtianxiao 1 mese fa
parent
commit
58bd7821ac
1 ha cambiato i file con 15 aggiunte e 0 eliminazioni
  1. 15 0
      src/asr/nls.ts

+ 15 - 0
src/asr/nls.ts

@@ -110,6 +110,7 @@ export default class NlsAsr extends BaseEvent {
     this.source.connect(this.processor);
     const sampleRate = this.audioContext.sampleRate;
     let capturedChunks = 0;
+    let silenceWarned = false;
     console.log(
       `[nls] 开始采集:AudioContext=${this.audioContext.state} 采样率=${sampleRate}Hz ` +
         `processor 缓冲=${this.processor.bufferSize}`
@@ -154,6 +155,20 @@ export default class NlsAsr extends BaseEvent {
         }
         const rms = Math.sqrt(sum / channel.length);
         console.log(`[nls] 采集电平:峰值=${peak.toFixed(4)} RMS=${rms.toFixed(4)}`);
+        // 连续 3 秒全静音 → 直接把「当前用的是哪个输入设备」摊开说清楚。
+        // 实测踩过:Windows 上装了 Steam 的话,默认输入设备可能是
+        // **Steam Streaming Microphone**(虚拟设备,永远输出静音)——
+        // 表现就是 getUserMedia 成功、回调照跑、但电平恒为 0、网关一句都不回。
+        if (peak === 0 && !silenceWarned) {
+          silenceWarned = true;
+          const deviceLabel = this.stream?.getAudioTracks?.()[0]?.label || "(未知设备)";
+          console.warn(
+            `[nls] ⚠️ 连续采集到全静音:当前输入设备是 ${JSON.stringify(deviceLabel)}。\n` +
+              `[nls]    若它不是你正在说话的麦克风(常见的坑:Steam Streaming Microphone 这类**虚拟设备**、\n` +
+              `[nls]    系统静音/隐私开关、被会议软件独占),请在 Windows「声音设置 → 输入」或\n` +
+              `[nls]    浏览器「站点设置 → 麦克风」里换一个真实麦克风后重试。`
+          );
+        }
       }
       this.pendingAudio.push(encoded);
     };