…
连接中…
未录制
处理链路
处理档位
点档位=切换并加载;自检测会在必要时自动升降档(降档底线=天元默认)
LocalVQE
降噪
目标峰值电平
未加载。勾选模块后点击「确认加载链路」。
实际生效:未连接麦克风
勾选只做标记,不会立即生效,也不会触发下载或改变下面的状态显示;点击「确认加载链路」后才会按当前勾选
重新采集麦克风并加载整条链路(模块按需下载),状态与 RTF 等显示随之更新。
链路顺序:麦克风 → 浏览器 3A(采集端)→ LocalVQE → 降噪(RNNoise / GTCRN / 服务端RNNoise,四选一)→ 残响噪声门 → AGC2 → 上行; LocalVQE 的参考信号 = 扬声器播放内容(所有远端音轨之和)。
「服务端RNNoise」需要服务端用 direct(SFU)模式运行:降噪在服务端的转发链路上完成, 位置在本地的残响噪声门与 AGC2 之后,浏览器内不再运行降噪模块;别人的音轨仍然是每人一条, 所以每个人的电平显示不受影响;服务端每路的耗时与实时率会显示在下面的状态行里。
链路顺序:麦克风 → 浏览器 3A(采集端)→ LocalVQE → 降噪(RNNoise / GTCRN / 服务端RNNoise,四选一)→ 残响噪声门 → AGC2 → 上行; LocalVQE 的参考信号 = 扬声器播放内容(所有远端音轨之和)。
「服务端RNNoise」需要服务端用 direct(SFU)模式运行:降噪在服务端的转发链路上完成, 位置在本地的残响噪声门与 AGC2 之后,浏览器内不再运行降噪模块;别人的音轨仍然是每人一条, 所以每个人的电平显示不受影响;服务端每路的耗时与实时率会显示在下面的状态行里。
在线用户
回声自检测 RED 神经网络残余回声(原始 ref vs tap2(残响噪声门后/AGC2 前),0.5s 一块)· 回声标记 → 自动处置
未启用
档位:—
回声判决—等待数据
NN 残余回声—神经网络残余回声(framep90) · 阈值 存在0.15/持续0.15
ref→mic 时延 τ1—GCC-PHAT 中位数聚合 · btau1
最差 RTF—
自动处置记录时间 · 判决 · 动作(最新在下)
(未启用)
检测点 tap2 = 残响噪声门之后、AGC2 之前(AGC2 关闭时为链尾;原 tap 仍在 AEC 之后,仅供 τ2)。
判据是 RED 神经网络(残余回声占比掩蔽 0~1):
主线程每 0.5s 把 原始 ref(扬声器播放内容,未补延迟)与 原始 tap2(噪声门后/AGC2 前)
各 8000 采样送进 onnxruntime-web 推理,不做时延对齐(模型自己面对环路延迟);
判决分数 = 块内每帧取 40 个 mel 带的 90 分位再对帧取均值(framep90)。
τ 估计(两条独立 GCC-PHAT 通道,最大 1.5s:τ1 = ref→mic、τ2 = ref→原 tap)
只服务链路侧补延迟 h 决策,不参与回声判据。每 0.5s 产出一个窗估计,对外 τ = 最近 13 个窗的中位数
(满载跨度 6.0s、中位滞后 3.0s;超过 7s 的旧窗一律丢弃,抗单窗伪峰;旧的「接受/拒绝 + 前向填充」已删除)。
模型不可用/超时时报告 nnScore=null + state=nnUnavailable/nnLoading, 不用旧 γ² 兜底(处置层只观测不动作)。分数按两条独立可调的阈值标记: ① 最近 4 点均值 ≥ 0.15 → 存在回声;② 最近 12 点中 ≥6 点 ≥ 0.15 或 ③ 最近 16 点(8s)中 ≥8 点 ≥ 0.15 → 持续存在回声 (阈值与窗口在 echo-detect-core.js 的 MARK_RULES 统一配置:thrEcho / thrPersist; 0.15 阈值的真实录音标定见 docs/echo-guard.md)。
处置(仅在「开启自动处置」后生效,v4 阶梯编号 S/J/B/G/SB):① 存在回声(未持续)→ 任意档位一律提示「检测到存在回声,正在尝试消除;若您无发言需求,建议您手动关闭麦克风。」 (每条提示并列展示、保持 10s,互不覆盖);
② 持续存在回声 → 低档:RTF ≥2.4 时按 btau1 升档(btau1 ≥300ms 则升档并补 h = btau1−120ms),RTF 不足或未知则关麦(RTF 无效不做换挡、视作升档不可行);中档 h=0:btau1 ≥300ms 先补 h(只看 btau1)、 否则 RTF ≥2.4 且前序档位不为高才升档,不然关麦;高档 h=0:btau1 ≥300ms 补 h,否则关麦;
③ h>0 时若 btau1 与 h+120ms 相差 ≥120ms → 重设 h(btau1 ≥300ms)或撤销补偿(btau1 <300ms); 漂移 <120ms 则保持 h:中档按 RTF 决定升档 / 关麦,高档直接关麦。自定义链路只补/调 h,永不自动升档/关麦。
btau1 未知(无新鲜测量或已过期)时一律等待,不升档、不关麦(τ 未知≠延迟小;唯一例外是最低档 RTF 不足/未知时仍按 G.1 关麦,那是 RTF 判据);RTF 无效视作升档不可行。每次 h 更新都会暂停回声检查 ≥3s(等 AEC 重新收敛); 每次升档提示「正在启用更高级去回声/降噪算法」。
防 ping-pong:前序档位(降档后不立即升回高)、改档 8s 冷却、10 分钟内最多 6 次自动改档(冻结)、 阶梯节流 8s、链路重建后 6s 预热;手动切档 / 调整链路 / 确认加载 / 换麦会自动关闭自动处置并清零 h, 手动关麦则暂停自动处置、再开麦自动恢复(检测继续运行)。完整原理见 docs/echo-guard.md。
模型不可用/超时时报告 nnScore=null + state=nnUnavailable/nnLoading, 不用旧 γ² 兜底(处置层只观测不动作)。分数按两条独立可调的阈值标记: ① 最近 4 点均值 ≥ 0.15 → 存在回声;② 最近 12 点中 ≥6 点 ≥ 0.15 或 ③ 最近 16 点(8s)中 ≥8 点 ≥ 0.15 → 持续存在回声 (阈值与窗口在 echo-detect-core.js 的 MARK_RULES 统一配置:thrEcho / thrPersist; 0.15 阈值的真实录音标定见 docs/echo-guard.md)。
处置(仅在「开启自动处置」后生效,v4 阶梯编号 S/J/B/G/SB):① 存在回声(未持续)→ 任意档位一律提示「检测到存在回声,正在尝试消除;若您无发言需求,建议您手动关闭麦克风。」 (每条提示并列展示、保持 10s,互不覆盖);
② 持续存在回声 → 低档:RTF ≥2.4 时按 btau1 升档(btau1 ≥300ms 则升档并补 h = btau1−120ms),RTF 不足或未知则关麦(RTF 无效不做换挡、视作升档不可行);中档 h=0:btau1 ≥300ms 先补 h(只看 btau1)、 否则 RTF ≥2.4 且前序档位不为高才升档,不然关麦;高档 h=0:btau1 ≥300ms 补 h,否则关麦;
③ h>0 时若 btau1 与 h+120ms 相差 ≥120ms → 重设 h(btau1 ≥300ms)或撤销补偿(btau1 <300ms); 漂移 <120ms 则保持 h:中档按 RTF 决定升档 / 关麦,高档直接关麦。自定义链路只补/调 h,永不自动升档/关麦。
btau1 未知(无新鲜测量或已过期)时一律等待,不升档、不关麦(τ 未知≠延迟小;唯一例外是最低档 RTF 不足/未知时仍按 G.1 关麦,那是 RTF 判据);RTF 无效视作升档不可行。每次 h 更新都会暂停回声检查 ≥3s(等 AEC 重新收敛); 每次升档提示「正在启用更高级去回声/降噪算法」。
防 ping-pong:前序档位(降档后不立即升回高)、改档 8s 冷却、10 分钟内最多 6 次自动改档(冻结)、 阶梯节流 8s、链路重建后 6s 预热;手动切档 / 调整链路 / 确认加载 / 换麦会自动关闭自动处置并清零 h, 手动关麦则暂停自动处置、再开麦自动恢复(检测继续运行)。完整原理见 docs/echo-guard.md。