|
|
@@ -4280,6 +4280,50 @@ payload 里含模型里**不存在**的列时,`addContent` 会忽略该列照
|
|
|
切换说明)、`current-api-call-sites.md`(§0 A 表第 6 行、§三 的旧路径标注为已删)、
|
|
|
`asr-realtime.md`(历史文档里指向已删文件的**链接**改成纯文本,避免 404 链接)
|
|
|
|
|
|
+### 续 41:语音「不出字」的根因是系统选了个虚拟麦克风(用户问「为什么之前没这问题」)
|
|
|
+
|
|
|
+**用户反馈**:切到 NLS 后浏览器里「进了录音状态但是不出字」。
|
|
|
+诊断日志(用户在 Console 里看到的原文):
|
|
|
+```
|
|
|
+[nls] 开始采集:AudioContext=running 采样率=48000Hz processor 缓冲=2048
|
|
|
+[nls] 音轨:label="麦克风 (Steam Streaming Microphone)" muted=false enabled=true state=live
|
|
|
+[nls] 采集电平:峰值=0.0000 RMS=0.0000 ← 连续 20 秒全 0
|
|
|
+[nls] ← TranscriptionStarted
|
|
|
+[nls] 已推音频 2000ms(20 帧)… 34000ms ← 音频确实在推
|
|
|
+```
|
|
|
+**根因**:Chrome 抓到的是 **Steam Streaming Microphone**(装 Steam 时装的**虚拟输入设备**,
|
|
|
+永远输出静音)。用户对着真麦说话,浏览器在听那个虚拟设备 → 音频"推出去了"但全是 0 →
|
|
|
+网关一条结果都不回、也不报错(格式没错,所以没有 TaskFailed)。
|
|
|
+**换回真实麦克风后正常**(用户 2026-09-24 确认)。
|
|
|
+
|
|
|
+**排除过程(都留了证据)**:
|
|
|
+1. 先在 node 里**复刻浏览器那条采集/组帧路径**打真实网关(新增
|
|
|
+ [`harness/tools/verify-nls-browser-path.mjs`](tools/verify-nls-browser-path.mjs):
|
|
|
+ 同一份 `encodePcm16kMono`、同样 2048 样本分块、同样 42.7ms 入队 + 50ms 拼帧)
|
|
|
+ → **识别正确**,证明组帧/重采样/协议都没问题
|
|
|
+2. 采集端加电平日志 → 定位到"流是静的"
|
|
|
+3. 加音轨状态日志 → `label="麦克风 (Steam Streaming Microphone)"` 一击命中
|
|
|
+
|
|
|
+**用户问「为什么之前没这个问题」——答:大概率是"之前没试过这条路"**,证据两条:
|
|
|
+- **采集路径与旧实现一字不差**(`git show 6783c69^:src/three-libs/asr/index.ts` 对比):
|
|
|
+ 旧的也是 `getUserMedia({audio:true,video:false})` + `createMediaStreamSource` →
|
|
|
+ `createScriptProcessor(0,1,1)` → `connect(destination)` → `source.connect(processor)`。
|
|
|
+ 选哪台设备由 **Chrome/Windows 决定**,两版代码在这里没有任何差别 ——
|
|
|
+ 旧实现遇到同一台虚拟麦,表现会完全一样。
|
|
|
+- **记录里从来没有「语音输入可用」的正面确认**(grep 全仓库只有"厂商若失效会不可用"这类预警)。
|
|
|
+ 即便到切 NLS 那一轮,我写的仍是「浏览器实测没做…请用户点一次麦克风」。
|
|
|
+ 所以"切换后正常了"很可能是这条路径**第一次真正跑通**。
|
|
|
+- 另一种可能是**系统默认输入设备在那之后被改过**(装/启动 Steam、插拔耳机、驱动更新都可能
|
|
|
+ 把默认设备换成虚拟麦)—— 那是应用外的变化,代码侧无从感知。
|
|
|
+
|
|
|
+**代码侧的改进(把这次排查固化下来)**:
|
|
|
+- 连续 3 秒全静音 → 直接**点名当前输入设备**并列出常见原因(虚拟设备 / 系统静音 /
|
|
|
+ 隐私开关 / 被会议软件独占)+ 两步操作位置
|
|
|
+- 采集开始打**音轨自身状态**(label / muted / enabled / state / deviceId / 声道),
|
|
|
+ 并监听 `mute` / `unmute` 事件
|
|
|
+- 采集/发送/下行全链路诊断日志(`[nls]` 前缀):第一块音频的输入输出尺寸、推流进度、
|
|
|
+ 每 2s 电平、网关事件名与结果、TaskFailed 原文、以及"录着音却一帧没发出去"的兜底告警
|
|
|
+
|
|
|
### 续 40:修「界面卡在正在初始化,请稍候...」(我上一轮删出来的回归)
|
|
|
|
|
|
**用户反馈**(截图:整页模糊 + 中间一行「正在初始化,请稍候...」):「现在界面有问题」。
|