Steve短剧自动拍 · 商业级全自动短剧生产线
用户输入:一句话创意 / 剧本 / 大纲 +(可选)时长与画幅
交付:可直接上传抖音的成片 + 封面 + 标题文案标签 + 发布清单
> 判断标准不是"生成了视频",而是:用户拿到手不需要再碰任何工具,直接上传就能发。
九步流水线
创意 → ①建结构锁时长 → ②写爆款分镜 → ③闸门(结构+合规+配音预算)
→ ④参考图 → ⑤配音 → ⑥先导幕 → ⑦全量生成 → ⑧合成交付 → ⑨发布物料
铁律(改一条都会翻车)
| # | 规则 | 原因 |
|---|---|---|
| 1 | 时长先锁死(steve_plan.py init),seconds 是预算 |
按灵感写必超时/烂尾 |
| 2 | 对白写进 prompt 用模型原生音轨;旁白用 TTS | 唯一可靠的口型同步 = 原生音轨 |
| 3 | characters[].lock 原文复用进每镜 image_prompt |
崩脸唯一根因是 lock 被改写 |
| 4 | 生成前 steve_check.py FAIL 清零(含合规+配音闸门) |
每条 FAIL 都是已花的钱 |
| 5 | 先导幕(act_01)给用户确认后再放全量 | 86 镜返工代价极高 |
| 6 | 画面永不出现文字(negative 固定),字幕只最后烧 | 画面字=废镜 |
| 7 | 拼接只用 steve_compose.py(两级 concat 滤镜,禁 -c copy) |
priming 累积导致口型漂移 |
| 8 | 交付前 steve_viral.py audit ≥70 分且合规 0 FAIL |
商业交付的下限 |
| 9 | 台词密度 220~420 字/分钟、平均镜长 5~7s、反转按 viral-playbook.md 布点 |
完播率的根 |
使用前准备(首次,约 3 分钟)
零配置即用:视频走 Agnes 公开中转(无需自备 key),配音走 edge-tts(免费无 key)。
1. 装依赖
# 必需:Python 3.10+ 的 edge-tts(配音);pyyaml 与 Pillow(封面/图片处理)
python3 -m pip install edge-tts pyyaml Pillow
# 可选:本地 ASR 台词核对(steve_check.py --asr)
python3 -m pip install openai-whisper
ffmpeg / ffprobe 必须有,且要能被 ffmpeg 这个命令名调用:
ffmpeg -version # 能打印版本即可
# 没有的话按平台装:
brew install ffmpeg # macOS
sudo apt install ffmpeg # Debian/Ubuntu
winget install Gyan.FFmpeg # Windows
> 装在非标准位置时设 STEVE_FFMPEG 指向完整路径(如 STEVE_FFMPEG=/opt/ffmpeg/bin/ffmpeg)。
> 脚本会自动探测 PATH → 常见安装目录,找不到才报错。
2. 定位脚本目录(后文 $SK / $PY 直接用这两个变量)
# skill 目录按你的客户端选一个:
SK="$HOME/.workbuddy/skills/steve-short-drama-auto/scripts" # WorkBuddy
# SK="$HOME/.codebuddy/skills/steve-short-drama-auto/scripts" # CodeBuddy
# 用哪个 Python 跑:优先隔离 venv,其次系统 Python
PY="python3"
# 自检:应打印出 ffmpeg 路径与 6 种画幅
$PY $SK/steve_plan.py --help >/dev/null && echo "脚本就绪"
> 代理环境(公司内网 / 沙箱)若 pip 或下载失败,加 -i https://pypi.tuna.tsinghua.edu.cn/simple。
3. 进阶(可选)
- 用自己的 Agnes 额度:
export AGNES_PROXY_URL=https://api.agnes-ai.cn+ 各脚本加--api-key - 换成商业 TTS:
export STEVE_TTS_BASE=... STEVE_TTS_KEY=...(OpenAI 兼容网关)
目录约定
<项目>/
├── series.json # 唯一数据源
├── plan.md # 大纲表(给人看)
├── 01_assets/ # 角色/场景参考图
├── 05_cover/ # 封面 + 钩子卡 + 关注卡
├── 06_voice/ # TTS 配音 + dub_manifest.json(逐句时间戳)
├── 07_story/ # 分镜视频 + state.json
├── final/ # 成片(clean/sub/douyin)+ 分幕 + 字幕 + 章节
└── 09_publish/ # 发布物料(标题/描述/标签/清单)
① 建结构(锁时长,零 API)
先问清(没说就用默认):时长(默认 1~3 分钟竖屏爆款,最长 10)、题材、画幅(默认 9:16)、
平台(默认抖音)。
$PY $SK/steve_plan.py init --title "深夜快递" --minutes 2 --acts 3 \
--ratio 9:16 --style cinematic --kind drama --genre "悬疑反转" \
--hook "深夜快递站,收件人竟然是我自己" \
--characters "林晚,陈昊,老周" --scenes "_scene_gate,_scene_room,_scene_street" \
--scene-per-act --out ./series.json
$PY $SK/steve_plan.py estimate ./series.json
--style电影级预设:cinematic/hongkong/guofeng/cyberpunk/documentary/warm/anime--kind:drama(剧情短剧)/narration(解说短片)hook/genre/viral_title直接决定爆款体检和发布物料质量,必须填- 产出
plan.md大纲表给用户过一遍(全自动模式可跳过确认)
② 写爆款分镜(agent 核心创作)
按 references/viral-playbook.md 写:前 3 秒钩子 → 冲突推进 → 55%~75% 放主反转 →
结尾留钩 + CTA。按 references/prompt-templates.md 填 lock/image_prompt/video_prompt。
硬性约束(steve_check.py 会逐条验):
image_prompt原样内嵌角色lock(整段粘,不改写)- 台词字数 ≤
seconds × 4.2,单句 ≤25 字;塞不下拆镜 - 旁白(narration)短句 ≤16 字,动词开头,转折词句首(TTS 念着顺)
scenes[].name与镜头scene对应;台词里不踩合规词库
同时把 meta.logline、meta.viral_title(含【】高亮)、meta.genre 填上。
③ 闸门(零 API,必过)
$PY $SK/steve_check.py ./series.json
FAIL 清零才准花钱:结构/锚点/台词预算/总时长/引用一致性 + 平台合规词库
(广告法极限词、医疗/金融承诺、站外引流、涉黄涉暴涉赌)+ 配音时长闸门。
④ 角色/场景参考图
$PY $SK/steve_assets.py --series ./series.json --dry-run
$PY $SK/steve_assets.py --series ./series.json
出图给用户确认长相(全自动模式发给用户过目即可,不等待)。
> 走免费本地出片(⑦-备选 --backend local)时可以跳过这一步:本地引擎没有参考图会
> 自动沿用上一镜末帧起步,画面依然连贯。想进一步省钱/省时间就用这条路径。
⑤ 配音(TTS,自动)
$PY $SK/steve_tts.py --series ./series.json --out-dir ./06_voice --mode narration
$PY $SK/steve_tts.py --series ./series.json --out-dir ./06_voice --mode dub \
--voice-map "林晚=zh-CN-XiaoyiNeural,陈昊=zh-CN-YunxiNeural" # 解说片用全配音
narration(默认):只配旁白,逐句合成、精确时间戳;对白仍走原生音轨- 音色自动按角色分配并回写
series.json;超长配音当场报 FAIL(回 ② 删字) - 音色表/听感调优见
references/tts-and-voice.md
⑥ 先导幕(强制闸门)
$PY $SK/steve_shots.py --series ./series.json --acts act_01 \
--out-dir ./07_story --concurrency 3 --wall 2400
$PY $SK/steve_compose.py --series ./series.json --act-only act_01 \
--output-dir ./final --dub-dir ./06_voice --subtitle-style douyin
先导成片 + 参考图给用户确认:形象/风格/台词节奏/配音听感。用户点头再放全量。
⑦ 全量生成
$PY $SK/steve_shots.py --series ./series.json \
--out-dir ./07_story --concurrency 3 --wall 5400
断点续跑(重跑同命令自动跳过 done);--regen 镜号 单镜重做;--retry-failed 重排队。
⑦-备选 · 免费本地出片(本机显卡,零 API 费用)
不想花 API 钱、或云端接口不可用时,把 ⑦ 换成 --backend local:画面改由用户自己电脑的
显卡生成,引擎是 ComfyUI + 阿里开源的 Wan 2.2 TI2V-5B(Apache 2.0,可商用)。
零费用、可完全断网,8 GB 显存起步。
$PY $SK/steve_shots.py --series ./series.json --out-dir ./07_story --backend local
一次性准备(只在第一次做,约 15 分钟)
# 1) 本机要有 ComfyUI(含 .venv 且 torch 带 CUDA)
export STEVE_COMFY_ROOT="E:/Comfy Run/ComfyUI/ComfyUI" # 换成含 main.py 的目录
# 2) 一键取模型:从魔搭 ModelScope 下载三件套(≈17GB,断点续传,实测 ~30MB/s)
$PY $SK/steve_fetch_models.py # 自动找 ComfyUI;也可 --root / --dest 指定
# 3) 自检:会自动拉起 ComfyUI,并明确告诉你还缺什么
$PY $SK/steve_local.py --selftest
> 手动下载也可以:ModelScope 仓库 Comfy-Org/Wan_2.2_ComfyUI_Repackaged,
> 取 split_files/ 下同名文件放进 models/ 对应子目录(合计 ≈17 GB):
| 文件 | 放到 | 大小 |
|---|---|---|
wan2.2_ti2v_5B_fp16.safetensors |
models/diffusion_models/ |
9.31 GB |
umt5_xxl_fp8_e4m3fn_scaled.safetensors |
models/text_encoders/ |
6.27 GB |
wan2.2_vae.safetensors |
models/vae/ |
1.31 GB |
Wan22_TI2V_5B_Turbo_lora_rank_64_fp16.safetensors |
models/loras/ |
0.30 GB |
本地模式的两项连贯性保障(不用额外配置)
- 单镜超长自动分段:单段默认上限 121 帧(≈5.04s@24fps),更长的镜头会被切成多段,
每段用上一段末帧当首帧接续,最后自动拼成一条,画面不跳 - 无参考图也能连贯:没有 ④ 的参考图时,自动沿用上一镜的末帧起步。
所以本地路线可以整条跳过 ④(对零成本起号很有用)
本地模式的 3 个硬注意
- 画面没有原生音轨 —— 本地生成的视频是纯画面,台词必须靠配音。
⑤ 那步务必用--mode dub(全配音),不要用默认的narration - 显存 —— 8 GB 能跑(ComfyUI 自动分层卸载),但分辨率别超过 704×1280;
长镜头的 VAE 解码默认走分块解码(STEVE_VAE_TILED=0可关),否则 121 帧
整段解码会显存颠簸卡死 - 速度 —— 默认 20 步较慢;
steve_fetch_models.py会顺带下载 5B Turbo 加速
LoRA(rank64 fp16,317 MB),检测到就自动切 4 步 / CFG 1.0,单段 5 秒
704×1280 从 16 分钟级降到 ≈2.5 分钟(RTX 4060 Ti 实测)。也可手动指定:
--local-lora <文件名> 0.8;环境变量STEVE_LOCAL_LORA同效
⑧ 合成交付(商业规格)
$PY $SK/steve_cover.py --series ./series.json --out-dir ./05_cover \
--from-video ./final/steve_final_clean.mp4 --at 3 \
--title "【反转】深夜送快递,收件人竟是我自己" --badge "第1集" \
--cta "关注我 · 下集更狠"
$PY $SK/steve_compose.py --series ./series.json --video-dir ./07_story \
--output-dir ./final --dub-dir ./06_voice --subtitle-style douyin \
--karaoke --platform douyin --autofit --strict \
--hook-card ./05_cover/hook.jpg --cta-card ./05_cover/cta.jpg
产出:
| 文件 | 说明 |
|---|---|
final/steve_final_douyin.mp4 |
主交付:1080×1920、-14 LUFS、大字幕、首尾卡、faststart |
final/steve_final_sub.mp4 |
带字幕版(720P 原生) |
final/steve_final_clean.mp4 |
无字幕纯净版 |
final/acts/act_0N.mp4 |
分幕文件 |
final/steve_final.srt / .ass |
字幕(douyin 样式 + 卡拉OK) |
05_cover/cover.jpg |
3:4 抖音封面(大标题+高亮+角标) |
final/制作说明.txt / meta.json |
署名与参数 |
字幕样式:douyin(大字黑描边+钩子词黄色高亮,位置抬高 22% 避开平台 UI);
--karaoke 用配音逐字时间戳做逐字变色。
⑨ 爆款体检 + 发布物料(发布前必过)
$PY $SK/steve_viral.py audit ./series.json --json ./09_publish/viral_report.json
$PY $SK/steve_viral.py publish ./series.json --out-dir ./09_publish
audit:黄金3秒钩子/节奏/信息密度/反转分布/结尾钩子/标题 六维打分 + 合规扫描。
≥70 分且合规 0 FAIL 才算可交付;不达标回 ② 修(零成本)publish:标题候选×5、描述文案、话题标签、发布时间建议、上传检查清单- 用
present_files交付:douyin 成片 + 封面 + 发布物料.md,并附 3 条数据复盘阈值
(5s 跳出 <50%、完播 >35%、互动 >3%)
一句话全自动模式
用户明确说"全自动/别问我/直接给我成片"时:①③ 不等确认(但仍打印大纲与体检报告),
④⑤⑥⑦ 连跑,⑧⑨ 完成后一次性交付;先导幕成片随最终交付一起给出供回看。
除此之外任何 FAIL/合规问题仍必须先修再跑 —— 全自动不等于带病上线。
参数速查(Agnes)
| 项 | 值 |
|---|---|
| 视频模型 | agnes-video-2.5-flash,单镜 4~12s,size 固定 "720P" |
| 画幅 | 9:16/16:9/1:1 原生;21:9/4:3/3:4 居中裁剪 |
| 参考图 | ≤5 张,本地路径自动转 base64 |
| 图片模型 | agnes-image-2.5-flash |
| 并发 | ≤4,轮询 ≥10s |
错误处理
| 情况 | 处理 |
|---|---|
401/429 |
换 key / 降并发降轮询(脚本已退避) |
| TTS "No audio was received" | 已内置重试;仍失败检查该句是否纯标点/空文本 |
| TTS 超长配音 | 回 ② 删字拆镜(check 阶段拦截);救急 --autofit(≤1.3×) |
| 找不到 ffmpeg | 装 ffmpeg 或设 STEVE_FFMPEG |
| 合成卡住不动 | 音轨声道不一致卡死 AAC;脚本已强制 aformat=stereo + -ac 2,自行改命令务必保留 |
| 总时长不达标 | 首尾卡时长已计入基准;仍超 ±5% 按幕增删镜头 |
| 字幕与嘴不同步 | 配音镜头按实测语音时间对齐;未配音镜用 steve_check.py --asr 定位后 --regen |
| 合规 FAIL | 必须改词重新过闸门,不许 --no-compliance 绕过 |
资源引用
scripts/steve_plan.py— ① 结构规划(时长预算/风格预设/爆款字段)scripts/steve_assets.py— ④ 参考图批量生成scripts/steve_tts.py— ⑤ 配音引擎(edge-tts/OpenAI 兼容、逐句时间戳、音色分配)scripts/steve_shots.py— ⑥⑦ 分镜视频批量生成(滚动调度/断点续跑/接力)scripts/steve_compose.py— ⑧ 合成(配混音闪避/大字幕/卡拉OK/首尾卡/loudnorm/平台转码)scripts/steve_check.py— ③ 闸门(结构+合规+配音时长+ASR 台词核对)scripts/steve_viral.py— ⑨ 爆款体检 + 平台合规 + 发布物料scripts/steve_cover.py— ⑧ 封面/钩子卡/关注卡scripts/_agnes.py— 共享底座references/viral-playbook.md— 爆款方法论(写分镜前必读)references/platform-specs.md— 平台规格与合规红线references/tts-and-voice.md— 配音音色与旁白写作references/prompt-templates.md— 提示词模板 + 电影级词汇表references/story-structure.md— 结构范式与镜头节奏references/longform-pitfalls.md— 长剧集专有坑