refactor(asr): [PKG-ASR-03] own typed audio capture and playback lifetimes

This commit is contained in:
Harvey Zhao committed 2026-09-13 14:44:23 +08:00
1 parent 53c295819d
commit 0cf2af4840
33 files changed
+3492 -809

No files matched your search

@@ -0,0 +1,62 @@
# PKG-ASR-03:拆分 ASR 并修复音频归属
从 53c295819db004e507b35689a7bdec1955e08396 开始,将单个生产 JS 文件拆成
8 个严格 TypeScript 模块。公共声明不在本任务改写,ASYNC/旧工厂类型与实际安装
消费者仍由 PKG-ASR-04 验收。无新依赖,版本不变,正常构建生成三格式及 docs 副本。
## 结构改动
index 只承担工厂、事件和兼容门面;subtitles 管字幕和隐藏定时器;capture 管代际、
初始化、节拍和回调;audio-graph 管浏览器节点;encoding/sample-queue/worklet
分离纯数据与处理器边界。完整维护地图在包内 ARCHITECTURE.md。
## 独立列明的缺陷修正
- 链式块队列保留不足块及尾部,复制输入且避免重复 concat/shift。编码与 7 个
历史实现逐字节匹配。每个活动代际只允许一个识别回调,拒绝被捕获且后续可继续。
- 暂停/切源/停止/终止使旧结果失效;旧结果不会解锁新回调。退休 recorder 的
消息即使已经被外部保留也被身份检查拒绝。首次候选回归发现此消息竞态后修复。
- 初始化去重,取消后不晚建录音图;Worklet URL 在成功、失败和终止路径释放。
Worklet 模块先准备再绑定 video,失败不会先接管并关闭视频的播放通路。
- stop 清录音/识别任务,保持可再次播放;已有字幕保留原自动隐藏期限,与历史版一致,
并拒绝旧识别结果新建隐藏任务。直接绑定视频的 context/source/
播放 gain 由播放器持有,直到 art.destroy 才关闭;pause/stop 保持播放路由。
捕获流 fallback 属于可释放的采集资源,stop 关闭;切源时重新取得流与音轨。
- destroy 清监听器、节点、流、timer,并禁止通过保留的 append 引用复活。
- 慢回调超过队列上限时明确报错并暂停采集,播放路由保留。上限取 60 秒与两个配置块
长度的较大值,以支持原本合法的长 interval;有超过 60 秒配置块的回归。不会无限缓存,
也不声称过载时音频无损;调用者网络请求仍由调用者负责取消。
- 工厂补不可枚举的自引用 default,兼容 2.0 的 require(...).default 及 2.1 的
require(...) 函数路径;保留键顺序、同步注册、选项快照、字幕 HTML/CSS 行为。
## 为什么 stop 不再关闭 direct context
实际 Chromium 在 close 后经 capture fallback 重启时无法得到非零 PCM;两个核心
组合失败,Firefox 两组合通过。原生探测报告保留在证据文件中,没有把能力失败
抹成通过。Web Audio 规定绑定后的媒体声音走节点图,close 会忽略关联媒体输出;
关闭后不能简单重新绑定节点来恢复。用户公开 stop/play 用法需要可靠恢复,因此
修正内部生命周期,而不删除重启测试或更改公开方法。
子代理独立复核了 [Web Audio close](https://www.w3.org/TR/webaudio-1.0/#dom-audiocontext-close)、
[媒体源节点](https://www.w3.org/TR/webaudio-1.0/#MediaElementAudioSourceNode)及
[捕获流切源](https://www.w3.org/TR/mediacapture-fromelement/#html-media-element-media-capture-extensions)。
保留 direct-first,避免把采样语义和兼容范围改成尚未全面支持的 capture-first。
旧版 close 行为在 ASR-02 历史测试中保留;候选测试要求停止后有播放路由、同一
context 恢复非零 PCM,最终销毁才关闭。初始化尚未绑定 video 时仍立即完整关闭。
## 验证与剩余范围
源代码分包 strict/noUncheckedIndexedAccess、定向 ESLint、正常 main/legacy/ESM
构建通过。历史/纯模块/候选共 210 项,真实 ESM 与副本校验另 2 项;main 与 legacy
各重跑 25 项候选生命周期。浏览器源码全组 12 通过/6 Windows WebKit 能力跳过,
main/legacy 候选各 4 通过/2 能力跳过;没有 failed/flaky。
具体输入哈希、报告、构建与浏览器版本见 [验证记录](../baselines/asr-ownership-validation.json)。
浏览器实际验证:两核心、非零 PCM/WAV、本地回调字幕、暂停恢复、同视频切源、
stop 后恢复及最终 context 关闭。Windows WebKit 无 WebAudio,不能代表 macOS Safari;
真实 fallback 音轨拓扑、音量/静音、跨源媒体、设备仍归 ASR-05。ASR-04 的公共类型和
实际包安装、ASR-06 的示例及发行文档仍未完成,本记录不表示整包已可发布。
仅运行本包、类型、构建和台账检查,未重复整仓全量 CI。两次子代理承担纯音频模块/
回归与规范审查,主代理负责图与控制器集成、浏览器、文档及提交。每项职责已核对。
回退本任务提交可恢复旧源码及构建产物,但会同时恢复已复现丢样本和生命周期缺陷。