已接受(2026-08-19;M1-M3 实施完成:grid_diff 落地、两级触发接入、面板抑制;M4 真机验收待执行)
2026-08-19
用户实测反馈(2026-08-19):同一视频(非全屏、窗口前台可见、画面基本静止)内页面发生变化(字幕行切换/幻灯片翻页)时 OCR 触发不良;切换到其他软件页面则立即触发 OCR。
场景确认:视频窗口前台且完全可见、画面基本静止(幻灯片/板书为主)——排除遮挡主因,根因定位到触发链路本身:
- 采样混叠漏检(主因):
frame_diff.rs的FrameDiffDetector为 8 块 × 60 字节均匀采样 hash。1920 宽窗口下每块采样点实际只落在 4 个固定列(列号 = i·4320 mod 1920 ∈ {0,480,960,1440})。静止画面下唯一的变化(字幕行、翻页后的局部文字)若落在采样列之外 → 完全漏检 → 不触发,只能等 15s 强制 OCR 兜底(FORCE_OCR_INTERVAL_SECS)。切换软件页面 = 整窗剧变 → 任何采样必中 → 立即触发(且识别的是错误内容)。 - 触发与裁剪解耦不足(次因):字幕路径的变化检测跑在裁剪前的全帧上(
live_session_frame.rsprocess_frame),与页面变化/鼠标/教师动作耦合;全帧路径 5s 低频 + diff 门控 + 版面缓存 → 页面变化(幻灯片翻页)产出延迟大且依赖 diff 命中。 - 视频区内突发 UI 无防线(Q3):控制栏/弹窗出现在 ROI 内时,REQ-084(前台窗口切换)不触发、ui_junk 只能拦已知词、多帧投票对持续显示的 UI 照投通过。
约束:本地优先、纯规则、实时性(秒级)、成本受控(OCR 推理昂贵,变化检测必须远低于其成本)、现有调度语义(DualRateScheduler / FORCE_OCR / idle_governor / RoiTracker / 投票器)不回归。
我们将用网格差异统计(GridDiffDetector)替代分块采样 hash,并把触发决策改为区域感知:
capture/grid_diff.rs(新模块):帧 → W×H 网格(全帧默认 32×18),每格轻量指纹(子采样均值/方差),逐格比较输出changed_cells(变化格集合)与变化包围盒——结构性消除采样混叠,任何位置的局部文字变化均可命中。- 字幕路径判变移到 ROI 裁剪帧上:裁剪后 ROI 帧网格判变(8×4 格),ROI 内 ≥1 格变化或 force_ocr → OCR;与页面变化/鼠标/教师动作解耦(静止画面下 OCR 频率不升反降)。
- 全帧路径事件驱动:每 tick 的全帧网格 diff 顺带产出"带外变化"信号(变化包围盒与字幕带无交,或变化格数 ≥ 大面积阈值)→ 上升沿 + 距上次全帧 OCR 超 2s 节流 → 立即全帧采样,幻灯片翻页响应从"≤5s + 可能漏检"降为"≤2s 必触发";
full_every兜底保留。 - UI 面板抑制:变化格集合按 4-邻接连通聚类 → 面积 ≥ 阈值(≥8% 帧面积)→ 面板出现/消失事件;事件期间进入字幕链路的 OCR 文本源头丢弃(不进投票器,独立计数
ui_panel_filtered)。 - 保留语义不变:
DualRateScheduler调度、FORCE_OCR 15s 兜底、idle_governor 的"画面变化"信号(由全帧网格 diff 通过计数驱动,语义等价)、RoiTracker 锁定/重扫、SubtitleVoter 投票、ui_junk/watermark_filter 过滤链。
详细设计见 设计规格([ ] 已归档)。
- 优点:结构性消除混叠(非概率缓解);触发与内容区域解耦;顺带产出变化几何信息(包围盒/连通域)支撑面板抑制;纯函数可单测;改动集中在 frame_diff/grid_diff 与 process_frame 调用点
- 缺点:网格统计成本高于 8×60 采样(约 4-5K 像素采样/tick,仍远低于 OCR 推理,1s tick 下可忽略)
- 适用场景:本次症状(静止画面局部变化漏检 + 页面变化延迟)
- 优点:改动最小、风险最低
- 缺点:混叠仍是概率问题(特定分辨率/布局依旧漏);页面变化延迟完全不解决;修补参数需按分辨率调校,长期维护成本高
- 适用场景:不选——治标不治本
- 优点:根治遮挡污染(合成桌面裁剪 → 窗口自身合成内容),切换软件不再产生"错误内容触发"
- 缺点:新捕获后端属架构级变更;本场景已确认遮挡非主因,收益与症状不匹配
- 适用场景:后续单独立项(遮挡场景专项),不在本期
- 用户场景(前台可见 + 基本静止)把根因锁定为触发链路的采样混叠与区域解耦不足——只有方案 A 同时治两处
- 方案 A 的网格统计与现有 pipeline 结构兼容(复用
Rect/裁剪/调度,替换 diff 核心),可按"纯函数 → 接入 → 面板抑制"自底向上拆分,每步可单测可验收 - 面板抑制与网格 diff 同源(变化格集合),边际成本极低,一并在本期落地(REQ-087)
- 静止画面(幻灯片/板书/字幕切换)OCR 触发从"概率漏检 + 15s 兜底"变为"秒级必触发"
- 页面(幻灯片)翻页全帧产出延迟从 ≤5s 降为 ≤2s
- 控制栏/弹窗不再产生错误字幕;静止画面下 OCR 推理次数不升反降(ROI 精确判变)
- 全帧每 tick 增加一次网格统计(约 4-5K 像素采样),CPU 可忽略
FrameDiffDetector删除,旧测试迁移(行为等价性由新回归用例覆盖)- process_frame 控制流调整(diff 拆两级:全帧网格 diff + ROI 帧 diff)
- 带外触发节流参数不当 → 全帧 OCR 频率上升(验收时用真实会话校准,默认 2s 节流 + 大面积阈值)
- 面板事件误判(视频内快速场景切换被当面板)→ 面板抑制仅作用于字幕路径、且事件期间短暂(出现后 3s/消失即清),误伤窗口小;字幕投票器/融合层仍保留原文(原料层不动,ADR-006 派生分离)
- 网格粒度与屏幕分辨率不适配(高分屏局部小字)→ 网格密度参数化(默认 32×18),真机验收校准
grid_diff纯函数单测覆盖:任意位置局部变化命中(含 1920 宽左对齐字幕回归用例——旧算法漏检的构造帧);静止帧零变化;尺寸变化/空帧防御- 集成测试:ROI 帧判变(ROI 外变化不触发字幕);带外变化触发节流
- 真机验收(对照设计规格验收标准):静止幻灯片 + 字幕变化 ≤2s 触发;翻页 ≤2s 全帧产出;控制栏悬停不产生字幕段;切换软件仍触发(不回归);现有测试全过
- ADR-002: DXGI 屏幕捕获与关键帧变化检测(本 ADR 重做其变化检测部分)
- ADR-005: 字幕 OCR 与双源转写融合(字幕链路语义不变)
- ADR-006: 会话段派生视图(原料层不动原则约束面板抑制的实现位置)
- 设计规格(REQ-086/REQ-087)([ ] 已归档)
- 需求池 REQ-086/REQ-087