先交代一下背景
最近在用 OpenClaw 做竖屏短视频。
注意,这里说的不是那种"输入文案就自动生成画面"的AI宣传类视频——比如即梦、Sora那样,输入一句话AI直接给你生成一段视频。
我做的不是这种。
我做的,是配音+字幕+画面三者完美对齐的渲染类视频:
- 文案我来写(或者让AI帮我二创)
- 配音我来生成(TTS)
- 然后让程序自动渲染出字幕条、每句话对应的大字画面
- 最后合成一个竖屏短视频
这种视频的难点在于音画同步——配音多少秒,画面就展示多久,字幕和语音完全对齐。
为什么选这条路而不是AI生视频?
当我想让AI帮我做视频时,它有两条路可以选:
路线A:AI生成类(调用即梦/Sora等API)
输入文案 → 调用即梦/可灵等AI生视频API → 直接生成画面
优点:画面炫酷,AI感强
缺点:需要额外API费用,效果不可控
路线B:渲染代码类(调用TTS+ffmpeg+PIL)
输入文案 → 调用TTS生成配音 → 用Python/PIL逐帧渲染字幕+大字 → ffmpeg合成
优点:成本极低(几乎零成本),时间和内容完全可控
缺点:画面是代码生成的,没有AI生成的炫酷感
我选择的是路线B。短视频的核心是文案和配音,画面只需要干净、清晰,能看就行。成本为零,而且完全可控。
如果你想做更炫酷的内容(比如AI生成人物说话),可以调用即梦API,OpenClaw也支持。
坑一:想省钱?微软edge-tts是个好选择
背景:
一开始用的是MiniMax的TTS API,中文效果也不错。但后来发现如果按用量付费的话,TTS的消耗其实不低。
解决方案:
微软的edge-tts是完全免费的,中文音色(晓晓)效果接近真人,而且支持直接调用:
pip install edge-tts
edge-tts --voice "zh-CN-XiaoxiaoNeural" --text "你的文案" --write-media output.mp3
省成本小技巧:如果你做视频的量比较大,edge-tts可以省下TTS的API费用。
坑二:TTS切句太碎(24句而不是7句)
问题现象:
脚本只有7行,但TTS生成了24个音频片段,导致每句话只有1-2秒,画面还没切换语音就结束了。
根本原因:
正则表达式按标点切分,把一句话里的每个分句都当成了独立的一句。
解决方案:
按段落(单换行)切分,不要按标点:
lines = [l.strip() for l in text.split('\n') if l.strip()]
先介绍一下渲染环节的背景
在渲染类视频的技术链路里,有一个环节是渲染画面。
一开始我想用的是Remotion这个框架。它的工作方式是:用React代码描述视频的每一帧,然后启动一个无头浏览器来渲染输出。
比如你写一段代码说"第0秒到第5秒显示大字'吃得越饱',配蓝色背景",Remotion就会自动渲染出对应的画面。
所以Remotion的角色是:把代码描述变成实际视频画面。
但是在使用Remotion的过程中,我踩了下面两个坑:
坑三:Remotion渲染内存不足("Out of Memory")
问题现象:
Remotion渲染时Chrome进程被系统杀掉,内存溢出了。
根本原因:
Remotion需要启动Chromium(Chrome的无头模式),这个进程本身非常耗内存。加上Node.js运行时,服务器只有4GB内存,很容易被OOM Killer杀掉。
解决方案:
干脆放弃Remotion,改用Python PIL直接逐帧生成图片,不需要浏览器:
from PIL import Image, ImageDraw
for frame in range(total_frames):
img = Image.new("RGB", (1080, 1920), bg_color)
draw = ImageDraw.Draw(img)
img.save(f"frames/frame_{frame:05d}.jpg")
生成完所有帧之后,用ffmpeg把图片合成视频。40秒视频约1200帧,耗时3-5分钟。
坑四:Remotion配置文件冲突(composition ID找不到)
问题现象:
运行渲染命令时报错,找不到composition。
根本原因:
项目目录里同时存在src/index.tsx和src/index.ts,Remotion默认读取了.ts文件而不是.tsx文件,导致注册的composition ID对不上。
解决方案:
删除旧的.ts文件,或在渲染时明确指定入口文件。
坑五:音频和画面不同步
问题现象:
画面和声音对不上——字幕消失了语音还在继续,或者语音结束了画面还在继续。
根本原因:
没有用TTS返回的真实时长,而是估算或用Whisper转写(有误差)。
解决方案:
TTS API直接返回每句的精确时长(毫秒级),这个时间戳是唯一基准:
duration_s = resp_data["extra_info"]["audio_length"] / 1000.0
坑六:脚本没有固化到本地文件夹
问题现象:
把Python代码内联执行,执行完就丢了,下次不知道用了什么参数。
根本原因:
没有把脚本当成"流程资产"来管理。
解决方案:
先把脚本写入文件,再执行:
cat > out/tts-generate.py << 'PYEOF'
...python代码...
PYEOF
python3 out/tts-generate.py
这样脚本成了可复用的"流程资产",不用每次重写。
总结
用AI做渲染类视频,技术链路很清晰:
- 写脚本(文案)
- TTS生成配音 + 精确时间戳
- 生成字幕数据 + 场景数据
- 逐帧渲染画面
- ffmpeg合成
每个环节都有坑,但每个坑都有解。核心原则:用TTS生成时的实际时长作为唯一时间基准,不要估算,不要转写,不要加速。
你遇到过类似的坑吗?评论区说说。
夜雨聆风