2026 年做 AI 短视频,真正的瓶颈已经不是"能不能生成",而是"能不能日产 10 条以上、风格还不飘"。很多创作者尝试过纯在线工具(可灵、即梦等)或本地 ComfyUI,但前者风格不可控,后者环境配置劝退。
本文将拆解一套 Codex + 本地工具链 的批量生产方案,单人稳定日产 10-14 条,单条均摊 3-6 分钟,边际成本接近零。
一、目录结构:先定框架再填肉
所有代码和素材都按以下结构组织,Codex 可以直接读取和生成:
ai-shorts/
├── prompts/ # 提示词模板(风格锚点在这里)
├── scripts/ # narration.txt(每行一条旁白)
├── videos/ # 分镜视频(务必使用英文路径)
├── audios/ # 配音音频
├── output/ # 合成成片
├── tts_batch.py # 配音批处理脚本
├── merge_batch.py # 视频合成脚本
└── main.py # 一键启动入口
关键原则:路径必须全英文,含中文的路径会导致 FFmpeg 批量处理时随机失败。
二、核心步骤 1:提示词——把"风格锚点"写死
风格漂移是批量生产最大的敌人。解决方案是在提示词中固定一个风格前缀,每次生成都不改动:
你是一位有 5 年以上短视频实战经验的导演兼爆款文案写手。
请严格按以下格式输出,不要添加任何额外解释。
主题:[你的主题]
目标时长:50 秒
目标受众:[具体人群]
风格要求:真实、有共鸣、微幽默,杜绝鸡汤和 AI 味
【旁白文案】
(口语化;前 3 秒必须强钩子;总字数 170-190 字;长句短句交替)
【分镜表】
镜头 1(0-8 秒):
- 画面描述:
- 镜头运动:
- 文生视频关键词(必须包含统一风格前缀「电影感,冷色调,真实光影,浅景深,禁止人物变形」):
- 字幕重点:
镜头 2(8-16 秒):
...
【BGM 建议】
【整体色调关键词】
关键就一句话:「统一风格前缀」这个字段每次都要一字不改地带上,它是抗漂移的锚点。改主题可以,改锚点不行。
三、核心步骤 2:配音批处理(Edge-TTS)
安装依赖:pip install edge-tts
# tts_batch.py
import asyncio
from pathlib import Path
import edge_tts
VOICE = "zh-CN-YunxiNeural" # 偏年轻;晓晓偏亲和;云扬是新闻腔别用
RATE = "+8%" # 比默认稍快,完播率更好
OUT_DIR = Path("audios")
async def generate_voices(texts: list[str], out_dir: Path = OUT_DIR):
out_dir.mkdir(parents=True, exist_ok=True)
for i, text in enumerate(texts, 1):
output_file = out_dir / f"narration_{i:03d}.mp3"
for attempt in range(3):
try:
comm = edge_tts.Communicate(text, VOICE, rate=RATE)
await comm.save(str(output_file))
break
except Exception as exc:
if attempt == 2:
raise
print(f"第 {i} 条失败,1.5s 后重试")
await asyncio.sleep(1.5)
print(f"已生成:{output_file}")
await asyncio.sleep(0.5) # 串行间隔,避免限流
if __name__ == "__main__":
texts = open("scripts/narration.txt", encoding="utf-8").read().splitlines()
texts = [ln.strip() for ln in texts if ln.strip()]
asyncio.run(generate_voices(texts))
文件名用 narration_001.mp3 三位补零格式,确保排序正确(避免 10 排在 2 前面)。
四、核心步骤 3:视频标准化 + 批量合成
视频标准化(解决音画不同步)
ffmpeg -i raw.mp4 \
-r 25 \
-vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2" \
-c:v libx264 -pix_fmt yuv420p -crf 20 \
-c:a aac -ar 44100 -b:a 192k \
videos/std_001.mp4
全链路统一 44100Hz + 25fps,这是避免口型对不齐的关键。
批量合成脚本
# merge_batch.py
import subprocess
from pathlib import Path
def batch_merge(video_dir, audio_dir, output_dir):
videos = sorted(Path(video_dir).glob("*.mp4"))
audios = sorted(Path(audio_dir).glob("*.mp3"))
if len(videos) != len(audios):
raise ValueError(f"数量不匹配:视频 {len(videos)} 个 / 音频 {len(audios)} 个")
for i, (v, a) in enumerate(zip(videos, audios), 1):
output = Path(output_dir) / f"final_{i:03d}.mp4"
subprocess.run([
"ffmpeg", "-y", "-i", str(v), "-i", str(a),
"-c:v", "copy", "-c:a", "aac", "-b:a", "192k", "-ar", "44100",
"-shortest", "-movflags", "+faststart", str(output)
], check=True, stdout=subprocess.DEVNULL)
print(f"合成完成:{output}")
-c:v copy 不重编码秒出,-shortest 避免尾部黑屏,+faststart 支持边下边播。
五、一键启动
# main.py
import asyncio
from pathlib import Path
from tts_batch import generate_voices
from merge_batch import batch_merge
ROOT = Path(__file__).parent
def main():
texts = [ln.strip() for ln in open(ROOT/"scripts/narration.txt", encoding="utf-8") if ln.strip()]
asyncio.run(generate_voices(texts))
batch_merge(ROOT/"videos", ROOT/"audios", ROOT/"output")
if __name__ == "__main__":
main()
之后每天只需:往 narration.txt 贴文案 → 把分镜视频丢进 videos/ → 运行 python main.py。
六、高频踩坑与解决方案
| 问题 | 原因 | 解法 |
|---|---|---|
| 风格严重漂移 | 提示词每次都不一样 | 固定风格前缀,每批抽检 3 条 |
| 口型对不齐 | 音频 44.1k vs 视频 48k 混用 | 全链路统一 44100Hz + 25fps |
| FFmpeg 随机失败 | 路径含中文或并发过高 | 全英文路径 + 串行执行 |
| Edge-TTS 403 | 请求过密被限流 | 串行 + 间隔 0.5s + 重试 3 次 |
| 完播率低 | 前 3 秒钩子太弱 | 提示词中写死"前 3 秒必须出现冲突" |
七、真实效率数据
- 单人稳定日产 10-14 条可直接发布的视频
- 单条均摊 3-6 分钟,人工只占约 1 分钟
- 综合效率比纯在线工具提升约 2.5 倍
这套流程的价值不在"生成",在于把不可控的创意劳动,变成了可控的工业流程。
来源:CSDN 作者「小二爱编程」《用 Codex 从零搭一套 AI 短视频流水线:提示词 + 批量脚本 + 真实踩坑》(2026-09-20)
资料最后核对日期:2026-09-25 · 内容整理自 CodexGuide 社区公开教程