Subtitle optimizer
🎬 An AI Agent skill for reviewing and optimizing SRT subtitles with an interactive diff panel.
npx -y skills add Rancho-7/subtitle-optimizerAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 6 stars6 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Use when reviewing or correcting SRT subtitle text while preserving timestamps, especially ASR transcript errors, product-name terminology, homophone mistakes, and visual review workflows.
SKILL.md
15.4 KB, as published. Nobody here has run it
SRT 字幕文字优化
此 skill 用于优化 SRT 字幕文件中的文字内容,提高准确性,同时严格保留原始时间戳。所有实际写入最终 SRT 的修改都必须经过审查面板或用户明确确认。
核心概念
词汇列表(assets/corrections.json):包含已知需要修正的词汇对,支持两种匹配模式:
普通模式(默认):
{"from": "cloud code", "to": "Claude Code", "reason": "产品名称"}
正则模式(regex: true): 用于处理多种变体,如大小写、空格差异:
{"from": "cloud\\s?code", "to": "Claude Code", "reason": "产品名称", "regex": true}
cloud code→ Claude Codecloudcode→ Claude Code(无空格)Cloud Code→ Claude Code(大写)
常用正则语法:
\s?— 可选空格\s*— 零或多空格-?— 可选连字符- 大小写不敏感由脚本默认处理,不需要在规则中写
(?i)
工作流程
第一步:加载词汇列表
读取 skill 目录下的 assets/corrections.json,了解已知的修正规则。
第二步:读取并解析 SRT 文件
使用 Read 工具读取用户提供的 SRT 文件。SRT 格式结构:
1
00:00:01,000 --> 00:00:04,000
第一行字幕文本
2
00:00:05,000 --> 00:00:08,000
第二行字幕文本
解析要点:
- 序号(1, 2, 3...)
- 时间码(开始时间 --> 结束时间)
- 字幕文本(可有多行)
- 区块之间以空行分隔
第三步:分析字幕内容
逐一检查每个字幕条目,识别以下类型的问题:
基于词汇列表的修正:
- 遍历
corrections.json中的每条规则 - 如果
regex: true,使用正则匹配(考虑大小写不敏感) - 如果
regex: false或省略,使用普通字符串匹配 - 匹配成功后标记待修正
转录错误:
- 同音字/近音字错误(如"未"vs"位"、"时"vs"是")
- ASR 识别错误
- 标点符号错误
语义偏差:
- 上下文理解错误
- 表述不够准确或完整
- 前后文不一致
判断依据:
- 句子语法和语义是否通顺
- 同一概念在多个字幕中的表述是否一致
- 是否符合常识和上下文语境
第四步:准备候选 SRT 和审查面板
先从 skill 目录运行 prepare-review。它会读取原始 SRT 和词汇列表,在原始 SRT 同目录生成:
{原文件名}_candidate.srt{原文件名}_diff_preview.html
node scripts/generate_diff.js prepare-review \
/path/to/video.srt \
--corrections assets/corrections.json
不要把真实用户产物写入 skill 仓库目录或仓库内临时目录。默认只在原始 SRT 同目录生成候选 SRT 和审查面板;调试产物不是最终交付物,确实需要时写到系统临时位置并在完成后清理。
prepare-review 生成的候选文件包含词汇列表命中的自动修正。候选文件不是最终输出,必须进入审查流程。
第五步:执行 AI 审阅并补充候选修正
prepare-review 只是规则词汇预处理,不会自动产生上下文级 AI 建议。不能只运行 prepare-review 就向用户汇报审查完成。
运行 prepare-review 之后,必须继续阅读原始 SRT 和候选 SRT,做完整逐条审阅,逐段检查候选文件中仍然存在的 ASR 错字、近音字、断句问题、上下文语义偏差和术语不一致。不得只抽样、不得只搜索品牌名或已知词汇、不得只检查脚本输出的差异行。
AI 审阅协议:
- 先生成审阅分块计划。长文件必须使用
review-plan获得连续审阅范围,不得只靠一次整文件 Read;默认不要生成*_review_chunks.json:node scripts/generate_diff.js review-plan \ /path/to/video.srt \ --size 100review-plan只输出范围,不创建额外文件。只有在调试或需要机器可读审计记录时,才可以显式运行review-chunks,并且输出到系统临时位置或 Agent 临时目录,不要写到用户字幕目录,也不要作为 skill 文件保留。 - 按连续字幕区间分批审阅原始 SRT 和候选 SRT,以
review-plan输出的 chunk 范围为准。长文件可以按每 80-150 条字幕一批处理,但必须覆盖完整文件。不得通过一次整文件读取后直接宣称完成;必须能说明已审阅的连续区间。 - 每批都要同时看前后相邻字幕,判断口语上下文、技术术语、产品名、命令、文件名、英文缩写和中文近音字。
- 建立候选 AI 修正清单,记录 SRT 序号、原文、修正后文本和原因。只有在上下文证据充分时才加入清单。
- 对规则已修改的字幕块,确认修正没有误伤上下文;对未修改字幕块,主动检查词汇表漏掉的问题。
- 全量审阅完成后,再一次性把候选 AI 修正清单写入
{原文件名}_candidate.srt,随后刷新审查面板。 - 最终回复必须列出已审阅的 chunk 范围,例如
1-100, 101-200, ...,不能只说“已逐条审阅”。
硬性汇报规则:
- 只要发现任何可修正问题,就必须把它加入候选 AI 修正清单,写入 candidate,并刷新审查面板;不能汇报 “AI 建议 0 条”。
- 不得把发现的问题留给用户在页面里手动修。页面审查用于让用户接受或拒绝候选修正,不是替 Agent 完成已发现问题。
- 如果某个问题证据不足,才可以不写入 candidate,但必须归为“需要人工核对”,不能同时把它称为“高置信度修正”。
- 最终摘要中的 AI 建议数量必须来自刷新审查面板后的脚本统计,而不是人工估算。
重点检查类型:
- ASR 把英文产品名、模型名、命令、文件名、扩展名听错或拆错
- 中文近音字、同音词、错别字,例如术语场景里的“用力/用例”这类问题
- 上下文中已经出现过的同一概念前后写法不一致
- 断句导致的语义不通顺、漏词、多词
- 技术表达不自然但可以从前后文安全还原的内容
分析时至少覆盖:
- 规则已修改的字幕块,确认修正没有误伤上下文
- 未修改的字幕块,检查是否有词汇表漏掉的问题
- 相邻字幕块,确认前后文是否连贯
如果识别出高置信度 AI 修正:
- 继续编辑同一个
{原文件名}_candidate.srt - 保留原始序号和时间码
- 只修改字幕文本
- 只把有明确把握的修正写入候选文件;审查面板默认接受候选修正,用户可逐条拒绝
如果没有发现高置信度 AI 修正,也要在最终回复中明确说明“已完成上下文 AI 审阅,未发现可安全加入候选文件的 AI 建议”。不要把脚本输出中的 AI corrections: 0 当作已经完成 AI 审阅的证据;它只表示当前候选文件里没有非词汇表来源的差异。
第六步:刷新审查面板
如果第五步之后没有再修改候选 SRT,prepare-review 已经生成审查面板,不需要重复运行命令。若你编辑了候选 SRT 来加入 AI 修正,则用同一个候选文件重新生成 HTML 审查面板:
node scripts/generate_diff.js \
/path/to/video.srt \
/path/to/video_candidate.srt \
/path/to/video_diff_preview.html \
--corrections assets/corrections.json
审查面板默认展示发生变化的字幕块,同时必须支持切换到“全部字幕”和“未修改”,用于检查是否有漏改。面板包含:
-
统计信息:
- 字幕总数
- 已修改数
- 未修改数
- 规则命中数
- 已拒绝数
- 已接受数
-
对比表格:
- 定位信息(变更编号、SRT 序号、时间戳)
- 修改前内容(红色高亮差异部分)
- 修改后内容(绿色高亮新内容)
- 依据标签(规则命中 / AI 建议 / 未修改)
- 处理按钮(修改行:接受 / 拒绝;未修改行:手动修正)
-
操作按钮:
- 审查范围筛选(修改 / 未修改 / 全部字幕)
- 修改来源筛选(全部修改 / 规则命中 / AI 建议,仅在“修改”范围下显示)
- 全部接受 / 全部拒绝 / 手动修正
- 导出最终 SRT(直接下载
{原文件名}_fixed.srt)
-
手动添加功能:
- 追加词汇规则:用户可输入
from、to、regex,用于沉淀后续可复用的规则;页面会自动写入默认reason - 导出新增规则:下载
new_corrections.json,提示用户把文件交给 Agent,并让它合并到assets/corrections.json - 手动修正字幕行:用户可输入未发生自动修改的字幕序号、原文、修正后文本和原因,用于直接写入最终 SRT
- 追加词汇规则:用户可输入
审查面板特性:
- 使用
assets/diff_preview_template.html中的优化审查台 UI;不要临时生成简化版、旧版或一次性 HTML - 审查台使用浅暖色高对比主题:暖纸背景、深色正文,暖铜用于主导航和定位,玫瑰红用于删除/拒绝,绿色仅用于接受/应用
- 顶部必须包含统计卡片、视图切换、搜索框、结果计数和“导出最终 SRT”按钮
- 表格必须使用“定位 / 修改前 / 修改后 / 依据 / 处理”的结构,避免序号、时间戳和正文混杂
- 变化文字用颜色区分(红色=删除,绿色=新增)
- 默认只显示修改行,避免长字幕文件难以审查
- 支持切换到全部字幕或仅未修改行,用于检查漏改
- 修改行和未修改行必须有明显视觉区分
- 同时展示连续的“变更编号”和原始“SRT 序号”:变更编号只对修改行连续计数,SRT 序号来自原文件,因此在修改视图里会跳号
- 支持按修改来源筛选
- 支持逐条接受或拒绝
- 页面必须支持直接导出最终 SRT,不要求用户下载 JSON 后再运行命令
- 手动行级修正直接写入页面导出的最终 SRT
- 手动词汇规则通过“导出新增规则”进入
new_corrections.json;静态页面本身不直接修改本地词汇表文件
第七步:展示审查面板并等待用户决策
- 将预览页面路径告知用户
- 展示修正统计摘要
- 询问用户:
- "以上是所有候选修正(共 N 条,来自规则命中 X 条,AI 建议 Y 条)。审查面板已生成:
{文件名}_diff_preview.html。默认展示修改行,你也可以切换到全部字幕或未修改行检查漏改。请在页面中接受/拒绝修改,也可以添加遗漏词汇或手动修正未修改的字幕行。完成后点击“导出最终 SRT”即可下载{文件名}_fixed.srt。如果新增了可复用词汇规则,请在“追加词汇规则”区域点击“导出新增规则”,下载后把new_corrections.json交给 Agent 合并到规则库。"
- "以上是所有候选修正(共 N 条,来自规则命中 X 条,AI 建议 Y 条)。审查面板已生成:
第八步:合并新增词汇规则(可选)
普通用户生成最终字幕不需要 JSON。只有当用户在页面里追加了可复用词汇规则,并导出了 new_corrections.json 时,才需要合并到 assets/corrections.json:
node scripts/generate_diff.js update-corrections \
new_corrections.json \
--corrections assets/corrections.json
合并规则:
- 接受
new_corrections.json中的corrections - 兼容旧审查记录中的
manualCorrections - 按
from、to、regex自动去重 - 只更新
assets/corrections.json,不会修改当前 SRT 文件
如果希望新增规则也立刻影响当前字幕,应先合并规则,再重新从第三步开始扫描并生成新的候选文件和审查面板。若只是想修改当前某条字幕,应使用“手动修正字幕行”,它会直接进入页面导出的最终 SRT。
第九步:应用审查决策(可选自动化入口)
普通用户优先使用页面中的“导出最终 SRT”。当需要在 Agent/CI 中复现同一批审查决策时,仍可使用脚本生成最终字幕文件:
node scripts/generate_diff.js apply-decisions \
original.srt \
video_candidate.srt \
review_decisions.json \
video_fixed.srt \
--corrections assets/corrections.json
应用规则:
acceptedChangeIds:使用候选文件中的修正文本rejectedChangeIds:保留原字幕文本,除非同一序号存在手动行级修正pendingChangeIds:兼容字段,当前页面通常导出为空数组manualLineEdits:直接覆盖指定字幕块文本manualCorrections:兼容旧审查记录,可追加到assets/corrections.json,自动去重- 始终保留原始时间戳不变
第十步:生成输出文件
最终文件要求:
- 保留所有原始时间戳不变
- 仅替换用户接受或手动添加的文字内容
- 使用
_fixed后缀命名输出文件(例:video.srt→video_fixed.srt) - 页面导出:浏览器下载
{原文件名}_fixed.srt - 审查面板和候选文件:默认建议与原始 SRT 放在同一目录
- 脚本导出:输出路径由命令参数指定,默认建议与原始 SRT 放在同一目录
new_corrections.json只用于更新规则库,不是生成最终字幕的必需步骤
输出文件格式
[原始序号]
[原始时间码]
[修正后文本]
[原始序号]
[原始时间码]
[修正后文本]
...
预览页面技术规格
预览页面为一个独立的 HTML 文件,包含内联 CSS 和 JavaScript,无需外部依赖。
设计风格:
- 浅暖色高对比主题,适合长时间审查字幕
- JetBrains Mono 等宽字体显示代码/时间戳
- 清晰的表格布局
数据结构:
const diffData = [
{
id: 1,
timestamp: "00:00:01,000 --> 00:00:04,000",
before: "原文",
after: "修正后",
type: "vocabulary", // 或 "ai"
status: "accepted", // accepted / rejected
reason: "产品名称",
sourceCorrection: {
from: "cloud\\s?code",
to: "Claude Code",
reason: "产品名称",
regex: true
}
}
];
const reviewRows = [
{
id: 1,
timestamp: "00:00:01,000 --> 00:00:04,000",
before: "原文",
after: "修正后",
beforeHtml: "原文",
afterHtml: "修正后",
type: "vocabulary",
status: "accepted",
kind: "changed", // changed / unchanged
changeNumber: 1 // 未修改行为 null
}
];
新增规则导出格式:
{
"version": 1,
"generatedAt": "2026-04-16T00:00:00.000Z",
"corrections": [
{"from": "原文", "to": "修正后", "reason": "遗漏词汇", "regex": false}
]
}
注意事项
- 不修改时间码:即使发现时间轴有问题,也只修正文字,时间轴问题需要用户通过专业工具调整
- 保守修正:只有当 AI 对修正有较高置信度时才提出建议,不确定的地方标注"可能需要人工核对"
- 上下文窗口:分析时考虑前后字幕的语境,而不仅仅是单句
- 多行字幕:如果一个时间码对应多行文本,逐行检查并修正
- 遗漏补充:如果发现词汇列表中没有的常见错误,告知用户可在预览页面中添加;这些词汇会进入
new_corrections.json,再由 Agent 或脚本追加到assets/corrections.json - 审查优先:先生成候选文件和审查面板,用户审查后直接从页面导出最终 SRT
- 静态页面限制:HTML 面板可以下载最终 SRT 和新增规则,但不能直接写入本地
corrections.json;更新词汇表仍需要 Agent 或脚本处理