- Published on
我用 Codex 跑视频字幕的大致流程
最近在研究如何使用 codex 自动剪辑视频,现在终于了这套流程。先来看下效果
这套流程做的事很简单:给一段视频和一段配音,先用本地工具识别字幕,再修掉明显错字,最后把带样式的硬字幕烧进视频。需要的话,还可以从字幕里提炼封面标题,把封面插到视频开头。
核心链路是:
音频 -> SRT -> 修字幕 -> ASS
--> 烧录到视频 -> 抽帧检查
安装前提
我在 Mac 上跑,主要依赖两样:
brew install ffmpeg
brew install whisper-cpp
FFmpeg 负责音视频处理,包括合并音视频、转换字幕、烧录字幕、抽帧检查。whisper.cpp 负责本地语音识别,不需要把音频传到云端。
还需要准备一个 Whisper 模型文件,比如:
ggml-small.bin
模型可以从这里下载:
https://huggingface.co/ggerganov/whisper.cpp/tree/main
我现在用 small 模型。它体积和速度比较平衡,普通中文口播、教程录屏、少量中英文混排基本够用。遇到专有名词多的内容,再交给大模型做一轮字幕修复。
生成 SRT 字幕
最原始的识别命令大概是这样:
whisper-cli \
-m ./ggml-small.bin \
-f speech_1779677983686.mp3 \
-l zh \
-ng \
-osrt \
-of speech_1779677983686
跑完会得到:
speech_1779677983686.srt
SRT 里保存的是序号、时间范围和字幕文本:
1
00:00:01,000 --> 00:00:03,200
大家好,今天我们聊一下 Codex 怎么做视频字幕。
这一步只解决“听出来什么”和“什么时候显示”。它不负责样式,也不保证所有专有名词都识别正确。
修复字幕文本
whisper.cpp 容易把技术词听错,比如:
我们需要把 s 二 t 转成 ass 字幕
应该修成:
我们需要把 SRT 转成 ASS 字幕
这里可以让大模型处理,但要限制得很死:
只修复错别字、标点和专有名词。
不要改变句子原意。
不要合并或拆分字幕条目。
不要修改时间戳。
保持 SRT 格式不变。
字幕是跟音频对齐的,不能让模型把口播重写成另一种表达。它只负责清理文本,时间线仍然以 whisper 输出为准。
控制字幕长度
字幕不是普通文案,显示时长和阅读速度很重要。我的经验规则是:
- 一条字幕不要太长,中文大概控制在 12 到 20 个字。
- 显示时间不要太短,低于 0.8 秒通常很难读完。
- 显示时间也不要太久,超过 5 秒会显得拖。
- 长句优先按标点、语义停顿和呼吸点拆开。
脚本适合处理字数、时长、格式这些硬规则;大模型适合判断哪里断句更自然。
转成 ASS 并套样式
SRT 适合保存字幕内容和时间线,ASS 适合控制字幕样式,比如字体、字号、颜色、描边、背景框、边距和位置。
常用流程是先生成 SRT,再转成 ASS,然后写入统一样式。短视频或教程视频里,我常用的是:
白字
半透明黑底
底部居中
按视频真实分辨率设置字号和边距
ASS 的颜色格式是:
&HAABBGGRR
其中 AA 是透明度,00 表示完全不透明,FF 表示完全透明。比如不透明白色是:
&H00FFFFFF
半透明黑底可以用:
&H80000000
如果用 BorderStyle=3 做黑底字幕,最好让 OutlineColour 和 BackColour 保持一致。libass 渲染 box subtitle 时,背景框的可见颜色和 OutlineColour 也有关,只改 BackColour 可能会出现不符合预期的黑框。
脚本还会用 ffprobe 读取视频真实宽高,再写入 ASS:
PlayResX: 1920
PlayResY: 1080
这样字号和边距才是按真实视频像素计算的。
烧录字幕
硬字幕会直接变成视频画面的一部分,上传到短视频平台更稳,不依赖播放器加载外挂字幕。
最简单的 FFmpeg 命令是:
ffmpeg -i input.mp4 -vf "ass=subtitle.ass" output.mp4
如果视频和音频是分开的,就先合并视频流和音频流,再应用字幕滤镜。实际使用时可以直接跑脚本:
./burn_subbed_video.zsh \
-v cursorful-video-1779676088604.mp4 \
-a speech_1779677983686.mp3 \
-s speech_1779677983686.srt \
-o output_merged_subbed.mp4
烧完后抽一帧检查效果:
ffmpeg -y -ss 00:00:03 -i output_merged_subbed.mp4 -frames:v 1 subtitle_check.jpg
这一步能快速发现字幕是不是太大、底部距离是不是太近、黑底是不是过深、有没有挡住画面重点。
顺手生成封面
字幕本身就是视频内容摘要,可以拿来提炼封面标题。比如从字幕里提取关键词:
Codex
语音识别
SRT
ASS
字幕烧录
FFmpeg
再让大模型生成几组封面文案:
Codex 自动加字幕
语音识别、ASS 样式、FFmpeg 烧录
如果要把封面插到视频开头,可以先把封面图转成一小段视频,再和正文拼接:
cover.jpg -> cover.mp4
cover.mp4 + main.mp4 -> final.mp4
教程视频里,我更倾向于让封面停留 1 到 2 秒,再进入正文。这样平台预览和用户点开后的第一眼都更稳定。
Codex 的作用
Codex 在这里不是剪辑软件,而是把本地工具串起来的工程助手:
- whisper.cpp 负责语音识别。
- 大模型负责修错字、提关键词、生成封面文案。
- 脚本负责 SRT、ASS、时间线和样式参数。
- FFmpeg 负责合成音视频、烧录字幕、抽帧检查、拼接封面。
- 人负责最后判断效果。
这套流程的好处是可重复、可检查、可替换。识别不准就换模型或修提示词,样式不好就改 ASS 参数,烧录效果不对就抽帧看具体是哪一项出了问题。
后续还可以把这套流程整理成一个 Codex skill,用在更通用的视频剪辑和字幕处理场景里。
