Python批量处理SRT字幕:自动校准时间轴+格式转换
✍️ 作者:研选信X
📌 本文为原创内容,未经授权禁止转载。如需合作请联系后台。
做视频副业,最烦的不是剪辑,而是字幕时间轴对不上、格式乱糟糟。用Python写几个脚本,可以批量校准SRT时间轴(平移、缩放)、批量转ASS格式、提取中英双语字幕。一套脚本管一个项目,省去手动调时间的重复劳动。本文适合有视频副业或字幕翻译需求的人,代码拿来改改路径就能跑。
第一步:安装依赖
pip install pysubs2 python-dateutil
pysubs2 支持SRT/ASS/SSA/VTT等主流字幕格式互转,python-dateutil 处理时间计算。
第二步:批量校准时间轴(平移)
有些字幕是从别的视频提取的,时间轴对不上当前视频。用这个脚本批量平移:
from pysubs2 import SSAFile
import os
def shift_srt(input_dir, output_dir, shift_ms):
os.makedirs(output_dir, exist_ok=True)
for f in os.listdir(input_dir):
if not f.endswith(".srt"):
continue
subs = SSAFile.load(os.path.join(input_dir, f))
subs.shift(ms=shift_ms) # 正值后移,负值前移
subs.save(os.path.join(output_dir, f))
print(f"已处理: {f}, 平移 {shift_ms}ms")
shift_srt("./raw_subs", "./shifted_subs", 2500) # 后移2.5秒
shift_ms 参数:正值填入后移,负值填入前移,单位毫秒。
第三步:时间轴等比缩放
视频被加速/减速后,字幕时长需要同步缩放:
def scale_srt(input_dir, output_dir, scale_factor):
os.makedirs(output_dir, exist_ok=True)
for f in os.listdir(input_dir):
if not f.endswith(".srt"):
continue
subs = SSAFile.load(os.path.join(input_dir, f))
subs.scale(time_mult=scale_factor) # 1.0=不变,0.95=加速5%
subs.save(os.path.join(output_dir, f))
print(f"已处理: {f}, 缩放 {scale_factor}x")
scale_srt("./raw_subs", "./scaled_subs", 0.95)
第四步:批量转ASS格式(支持特效)
SRT不支持字体颜色和位置,转ASS可以加样式:
def srt_to_ass(input_dir, output_dir):
os.makedirs(output_dir, exist_ok=True)
for f in os.listdir(input_dir):
if not f.endswith(".srt"):
continue
subs = SSAFile.load(os.path.join(input_dir, f))
subs.styles["Default"].fontname = "Arial"
subs.styles["Default"].fontsize = 42
subs.styles["Default"].primarycolor = "&H00FFFFFF"
subs.save(os.path.join(output_dir, f.replace(".srt", ".ass")))
print(f"已转换: {f} -> {f.replace('.srt', '.ass')}")
srt_to_ass("./shifted_subs", "./ass_output")
第五步:提取中英双语字幕(分离合并)
双语字幕一般是"中文\n英文"两行,用脚本拆开:
def split_bilingual(input_file, cn_out, en_out):
with open(input_file, encoding="utf-8") as f:
lines = f.readlines()
cn_lines, en_lines = [], []
buffer = []
for line in lines:
if line.strip().isdigit() or "-->" in line or line.strip() == "":
if len(buffer) >= 2:
cn_lines.append(buffer[0])
en_lines.append(buffer[1])
buffer = []
else:
buffer.append(line)
with open(cn_out, "w", encoding="utf-8") as f:
f.writelines(cn_lines)
with open(en_out, "w", encoding="utf-8") as f:
f.writelines(en_lines)
print(f"已分离: {input_file} -> 中文+英文")
split_bilingual("bilingual.srt", "cn_only.srt", "en_only.srt")
| | |
|---|
| | 脚本头部加 # -*- coding: utf-8 -*-,保存时指定 encoding="utf-8-sig" |
| | 校准前先过滤:if event.start < 0: event.start = 0 |
| | |
| 加速视频1.1倍,时间轴缩放应为1/1.1=0.909 | scale_factor = 原时长/新时长 |
1. 批量重命名:字幕文件名乱七八糟?用 python -c "import os; [os.rename(f, f.replace(' ', '_')) for f in os.listdir('.') if f.endswith('.srt')]" 一键去空格
2. 批量合并同系列:同课程的多个SRT用 cat file1.srt file2.srt > combined.srt 合并,再用脚本重新生成序号
3. 时间戳快速校准:不确定该平移多少毫秒?先用一个文件试跑,用播放器边放边调参数,记录最佳偏移值后再批量
4. ASS加水印底栏:加一行字幕到底部作为来源标注:subs.insert(0, SSAEvent(start=0, end=1000, text="字幕由XXX整理"))
✍️ 作者:研选信X
📌 本文为原创内容,未经授权禁止转载。如需合作请联系后台。