本文同步自 MAW 原始仓库的 docs/OCR_SUBTITLE_DEDUP.md。
OCR 字幕去重
「OCR 字幕去重」是 Launcher「工具箱」中「后处理」类别的本地字幕清理功能,用于处理以下情况:视频画面已经烧录了一条字幕,而 ASR 工程或 SRT 中又存在同一条字幕。功能会识别视频画面文字,将高度相似的字幕标记为禁用,从而避免导出或播放时出现重复字幕。
当前版本是只处理画面的 MVP,不分析音频,也不修改原始视频。
快速使用
- 打开 Launcher 右下角的「工具箱」,在「后处理」中选择「OCR 字幕去重」。
- 如果工具箱提示尚未安装 OCR 支持,点击提示中的「设置」链接,在「OCR 模型」设置中选择运行环境目录并点击「安装 OCR 支持」。
- 回到工具箱,在「处理文件」中选择工程或 SRT。默认会跟随 Launcher 当前工程或 SRT,也可以手动选择其他
.mosp、.json或.srt文件。 - 确认「视频画面」输入。工程关联的是视频时会自动使用;独立 SRT 会自动回退到 Launcher 当前视频;如果当前媒体是音频或没有可用视频,必须额外选择一个视频。
- 选择 OCR 模型(tiny 更快,small 对复杂画面更稳)、画面字幕区和相似度阈值,点击「执行 OCR 字幕去重」。
- 在「输出」中选择「工程 + SRT」「仅工程」或「仅 SRT」。原文件不会被覆盖,结果会使用
ocr-dedup操作后缀。
例如,输入 clip.mosp 和 clip.srt 后,默认会生成:
clip.ocr-dedup.mosp
clip.ocr-dedup.srt
如果文件已经存在,会自动追加编号,例如 clip.ocr-dedup-2.srt。
处理规则
对每一条启用字幕,程序会执行以下步骤:
- 取字幕时间段的中点,从视频中抽取一帧画面。
- 按所选区域裁剪画面,并将输入宽度缩放到约 960 像素。
- 使用 CPU 版 RapidOCR PP-OCRv6 tiny 识别画面文字。
- 清除空白和标点后,分别计算 Jaccard、包含度和 Levenshtein 相似度,取三者最高值。
- 最高值大于等于阈值时,将工程中的该段设置为
disabled: true。
默认相似度阈值为 0.5。阈值越低,越容易识别为重复,但误判风险也越高;阈值越高,结果更保守,但可能漏掉 OCR 有少量识别差异的重复字幕。
空字幕、时长少于 300 毫秒的字幕会跳过。抽帧或 OCR 单条失败时,该字幕会安全保留,不会因为单帧失败而被禁用。
disabled 和 SRT 输出
已有 disabled: true 的字幕会保留,并且不会重复 OCR;本次 OCR 命中的字幕会在此基础上追加。因此,输出工程中的禁用集合是:
原有 disabled 集合 ∪ 本次 OCR 命中集合
工程输出只增加或保留 disabled 标记,不改变文字、时间码或逐词 items。SRT 输出会跳过所有 disabled: true 的字幕,并重新连续编号。
画面字幕区
提供三种范围:
- 100% 完整画面:默认值,适合字幕可能出现在不同位置的素材。
- 底部 30%:只识别画面底部区域,适合常规底部字幕,能减少 OCR 输入量。
- 自定义百分比区域:填写 X1、Y1、X2、Y2,范围为 0%–100%,左上角是
(0%, 0%),右下角是(100%, 100%)。
完整画面不会漏掉位置变化的字幕,但 OCR 计算量更大。一次本机基准测试使用 1920×1080 合成画面,完整画面 OCR 约 0.073 秒,底部 30% 约 0.021 秒,完整画面约为底部 30% 的 3.4 倍。实际速度还会受到 CPU、画面内容和 FFmpeg 抽帧耗时影响。
OCR 报告
勾选「生成 OCR 判定报告(CSV)」后,会额外生成:
clip.ocr-dedup.csv
报告使用 UTF-8 BOM,方便直接用 Excel 打开中文内容。报告包含:
- 字幕序号、开始/结束时间和时长;
- 处理状态,例如
disabled、kept、existing_disabled、skipped、frame_failed、ocr_failed; - OCR 识别文字;
- Jaccard、包含度、Levenshtein 和最终最高相似度;
- OCR 判定始终基于当前抽取的画面,不复用其他字幕帧的 OCR 结果;
- 失败时的错误信息。
报告适合用来抽查误判和调整阈值。它是独立产物,不会被加入下一步字幕链式处理的输入列表。
视频输入规则
- 工程输入:优先使用界面中明确选择的视频;没有明确选择时,使用工程
media字段指向的视频。 - 工程的
media如果是音频,不能作为 OCR 画面来源;请选择额外的视频。 - 独立 SRT 没有媒体字段;如果 Launcher 当前媒体是视频,会作为自动回退,否则必须明确选择视频。
- 支持常见视频扩展名,包括
.mp4、.mkv、.avi、.mov、.wmv、.flv、.webm、.ts和.m4v。
模型和运行时
OCR 使用 RapidOCR 的 PP-OCRv6 tiny 或 small 模型与 ONNX Runtime CPU 推理,不需要 CUDA。tiny 更快、占用更低;small 对较小或复杂的画面文字通常更稳,但会占用更多 CPU 和内存。正式打包版不会把这些依赖放进主程序,而是在 Launcher 设置中按需安装独立运行环境。运行环境和模型保存在设置中的「OCR 运行环境目录」,可改到其他磁盘。
开发环境如果需要在主 Python 环境直接运行 OCR,需要安装可选依赖:
uv sync --extra ocr
tiny 使用 PP-OCRv6_det_tiny.onnx 和 PP-OCRv6_rec_tiny.onnx;small 使用 PP-OCRv6_det_small.onnx 和 PP-OCRv6_rec_small.onnx。两种模型都只在独立 OCR 运行环境中按需获取,不进入冻结包。
当前限制和后续方向
- 当前只检查视频画面,不根据音频内容做去重。
- 每条字幕只取一个中点画面;如果字幕只在时间段的一部分出现,可能需要后续增加多点抽帧策略。
- OCR 误识别、画面中的其他文字与字幕文字相似时,可能产生误判;建议配合 CSV 报告检查结果并调整阈值或区域。
- 当前提供 tiny 和 small 两种模型;更细的 OCR 配置留待后续版本。