已接受(Accepted,2026-08-18)
2026-08-18
v0.2.0 的 REQ-011(实时字幕 OCR)与 REQ-012(双源转写融合)解决同一核心问题:有字幕的视频(网课/带字幕播放器)用字幕 OCR 替代 ASR 作为转写主体,突破 ASR CER 天花板。
事实基础:
- 字幕是画面图像,OCR 管线天然具备识别能力(v0.1.0 的 oar-ocr 引擎已就绪)
- 字幕在画面底部固定区域(行业惯例:底部居中 1/4 高度内),可用区域启发式裁剪降低 OCR 输入尺寸与噪声
- 原项目已实现 PP-OCRv5 后处理管线(det/rec 纯函数),重构区用 oar-ocr(PP-OCRv6)替代,字幕区域筛选需在 oar-ocr 返回的 bbox 基础上做(oar-ocr 的 OcrBlock 当前只有 text/score,需确认是否暴露坐标——若未暴露则退化为"底部裁剪后识别")
约束:
- 本地优先:融合逻辑必须是纯规则(无 LLM),LLM 精修为后续阶段(REQ-025)
- 实时性:字幕变化需在秒级内反映到会话(时间窗去重后落库)
- 弹幕/滚动字幕需过滤(时间窗去重 + 区域规则)
我们将实现 subtitle_ocr.rs(字幕区识别)与 fusion.rs(双源融合)两个纯逻辑模块,流程如下:
- 区域裁剪:帧底部 1/4 高度区域(
bottom_quarter)优先裁剪送 OCR;若 OCR 结果为空或置信度低,回退全帧(兜底板书场景) - 区域过滤:oar-ocr 返回的块若含坐标则仅保留 y 坐标在底部 1/4 的块;不含坐标则依赖裁剪输入天然过滤
- 时间窗去重(纯函数):
dedupe_subtitles(new_text, last_subtitle, dedupe_ms)—— 同文本在去重窗(如 3s)内重复出现视为字幕未变化,跳过;文本相似(编辑距离 ≤1)视为微变化合并;窗内新文本直接通过 - 采样频率:字幕区 1-2 fps(ADR-002 双速率),非字幕区 0.2-0.5 fps 全帧 OCR(画面要点)
输入:字幕段列表(SubtitleSegment { start_ms, end_ms, text })+ ASR 段列表(TranscriptSegment)→ 输出融合段列表(FusedSegment { start_ms, end_ms, text, source: Subtitle|Asr|Fused })
规则(按优先级):
- 字幕权威:字幕段覆盖的时间窗内,以字幕文本为准(准确率近 100%)
- ASR 补缝:字幕段之间的空隙(gap > 1s)用 ASR 段填补,标记
source=asr - 重叠校对:字幕与 ASR 时间重叠时,编辑距离 ≤2 视为一致(字幕胜出);>2 视为不一致——字幕胜出(信任字幕),但保留 ASR 段为
source=asr供人工核对 - 时间轴对齐:ASR 段按时间戳插入字幕时间轴,重叠裁剪(重叠部分归属字幕)
- 空窗丢弃:两端无内容的静默窗不产出段
- 融合结果以
source='fused'或subtitle/asr落入session_segments(ADR-004) - 会话详情页按时间轴展示:字幕段(主)+ ASR 补缝段(弱化样式),支持人工校对
- 优点:纯函数可单测;无 LLM 依赖(离线可用);确定性行为
- 缺点:无法处理"字幕与 ASR 语义一致但措辞不同"的复杂场景(措辞差异需人工或 LLM 校对)
- 适用场景:v0.2.0 本地优先约束下的主方案
- 优点:措辞统一、可纠错;质量上限高
- 缺点:违背本地优先(数据出本机需授权);实时性差(每窗调 LLM);成本高
- 适用场景:V1.0 的 AI 精修(REQ-025),v0.2.0 不做
- 优点:实现最简单
- 缺点:无字幕时段(板书讲解/无字幕视频)完全缺失转写;REQ-012 明确要求 ASR 补全
- 适用场景:纯字幕场景的临时方案
- 本地优先铁律:规则融合是唯一离线可用的方案,LLM 精修作为 V1.0 增量(REQ-025)叠加在规则结果之上
- 可测试性:字幕去重、区域过滤、融合规则全部为纯函数,可构造确定性输入单测(AGENTS.md §7 测试规范)
- 复用:OCR 引擎(oar-ocr)、帧捕获(ADR-002)、会话存储(ADR-004)均为现成模块,本决策只新增两个纯逻辑文件 + 编排
- 字幕场景转写准确率近 100%(对标通义听悟的字幕优先策略)
- 无字幕场景自动回退 ASR(REQ-012 双源覆盖)
- 融合产物带来源标记,为人工校对与 AI 精修(REQ-025)铺路
- 字幕 OCR 需双速率采样支撑(ADR-002 复杂度前置)
- 弹幕/滚动字幕污染风险需规则持续校准(区域过滤 + 时间窗)
- 融合规则参数(gap 阈值、编辑距离阈值、去重窗)需实测调参
- oar-ocr 是否暴露 bbox 坐标不确定:若不暴露,"区域过滤"退化为"裁剪输入"(准确性略降,可接受)
- 滚动字幕(股票/歌词)触发高频变化 → 去重窗失效:增加"滚动检测"(连续 N 帧文本不同但共享长公共子串 → 标记滚动字幕丢弃)
- 双源时间戳不同源(ASR 基于音频时钟、字幕基于视频帧):需统一时间基准(会话单调时间戳)
- 单测:字幕去重(同文本/编辑距离 1/新文本三态)、区域过滤、融合四规则(字幕权威/补缝/重叠校对/空窗丢弃)
- 集成测试(标注):播放带字幕视频 30s → 字幕段文本与画面字幕一致
- 无字幕视频 → 融合段全部
source=asr,时间轴连续 - 弹幕密集视频 → 弹幕不进入字幕段(滚动检测生效)
- 融合段落库后
get_session_detail时间轴对齐展示
- ADR-002: DXGI 屏幕捕获与关键帧变化检测方案(帧输入)
- ADR-004: 会话管理数据模型方案(融合段落库)
- 原项目参照:
client/electron/ai/local-ocr/ocrPipeline.ts(det/rec 后处理验证经验)
- oar-ocr crate(v0.1.0 已引入,PP-OCRv6)
- 需求池 REQ-011 / REQ-012(requirements-pool.md)