AI 转写字幕怎么检查时间轴?用 Python 找出 SRT 倒序、重叠和空文本

用 Python 解析 SRT 并报告倒序、反向区间、空文本和全部重叠对,保留原文件与编号,再结合音视频核对转写与显示。

AI 转写导出 SRT 后,可以先检查时间区间、文件顺序和空文本,再回到音视频核对。下面的 Python 示例只生成问题报告,保留原始顺序与文件,不自动排序或移动字幕。这样能避免把结构整理误当成转写质量提升。

SRT 的输入格式与这次检查范围

SRT 通常以字幕编号、开始与结束时间、文字和空行组成每个块,时间格式形如 00:00:01,500。srt.parse 将其转换为 Subtitle 对象;ignore_errors=False 在无法解析的部分报错。解析库有容错行为,解析通过不代表每一种时间格式都符合你的交付规范。

AI 转写字幕怎么检查时间轴?用 Python 找出 SRT 倒序、重叠和空文本

代码检查三类语义结构:结束必须晚于开始;输入序列中下一条开始时间不应更早;文本不应只有空白。重叠则按所有有效区间两两检查,避免倒序文件中只查相邻行而漏掉问题。

环境与带问题的教学字幕

示例在 Windows、Python 3.11.15 的本地 CPU 环境实际运行。新建空文件夹,将后面完整代码保存为 05-srt-validate.py,在该目录用 PowerShell 执行:

python -m venv .venv
.\.venv\Scripts\python.exe -m pip install srt==3.5.3
.\.venv\Scripts\python.exe 05-srt-validate.py

最后一行在保存代码后执行。macOS 或 Linux 使用 ./.venv/bin/python。输出文件留在当前目录,先用教学样本核对;代码不调用大模型 API,也不修改你的原始业务文件。

教学文件含六条人工字幕,故意设置倒序、反向区间、重叠和空文本。它没有来自真实录音的文字,也不能用来评价任何转写模型。

完整检查代码

把完整代码保存为 05-srt-validate.py 后运行。先查看六条字幕的解析数量,再打开 subtitle_issues.json,按 index 或 indices 回到原 SRT 和音视频检查对应时间段。

from pathlib import Path
import json
import srt

# 人工字幕,故意含时间重叠、倒序、反向区间及空文本。
raw='''1
00:00:00,000 --> 00:00:02,000
第一句

2
00:00:01,500 --> 00:00:03,000
第二句

3
00:00:01,000 --> 00:00:01,200
倒序示例

4
00:00:04,000 --> 00:00:03,000
反向区间

5
00:00:04,000 --> 00:00:05,000

6
00:00:06,000 --> 00:00:07,000
结束
'''
Path('demo_transcript.srt').write_text(raw,encoding='utf-8')
subs=list(srt.parse(raw,ignore_errors=False))  # 保留输入顺序,不排序或重编号。
issues=[]
for pos,sub in enumerate(subs):
    if sub.start>=sub.end: issues.append({'index':sub.index,'issue':'end_not_after_start'})
    if not sub.content.strip(): issues.append({'index':sub.index,'issue':'empty_text'})
    if pos and sub.start<subs[pos-1].start:
        issues.append({'index':sub.index,'issue':'start_out_of_order'})
for i,a in enumerate(subs):
    if a.start>=a.end: continue
    for b in subs[i+1:]:
        if b.start<b.end and max(a.start,b.start)<min(a.end,b.end):
            issues.append({'indices':[a.index,b.index],'issue':'overlap'})
print('parsed subtitle count:',len(subs))
for row in issues: print(json.dumps(row,ensure_ascii=False))
assert len(subs)==6
assert any(x['issue']=='empty_text' for x in issues)
assert any(x['issue']=='overlap' for x in issues)
assert any(x['issue']=='start_out_of_order' for x in issues)
Path('subtitle_issues.json').write_text(json.dumps(issues,ensure_ascii=False,indent=2),encoding='utf-8')
try:
    list(srt.parse('无法解析的文本',ignore_errors=False))
except srt.SRTParseError:
    print('malformed file: rejected')
else: raise AssertionError('坏文件未报错')
print('original file unchanged:',Path('demo_transcript.srt').read_text(encoding='utf-8')==raw)

实际报告与怎么回到原文件

parsed subtitle count: 6
{"index": 3, "issue": "start_out_of_order"}
{"index": 4, "issue": "end_not_after_start"}
{"index": 5, "issue": "empty_text"}
{"indices": [1, 2], "issue": "overlap"}
{"indices": [1, 3], "issue": "overlap"}
malformed file: rejected
original file unchanged: True

结果应报告第3条开始时间倒序、第4条结束不晚于开始、第5条空文本,以及第1与第2条、第1与第3条重叠;损坏文本被拒绝,original file unchanged 为 True。

index 对应原字幕编号,indices 给出重叠的两条字幕。检查使用左闭右开的时间区间,前一条结束刚好等于后一条开始时,不报告重叠。反向区间先报错并退出重叠计算,避免无效时间造成额外假提示。

脚本没有调用 sort_and_reindex。这个接口可以排序、重编号,并默认跳过某些被认为无用的字幕;直接调用它可能删掉空文本或无效区间,使原问题难以回查。先保留原文件与报告,再明确修复方案。

怎样完成字幕质量核对

时间轴检查不能证明转写文字正确或与说话人对应。两人同时说话、双语字幕或多轨显示可能有意重叠,报告重叠后应结合原视频确认,不能机械删除。

回到原音视频逐项检查:听写文字和专名是否准确,句首句尾是否对齐,说话人切换是否合理,空字幕是否应该删除或补词。对确认需要修正的条目另存新版本,重新执行检查,并在实际播放器里看显示效果。不要用“排序后不报错”替代试听。

遇到 SRTParseError 时先查看文件是否混入说明文字、是否缺少时间行、是否被错误编码读取。不要用 ignore_errors=True 丢过坏块后,把剩余条数当成完整结果。编码异常可以先作为字节问题定位,再处理字幕格式。

示例两两比较的计算量随字幕条数平方增长,只用于理解规则和小文件检查。长字幕文件可用按开始时间排序的副本做扫描,但仍需保留原序列检查倒序与编号映射;不能把副本排序后的序列当原文件顺序。

官方资料与核对范围

资料读取日期为 2026 年 10 月 1 日。接口行为依照以下官方文档或项目说明核对,输出来自上述本地教学代码。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/31816.html

赞 (0)
AI小管家的头像AI小管家
AI 文本预处理要不要做 Unicode 规范化?对比 NFC、NFKC 的变化
上一篇 2小时前
AI 写的 Python 代码怎么检查语法?用 ast.parse 和 compile 定位错误
下一篇 2小时前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部