这 85 个百分点不是靠换模型、调提示词换来的,全部收益来自两件事:把物理接线改对,以及把一个不再需要的开关关掉。
虚拟声卡白话:播放进一头,另一头就变成麦克风,全程数字、零比特经过空气。
| 角色 | 白话 | 双线态落点 |
|---|---|---|
| 面试页扬声器 | 面试官声音的出口 | Hi-Fi Cable Input |
| 助手 iv 录音端 | AI 应聘者的耳朵 | Hi-Fi Cable Output |
| 答案注入口 | 合成语音播进去的地方 | CABLE Input |
| 平台麦克风 | 平台以为在听真人 | CABLE Output |
单线态 = 四个角色全指 CABLE 一根线;双线态 = 面试官走 Hi-Fi,答案走 CABLE。
行首锚定陷阱:Hi-Fi Cable Output 与 CABLE Output 互为后缀子串,朴素包含匹配会先命中 Hi-Fi 线 → 两个角色一起指错且不报错;还要容忍系统给默认设备加的 默认值 - / 通信 - 前缀。已固化为 config.DEV_PREFIX。
宁可匹配不上,也不能匹配错。匹配不上会报错、会被看见;匹配错了只是安静地把声音送到错误的地方。
单线下答案注入口与 iv 录音端在同一根线 → 助手在自己说话的同时把自己的话一字不落听了一遍,这就是自激。
后果是污染:转写流里既有面试官问句也有自己的答案,而「面试官说完了没」「该不该开口」「下一轮答什么」全建立在这锅粥上。
想靠软件在下游做分离很难做干净,两路声音叠加后没有天然标签告诉你哪个字属于谁。
BRIDGE_PAUSE_IV:播报前发 pause 停止采集,播完发 resume 恢复。逻辑链条无懈可击,也确实生效——自激消失,转写流干净。
反直觉钩子 1:它在推理链上完全正确,在物理上完全错误。它以为关掉的是回声,实际关掉的是耳朵——耳朵没有选择性。
这类错误不以错误的形式出现:不崩、不报红、日志无异常,只是转写短一截,看起来特别像 ASR 偶尔抽风(会被归因给外部引擎)。
反直觉钩子 2:越谨慎、越安全的开关损失越大——它不制造错误,只把输入悄悄削掉一半。错误触发排查,削减不会。
教训不是「要更仔细」,而是这类检查必须固化成脚本,否则只在有人较真时才发生。
2026-10-06 20:15 双线恢复:两根虚拟声卡、四个端点统一 24bit / 48000Hz(bit-perfect 硬要求),面试官走 Hi-Fi,答案走 CABLE。
助手物理上听不到自己 → 自激不是被压制,是不存在 → 开关失去存在理由,BRIDGE_PAUSE_IV 改回 false。暂停/恢复接口保留为降级手段,当前为空操作。
再打开的硬规矩:不许凭感觉,必须先跑双线验收脚本看到每根线电平峰值达标。已升级为冻结项 R-FREEZE-002,冻结那个 false。
为症状打的补丁,在根因消失之后必须被显式摘掉。不摘,它就会从补丁变成新的根因。
证据目录 autobot/data/probe/verify_20261006-203959/(2026-10-06 20:39:59 起)。
audio_probe.json,20:42 落盘):注入方向 rms 峰值 0.23498、录回 130494 字节、送达率 dice = 1;接收方向听对率 dice = 1;阻塞项空 / 警告项空 / 总判定通过。最容易被忽略的那句提示:设备名存在 ≠ 线导通,请以实测峰值为准。
本期全是声音路由的工程问题,未动平台任何东西,未做任何反检测与伪装,摄像头里始终是真人。这个立场从头到尾没变过。
README.md §5 定型架构 + 单线历史态说明(18:50~20:15,听对率 100% → 15%~62%)、§5 参数速查、§10 责任矩阵;CODEBUDDY.md 双线段与 config.DEV_PREFIX;autobot/config.js 设备正则与 BRIDGE_PAUSE_IV 注释(13 条问句 11 条只到第一句、R-FREEZE-002);autobot/data/probe/verify_20261006-203959/(line_probe / enum_dev / check_env / audio_probe)。