AI 字幕校对:修正错字和术语,同时保留原来的时间码

本篇目录 6 节
  1. 一、先备份,再使用成熟解析器
  2. 二、导出可供 AI 校对的编号文本
  3. 三、让 AI 提交有限修改
  4. 四、写回新 SRT 并检查时间
  5. 五、导回剪辑软件验收
  6. 六、常见问题与排错

AI 字幕校对最怕的是文字改好了,时间码和条数却变了。本文采用“模型只改文本,程序保留结构”的方法:先解析 SRT,把字幕编号和文字导出,再让 AI 返回修正建议,最后写回新文件。准备已有字幕、对应音视频、Python 和 srt 库,练习时保留原件,不直接覆盖交付字幕。

内容创作系列主题示意图
系列主题示意图;操作步骤以正文与官方界面为准。

一、先备份,再使用成熟解析器

不要用按空行分割的临时规则处理所有字幕,真实 SRT 可能有多行正文。这里使用开源 srt 库解析格式,操作前将原字幕复制到独立目录,命名为 input.srt。

py -m venv .venv
.\.venv\Scripts\python.exe -m pip install srt

建议记录实际安装版本。这里处理标准文本字幕,不讨论特效字幕、嵌入式字幕或复杂样式转换。

二、导出可供 AI 校对的编号文本

保存为 export_lines.py。脚本保留每条的编号,但不把时间码交给模型修改。

from pathlib import Path
import json
import srt

subs = list(srt.parse(Path("input.srt").read_text(encoding="utf-8-sig")))
ids = [sub.index for sub in subs]
if len(ids) != len(set(ids)):
    raise SystemExit("Duplicate subtitle indexes; fix the source first")
with open("lines.jsonl", "x", encoding="utf-8") as output:
    for sub in subs:
        output.write(json.dumps({"index": sub.index, "text": sub.content},
                                ensure_ascii=False) + "\n")

运行后得到 lines.jsonl。先对照音频,列出产品型号、人名和固定译法,作为术语表。不清楚的声音不能仅凭上下文写成确定词。

三、让 AI 提交有限修改

只校对给定字幕文本,不改变编号和字幕条数,不合并或拆分记录。
仅修正错别字、明显重复与术语,不改写说话人的含义和语气。
每项输出JSONL:index、text;只列需要修改的条目。
疑似听不清的内容另列待听审,不猜测数字、型号或专有名词。
保留必要换行,不添加解释到字幕正文。

将已经人工听审通过的修改保存为 corrections.jsonl。例如 {"index":2,"text":"修正后的字幕"}。没有确认的建议不要写回,空文件表示本轮无文字变更。

四、写回新 SRT 并检查时间

保存下面脚本为 apply_corrections.py。它不改变时间字段,输出存在时拒绝覆盖。先拒绝未知和重复编号,避免同一条被两次修改却无法察觉。

from pathlib import Path
import json
import srt

subs = list(srt.parse(Path("input.srt").read_text(encoding="utf-8-sig")))
known = {sub.index for sub in subs}
updates = {}
for line in Path("corrections.jsonl").read_text(encoding="utf-8-sig").splitlines():
    if not line.strip():
        continue
    row = json.loads(line)
    key, text = row["index"], row["text"]
    if key not in known or key in updates or not isinstance(text, str) or not text.strip():
        raise SystemExit("Invalid or duplicate correction")
    updates[key] = text
before = [(sub.index, sub.start, sub.end) for sub in subs]
for sub in subs:
    sub.content = updates.get(sub.index, sub.content)
result = srt.compose(subs, reindex=False, strict=False)
parsed = list(srt.parse(result))
after = [(sub.index, sub.start, sub.end) for sub in parsed]
if before != after:
    raise SystemExit("Timing or indexes changed; output rejected")
with open("corrected.srt", "x", encoding="utf-8") as output:
    output.write(result)
print("Saved corrected.srt; review it against the audio.")

五、导回剪辑软件验收

检查片头、片尾、改过的条目和长字幕。时间码没变不等于阅读体验合格,文字变长后可能读不完;遇到这种情况,回到字幕编辑工具手工调整断句,另保存版本,并记录这次确实改动了时间结构。

纯校字与重新分段应分两轮完成。不要为了避免额外工作,把明显过长的句子硬塞进原来的短时长。

六、常见问题与排错

AI 少返回几条,是漏字幕吗?

本方案只返回需改条目,其余沿用原文。如果要求全量返回,应另外核对编号集合,不能混用两套约定。

写回脚本拒绝了时间变化怎么办?

先检查原字幕有重复编号、乱序或异常时间。不要删除校验来强行生成结果,应回源修复或使用专业工具重新整理。

可以顺便把字幕翻译成英文吗?

翻译会改变长度与分段需求,建议按字幕翻译流程单独处理,别与错字校对混在一轮里。

解析器说明见 srt 项目。没有字幕时,可先看本地转写教程。

滚动至顶部