Files
ArtPlayer/refactor/changes/2026-09-13-PKG-ASR-08-capture-output.md
T

44 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PKG-ASR-08:阻止捕获回退额外播放声音
子代理复核指出 captureStream 回退不拥有原播放路由,源码却把原始捕获音轨
接到 gain=1 和 destination。主代理用外部原生 AudioContext 先绑定同一 video,
保持其播放图运行,让 Chromium 自然拒绝 ASR 的第二次媒体源绑定并进入回退。
原生测试证明 2.1.0 和 ASR-07 候选都产生额外输出,视频静音后该分支仍非零。
修复前两个候选核心组合在“ASR 输出必须为零”的断言失败,保留报告与 trace。
## 实现与契约
回退改为 `capture source -> recorder -> gain(0) -> destination`,保持 Worklet
处理活跃而不输出声音;直接绑定仍是自己的播放路由,使用 gain=1。暂停、停止、
切源和销毁复用现有归属模型。回调继续收到非零 PCM,不靠静音输入掩盖问题。
不改变媒体元素 muted/volume,不关闭外部 owner context,不修改公开 API、类型或版本。
captureStream 的 PCM 可不受媒体静音/音量影响,而直接路径跟随主 video。文档现在
明确区分两者;此前未限定路径的概括已修正。这个修复阻止额外可听分支,不能解释为
“视频静音后停止识别”;调用方仍使用 stop/pause 控制采集生命周期。
五项新单测由子代理独立编写并先得到全红;主代理集成后,检测出测试 helper 把
Worklet 浅拷贝为两个对象,导致节点清理列表观察到旧连接。已修正 helper 登记真实
对象身份,完整历史/候选测试重新验证,不以删除清理断言通过。
## 原生验证的边界
Firefox 实际允许重复创建 MediaElementAudioSource,两条原生播放分支都有信号,
因此它不会自然进入本回退。这一探测结果与四个失败报告保留,单独登记未闭环的
ASR-FOREIGN-01。Firefox 的回退验证显式强制绑定拒绝,其余 captureStream、轨道、
采样、Worklet 和音频 analyser 全为原生,报告标记 forcedException=true。
不能把受控拒绝说成 Firefox 自动识别外部音频图,也不能改成 skip 后宣称通过。
测试覆盖采集非零、ASR 输出零、原播放图静音、stop 只关闭自己、恢复时新轨道、
切源后旧轨道结束且新源重新输出 PCM、destroy 最终关闭自己的 context。
Firefox close 是异步的,校验使用有界轮询等待 state=closed,保持同步 destroy API。
验证记录见 [捕获回退证据](../baselines/asr-fallback-validation.json)。正常三格式
构建与副本、strict/lint、213 项定向、main/legacy 各 30 项、实际隔离安装声明矩阵
以及 source/main/legacy 原生组均记录确切输入。原生组还重跑直接路径音量和已有
采集生命周期。Windows WebKit 无 WebAudio 的结果仍为能力跳过,不代表 Safari。
本项只关闭“已进入捕获回退后额外输出”的缺陷,ASR-05 的外部双 owner、CORS、
audio-track 组合、更多核心和设备门槛继续保留。离线 demo 与 5.3.0 对照基线也由
ASR-05 独立验收。本次未做整仓 CI、推送或发布;回退会恢复静音仍有额外输出的缺陷。