AI字幕生成器:WhisperX开源自动字幕方案
自动生成字幕的难点不是识别文字,而是时间轴对得上、断句能读。这篇给一条完整命令链路:ffmpeg 抽音轨、WhisperX 出词级时间戳、按 42 字符断句、封装或烧录,附质量清单与常见漂移问题。
AI字幕生成器:WhisperX开源自动字幕方案
静音刷视频的人比你想的多,字幕直接决定完播率。但自动字幕做得好不好,差别不在识别文字——现在的模型识别准确率已经很高——而在两件事:时间轴准不准,断句读不读得顺。
WhisperX 解决第一件事:它在 Whisper 的基础上加了词级对齐,每个词都有起止时间。断句靠规则和后处理解决第二件事。
一、整条链路长什么样
| 步骤 | 工具 | 输出 |
|---|---|---|
| 抽音轨 | ffmpeg | 16kHz 单声道 wav |
| 转写 + 对齐 | WhisperX | 词级时间戳 JSON |
| 说话人区分(可选) | WhisperX + pyannote | 带 speaker 标签 |
| 断句成字幕 | Python 脚本 | SRT |
| 合成 | ffmpeg | 软字幕轨或烧录版 |
每一步都能单独跑,出问题好定位。整条链路全本地,不上传任何素材。
二、装环境
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install whisperx
还要装 ffmpeg,Windows 用 winget install Gyan.FFmpeg,macOS 用 brew install ffmpeg,Linux 用系统包管理器。
有 NVIDIA 显卡的话确认 PyTorch 装的是 CUDA 版,否则会静默退回 CPU,一段十分钟视频要跑很久。第一次运行会自动下载模型,large-v3 有几个 GB,留在磁盘上。
三、命令行一次跑完
# 1. 抽音轨,16kHz 单声道是 Whisper 系列的标准输入
ffmpeg -i input.mp4 -vn -ac 1 -ar 16000 -c:a pcm_s16le audio.wav
# 2. 转写并对齐(指定语言能省时间也更准)
whisperx audio.wav --model large-v3 --language zh --output_format srt --output_dir out
# 3. 需要区分说话人时加 --diarize,需先在 Hugging Face 同意模型条款并配置 token
whisperx audio.wav --model large-v3 --language zh --diarize --output_format srt
生成的 out/audio.srt 就是字幕文件。
四、参数怎么选
| 参数 | 建议 | 说明 |
|---|---|---|
--model |
large-v3 |
精度最高;赶时间用 medium |
--language |
明确指定 | 不指定会先做语种检测,多花时间还可能误判 |
--batch_size |
8~16 | 显存小就调低,OOM 时先降这个 |
--compute_type |
float16 |
有显卡用 fp16,CPU 用 int8 |
--vad_filter |
开启 | 过滤静音段,减少幻听出来的句子 |
--diarize |
按需 | 访谈、会议类必须开 |
--vad_filter 值得单独说:视频里的静音、背景音乐段落,模型容易"听"出不存在的文字,开了 VAD 能挡掉很大一部分。
五、断句:决定字幕能不能读
模型给的是一整段话。直接按句号切,一行可能五六十个字,手机上三行塞不下。行业通行的规范:
- 每行不超过 42 个字符(中文按 16~20 个字算,占屏宽更宽)
- 每条字幕最多两行
- 每条停留 1~6 秒,太短看不清,太长观众会等
- 在标点处断,不要在词组中间切
一个可用的后处理思路:
MAX_LEN = 20 # 中文按字数
def split_line(words, max_len=MAX_LEN):
lines, buf = [], []
for w in words:
if sum(len(x["word"]) for x in buf) + len(w["word"]) > max_len and buf:
lines.append(buf)
buf = []
buf.append(w)
if buf:
lines.append(buf)
return lines
按词级时间戳累加到上限就断开,这样每行的时间轴天然准确,不需要事后重新对齐。
六、封装还是烧录
# 软字幕:原片不动,播放器可开关,体积只增加字幕文件
ffmpeg -i input.mp4 -i out/audio.srt -c copy -c:s mov_text output.mp4
# 烧录:直接把字幕压进画面,任何平台都能看到,但不可关闭
ffmpeg -i input.mp4 -vf "subtitles=out/audio.srt:force_style='FontName=Source Han Sans,FontSize=20'" -c:a copy output.mp4
发到短视频平台建议烧录,因为很多平台不读软字幕;存档和长视频建议软字幕,观众能关。烧录时中文字体要指定,否则会显示成方块。
七、质量清单:发布前逐条过
- 人名、品牌名、专业术语逐条核对——这是错误率最高的部分
- 数字和单位确认,尤其是"十"和"是"、"一"和"以"这类同音错
- 时间轴抽查三处:开头、中间、结尾。中段漂移说明有长静音没被正确切分
- 每条字幕停留时间是否够读
- 全片看一遍有没有整段缺失(通常是 VAD 把说话声当噪音过滤了)
常见问题
Q:中文识别该用 WhisperX 还是 FunASR? A:纯中文内容 FunASR 往往更准,尤其带口音和专有名词;中英混杂、多语种场景 Whisper 系列更稳。可以两个都跑,比对取好的。
Q:能翻译成双语字幕吗? A:能。把转写出来的文本交给 LLM 翻译,保留原有时间戳,再按原时间轴生成第二条字幕轨。别让模型重新断句,否则时间轴全废。
Q:时间轴整体偏移几秒怎么办?
A:多半是音视频起始时间不一致。用 ffmpeg -itsoffset 校正,或者对字幕统一做时间平移。
Q:一小时视频要跑多久?
A:取决于显卡。large-v3 在有 CUDA 的机器上通常比实时快数倍,CPU 上可能比实时还慢。先拿一分钟片段试跑,估出倍率再决定。
Q:能商用吗? A:Whisper 系列模型是开源许可,具体条款看仓库;说话人区分用的模型另有条款,商用前逐个确认。
相关文章
本站文章由编辑人工撰写,收录的工具均经过实测或公开资料核验。文中链接指向工具官网或 GitHub 仓库,仅作信息参考,不构成付费推广。