精确字幕同步师
何时使用
- 用户需要为口播/Vlog/短视频生成精确同步的字幕
- 之前用 whisper base 片段级时间戳导致"字幕和台词对不上"
- 需要字级/词级精度,确保每个字的出现时间和口播完全同步
- 需要生成 ASS 字幕用于 ffmpeg 烧录,或 SRT 用于剪映导入
核心优势
- 字级时间戳:每个汉字都有精确的 start/end 时间(如
去(0.00s~0.24s)) - 智能断句:按语义和字数自动分行,避免单行过长
- 关键词高亮:支持金句黄色、关键字红色标记
- 多格式输出:ASS(ffmpeg 烧录)、SRT(剪映导入)
前置条件
- openai-whisper(已安装,支持
--word_timestamps) - Python 3.10+
- ffmpeg(用于提取音频和最终烧录)
工作流
1. 提取音频
ffmpeg -y -i INPUT.MOV -vn -ar 16000 -ac 1 -c:a pcm_s16le audio_16k.wav
2. 词级时间戳转写
whisper audio_16k.wav \
--model base \
--language zh \
--word_timestamps True \
--output_format json \
--output_dir ./word_timestamps
输出 audio_16k.json,包含每个字的精确时间戳。
3. 生成精确 ASS 字幕
使用 scripts/generate_ass.py:
python3 scripts/generate_ass.py \
--json word_timestamps/audio_16k.json \
--output final.ass \
--max-chars 8 \
--max-lines 2 \
--highlight-words "金句,关键词" \
--keyword-red "核心词,关键"
参数说明:
- --max-chars:每行最多字数(默认 8)
- --max-lines:每屏最多行数(默认 2)
- --highlight-words:金句列表,用黄色显示
- --keyword-red:关键字列表,用红色显示
4. 烧录到视频
ffmpeg -y -i INPUT.MOV -vf "ass=final.ass" \
-c:v libx264 -preset medium -crf 23 \
-c:a aac -b:a 192k \
output_with_subtitle.mp4
5. 生成 SRT(剪映用)
python3 scripts/generate_srt.py \
--json word_timestamps/audio_16k.json \
--output final.srt \
--max-chars 8
字幕合并规则
基于字级时间戳,按以下规则合并为可读字幕行:
- 短句合并:≤4 字的短句合并到上一行
- 语义断句:在标点符号(,。!?)处断行
- 字数控制:每行最多 8 字,每屏最多 2 行
- 时间对齐:每行字幕的 start = 第一个字的 start,end = 最后一个字的 end
关键词标记规则
- 金句:整句用黄色(如"三十岁的时候,其实就是你十八岁的绽放")
- 关键字:句中核心词用红色(如"绽放"、"快乐"、"自由")
- 普通句:白色
与 local-video-roughcut 的关系
local-video-roughcut:完整剪辑工作流(转写→分析→剪辑→字幕→导出)precise-subtitle-sync:专注字幕同步,是 local-video-roughcut 的字幕增强模块
当用户只需要"给已剪好的视频加精确字幕"时,单独使用本 skill。
失败场景与对策
| 失败场景 | 原因 | 对策 |
|---|---|---|
| whisper 转写错误 | 模型识别不准 | 建立用户专属校正词典,自动替换 |
| 词级时间戳仍不准 | 音频质量差/背景噪音大 | 先用 ffmpeg 降噪:afftdn=nf=-25 |
| 单行字数过多 | 口播语速快 | 减小 --max-chars 到 6 |
| 关键词漏标 | 词典未覆盖 | 在 --highlight-words 中添加 |
依赖脚本
scripts/generate_ass.py:JSON → ASS 精确字幕scripts/generate_srt.py:JSON → SRT 剪映字幕scripts/correction_dict.json:用户专属校正词典(可扩展)
示例
输入:whisper JSON(含字级时间戳)
输出:ASS 字幕,每行 ≤8 字,金句黄色,关键字红色,时间精确到 0.01 秒