字幕制作与校对:SRT 从生成到烧录
上一课你拿到了配音。这一课约 7 分钟,把 AI 视频字幕从生成、校对到烧录完整走一遍——时间轴不用手打,edge-tts 在合成语音时会同时生成一份 SRT。
学完你能做什么
- 用 edge-tts 在生成配音的同时拿到时间轴对齐的 SRT 字幕文件
- 看懂 SRT 的结构,能手改文本和时间轴
- 按三查清单(错别字、断句时机、行长度)完成字幕校对
- 用 FFmpeg 一条命令把字幕烧录进画面
你现在的困境
- 「配音做好了,可一想到要逐句手打字幕时间轴,就不想动了。」
- 「网上的字幕工具一大堆,装了三个没一个用得顺。」
- 「好不容易烧上去,一看中文全变方块。」
什么时候用这一招
当你需要:给练习片的配音配上同步字幕,而且配音正是用 edge-tts 生成的。
而且不想:逐句手打时间轴,也不想为此购买付费字幕软件。
🎒 开始前的准备
- 完成上一课《配音与授权:TTS 与自己录两种方案》,已装好 edge-tts(
pip install edge-tts) - 本机能运行
ffmpeg -version(FFmpeg 已安装) - 至少有一个镜头片段视频(镜头阶段产出),用来演示烧录
核心思路
edge-tts 合成语音时,服务端会返回每段文字的时间边界。--write-subtitles 把这些边界直接写成 SRT,所以字幕和语音天然对齐——你只需要校对,不用自己打轴。
| 环节 | 工具 | 产出 |
|---|---|---|
| 生成 | edge-tts --write-subtitles | 与音频对齐的 SRT |
| 校对 | 任意文本编辑器 | 修正后的 SRT(UTF-8) |
| 烧录 | FFmpeg subtitles 滤镜 | 带硬字幕的 mp4 |
SRT 是纯文本格式,每个字幕块四部分(本课程通用格式说明):
1
00:00:00,000 --> 00:00:02,500
欢迎来到 AI 短剧课堂。
2
00:00:02,500 --> 00:00:05,000
今天我们来做字幕。时间轴格式固定为 时:分:秒,毫秒 --> 时:分:秒,毫秒,毫秒用逗号分隔,块之间空一行。
跟我做
第 1 步:生成配音时同步导出 AI 视频字幕文件
为什么:单独打轴是字幕制作里最耗时的一步,而 edge-tts 能在产出音频的同时产出对齐字幕,一步省掉。
在上一课的配音命令基础上加 --write-subtitles:
edge-tts --text "欢迎来到 AI 短剧课堂。" --write-media voice.mp3 --write-subtitles voice.srt你应该看到:命令跑完后,目录下同时出现 voice.mp3 和 voice.srt 两个文件。
- 小检查:用文本编辑器打开
voice.srt,能看到序号、时间轴、文本三要素
💡 上一课已经生成过配音?
在原命令上补 --write-subtitles voice.srt 再跑一次即可拿到字幕文件。
第 2 步:校对字幕——三查清单
为什么:机器按服务端返回的边界断句,不一定符合中文的阅读节奏;同音字错字也最容易被观众一眼看出来。
用任意文本编辑器打开 voice.srt,逐条过三查:
- 错别字:同音字(如「在/再」「以/已」)逐条朗读检查
- 断句时机:一行别在词中间断开;字幕太早出现或太晚消失都会让观众出戏
- 行长度:一行太长观众读不完,拆成两行或精简文本
改完保存为 UTF-8 编码。如果发现台词本身太长、怎么断都不顺,回看《对白精简:配音前先做减法》。
你应该看到:每条字幕读起来顺口、没有错字,行长度一眼能读完。
- 小检查:三查各过一遍,文件以 UTF-8 保存
第 3 步:用 FFmpeg 把字幕烧录进画面
为什么:烧录(硬字幕)把字幕渲染进画面本身,任何平台、任何播放器都显示,不依赖观众加载外挂字幕。
ffmpeg -i shot.mp4 -vf "subtitles=voice.srt" -c:a copy subtitled.mp4你应该看到:FFmpeg 处理完成后输出 subtitled.mp4,播放时画面下方显示字幕,且与语音对齐。
- 小检查:播放
subtitled.mp4,字幕与配音同步、无乱码
检查点 ✅
voice.srt与voice.mp3由同一条命令生成,时间轴对齐- SRT 已按三查清单校对,并以 UTF-8 保存
- 烧录后的视频字幕正常显示、无乱码
- 字幕时间轴与画面内容对得上
踩坑提醒
❌ 烧录后中文变方块或乱码
原因:SRT 文件编码不是 UTF-8,或系统缺少可用的中文字体。
正确做法:把 SRT 重新保存为 UTF-8 再烧录。若 SRT 来自其他工具、确实是别的编码,用 subtitles 滤镜的 charenc 选项声明编码(该选项仅在非 UTF-8 时有用)。缺中文字体时,把字体文件集中放进一个目录,用 fontsdir 选项指给滤镜,目录里的字体会在系统字体之外额外可用。
❌ 字幕时间轴和画面对不上
原因:SRT 的时间基于配音音频的起点,而剪辑拼接会移动画面起点。
正确做法:烧录放在剪辑定稿之后做,以最终成片的时间轴为准——下一课剪完片子再回来执行第 3 步。
❌ 手改时弄坏时间轴格式
原因:-->、逗号或时间位数被误改,SRT 整块失效。
正确做法:只动文本行;调时间时严格保持 00:00:02,500 --> 00:00:05,000 的格式。
❌ FFmpeg 提示找不到 subtitles 滤镜
原因:所用 FFmpeg 编译时没有启用 libass——subtitles 滤镜需要 --enable-libass 构建。
正确做法:改用编译时启用了 libass 的 FFmpeg 版本,再重跑烧录命令。
进阶技巧(可选)
自定义字幕样式:force_style
subtitles 滤镜会先把 SRT 转成 ASS 再渲染,默认样式不一定合你的意。force_style 接受 ASS 样式格式的 KEY=VALUE,多个用逗号分隔。FFmpeg 官方手册的示例——让字幕变成 80% 透明的蓝色 DejaVu Serif:
ffmpeg -i shot.mp4 -vf "subtitles=voice.srt:force_style='Fontname=DejaVu Serif,PrimaryColour=&HCCFF0000'" -c:a copy subtitled.mp4把 Fontname 换成你系统里已安装的中文字体名;其他样式参数同样以 KEY=VALUE 形式用逗号追加。
本课小结
- ✅ edge-tts
--write-subtitles:配音与 AI 视频字幕一次生成,免打轴 - ✅ SRT 四部分结构:序号、时间轴、文本、空行
- ✅ 三查清单:错别字、断句时机、行长度
- ✅ FFmpeg
subtitles滤镜:一条命令烧录硬字幕
| 字段 / 选项 | 推荐值 | 说明 |
|---|---|---|
--write-media | voice.mp3 | 配音音频 |
--write-subtitles | voice.srt | 同步生成的 SRT 字幕 |
subtitles 滤镜 | subtitles=voice.srt | 把字幕烧录进画面 |
charenc | 仅非 UTF-8 时设置 | 声明字幕编码 |
force_style | ASS 样式 KEY=VALUE,逗号分隔 | 覆盖默认字幕样式 |
fontsdir | 字体目录路径 | 目录字体在系统字体之外额外可用 |
下一课预告
字幕就位后,下一课《剪辑与音量检查:FFmpeg 拼出第一部成片》把镜头和配音拼成完整成片。你会学到:
- 用
trim裁掉镜头多余的头尾 - 用
concat把多段镜头拼成一条 - 用
loudnorm统一全片响度
剪完记得回来对成片执行第 3 步烧录,再进入《导出与发布前检查:对照 YouTube 官方规范》。
附录:源码参考
点击展开查看源码位置
更新时间:2026-11-07
| 事实 | 文件 | 位置 |
|---|---|---|
edge-tts 安装、基本用法与 --write-subtitles | docs/raw-edge-tts-readme.md | :9-13, :21 |
| 服务端 boundary 元数据与进度条行为 | docs/raw-edge-tts-readme.md | :71 |
subtitles 滤镜(libass)及选项 filename / charenc / force_style / fontsdir | docs/ffmpeg-filters.md | :17299-17343 |
subtitles=sub.srt 等价于 filename=sub.srt;force_style 官方示例 | docs/ffmpeg-filters.md | :17344-17367 |
SRT 时间轴格式为本课程通用格式说明;三查校对清单(错别字 / 断句时机 / 行长度)为课程教学模板。