本Skill提供三套完整的低成本AI短剧制作流程,覆盖从脚本到成片的全链路。
| 路线 | 视频方案 | 出图 | TTS | 成本 | 适用 |
|---|---|---|---|---|---|
| ------ | --------- | ------ | ----- | ------ | ------ |
| 路线A: 速创直出 | Grok Imagine 文生视频 | 无独立出图 | 速创TTS | ¥30-50/部 | 快速出片、试验性内容 |
| 路线B: 可灵精制 | 可灵Kling V3 图生视频 | Gemini Image | edge-tts 免费 | ¥80-120/部 | 连续剧集、高质量要求 |
| 路线C: Flow免费 | Google Flow Omni Flash 文生视频 | Nano Banana 2 | edge-tts 免费 | ¥0/部 | 免费、Chrome CDP自动化 |
触发词:
Step 0: 世界观管理(系列剧必做)
├── world-bible.md(世界状态变化)
└── characters.md(角色设定存档)
Step 1: 剧本与分镜创作
├── 确定主题/风格/时长
├── 旁白文本写作(每段≤15秒)
├── 详细分镜表(narration.json格式)
└── 用户审旁白+分镜
Step 2: 素材生成(路线A/B/C三选一)
├── 路线A: Grok Imagine直出视频
├── 路线B: Gemini Image出图 → 可灵图生视频
└── 路线C: Google Flow Omni Flash免费文生视频(Chrome CDP自动化)⭐
Step 3: TTS配音生成
├── 路线A: 速创API audio_tts
├── 路线B: edge-tts(免费)
└── 逐段试听,修复断词
Step 4: 音频驱动剪辑
├── 逐段按TTS时长裁剪/适配画面
└── 输出分段视频
Step 5: 字幕生成
├── Pillow透明PNG → FFmpeg overlay
└── 输出带字幕分段
Step 6: 三层音频合成
├── 旁白(1.0) + SFX(0.8-2.0) + BGM(0.18)
└── 音视频合并
Step 7: 审片迭代
├── 用户审片 → 逐点修改 → 增量迭代
└── 至P0=0, P1≤2 → 交付
Step 8: 素材导出与成本核算
⚠️ 铁律:不可跳步。 跳过Step 2分镜和Step 7审片环节,质量会崩塌,返工成本远超正规流程。
连续剧集项目必须维护两个核心文件:
记录每集发生后的世界状态变化。用于后续集数出图时保证世界观一致性。
# 世界观圣经
## 当前集数: E03
## 时间线状态
- 地球已启程XX年
- 太阳状态: [膨胀期/红巨星/氦闪后]
- 地表状态: [冰冻/解冻/...]
## 关键事件记录
- E01: ...
- E02: ...
角色设定存档,每集更新角色状态和prompt锚定词。
# 角色设定
## 主角
- 锚定词: "Chinese man in his 20s, round face, large dark eyes, short black hair"
- E01状态: ...
- E02状态: ...
- 标杆图: references/char_main_v3.png
锚定词使用: 每张涉及人物的出图prompt必须包含characters.md的锚定词,防止AI画出不同长相。
每段必须包含完整的叙事信息:
{
"id": "S05",
"type": "narration",
"text": "旁白文本(≤15秒)",
"shots": [
{
"id": "05a",
"type": "大远景",
"desc": "具体画面描述",
"motion": "slow push in",
"mode": "single",
"duration": "5s",
"ref": "references/earth.png"
}
],
"note": "叙事意图"
}
段落类型:
| 类型 | 用途 |
|---|---|
| ------ | ------ |
text_card | 黑底白字,开场/结语/标题 |
pause | 黑屏静默,情绪过渡 |
narration | 旁白+画面,正文 |
| 景别 | 用途 | 示例 |
|---|---|---|
| ------ | ------ | ------ |
| 大远景 | 环境交代、渺小感 | 地球在太空中 |
| 远景 | 场景全貌 | 地下城广场 |
| 中景 | 人物+环境 | 父子在餐桌旁 |
| 近景 | 人物表情 | 面部特写 |
| 特写 | 情感聚焦/细节 | 勋章、手 |
适用: 快速出片、试验性内容、预算敏感项目
API平台: https://api.wuyinkeji.com
注册链接: https://api.wuyinkeji.com/user/register?cps=UXPjoCgN
价格: ¥0.05/秒(按生成视频时长计费)
API调用方式:
批量生成策略:
Prompt要点: 英文效果更稳定,包含场景、光线、构图、镜头运动。
适用: 连续剧集、高质量要求项目
工具链: Gemini Image (Nano Banana Pro) 出图 → 可灵Kling V3 图生视频
API: https://api-beijing.klingai.com/v1/videos/image2video
鉴权: JWT (HS256, iss=AK, exp=30min)
并发限制: 3个任务同时
每张图/每个运镜prompt必须包含五层,缺一不可:
① 通用风格前缀(style-bible.md 的风格描述)
② 一致性约束(视觉一致性清单中对应元素的描述,逐条写入)
③ 叙事意境(镜头在故事中的位置、情节背景、角色情绪)
④ 画面描述(构图、机位、光影、材质、色彩)
⑤ 情绪/氛围关键词
⚠️ 踩坑教训: 只写①④⑤跳过②③ → 发动机比例错、防护服缺失、人种错。五层缺一不可。
出图前必须检查:
一致性清单(逐条对照):
| 元素 | 标杆图 | Prompt约束 | 常见错误 |
|---|---|---|---|
| ------ | -------- | ----------- | --------- |
| 人物 | characters.md或标杆图 | 必须含"Chinese"(日本角色用"Japanese") | 出西方面孔 |
| 核心场景 | 前集标杆图 | 外观/比例/材质必须一致 | 发动机比例错 |
| 关键道具 | 前集标杆图 | 形状/颜色/尺寸 | 勋章画成铁十字 |
| 环境特征 | world-bible.md | 时间线对应的环境状态 | 冰冻地球画成绿地 |
出图执行流程:
-i 传入标杆参考图(最多2-3张)Prompt示例(完整五层):
[①风格] Cinematic photorealistic, 2K, 16:9, cold blue-gray palette
[②一致性] Five-pointed star medal with flat broad points, hammer and sickle emblem, aged dark gunmetal, ~4cm, short frayed olive ribbon
[③叙事] Father silently pins his medal on his son's chest before the final mission — a wordless passing of duty
[④画面] Extreme close-up, father's weathered hands holding the medal, son's dark blue jumpsuit collar visible, soft side lighting casting half-shadow
[⑤关键词] solemn, intimate, bittersweet
必须包含三层信息:
[叙事情境] 旁白在说什么,观众应该感受什么
[具体动作] 镜头具体怎么动,什么元素在变化
[情绪关键词] contemplative / epic / intimate / terrifying
方向敏感必须写明:
禁止通用prompt:
问:两张图之间有没有明确的状态变化?
时长档位: 单图 5s/10s | 首尾帧 5s/10s/15s
选档原则: 选≥旁白时长的最近档,多出的裁剪。
时长匹配策略(逐镜头决策):
| 情况 | 方案 |
| ------ | ------ |
|---|---|
| 视频 > 旁白 | 裁剪(从开头或结尾) |
| 差 < 15% | 微减速(0.85x-0.96x) |
| 差 > 15% | 微加速(1.1x) + 裁开头 |
| 段落 > 15s | 拆成2-3个独立单图拼接 |
| ❌ 冻结帧 | 禁止 |
| ❌ 循环播放 | 禁止(可灵路线) |
首尾帧禁忌:
适用: 免费、全自动化、Chrome CDP 网页自动化批量生产
工具链: Chrome CDP (port 9222) → Google Flow (labs.google/fx/tools/flow) → Nano Banana 2 出图 + Omni Flash 文生视频
成本: ¥0(仅需 Google Flow 免费积分,Omni Flash 15 credits/镜头)
依赖skill: google-flow-automation(提供 generate-image.js / generate-one.js 核心脚本)
pkill -9 "Google Chrome"; sleep 2
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
--remote-debugging-port=9222 \
--user-data-dir="$HOME/Library/Application Support/Google/Chrome/Default" \
"https://labs.google/fx/tools/flow" &
sleep 5
# 手动登录 Google 账号
cd ~/.workbuddy/skills/google-flow-automation
# 生成角色参考图(每个年龄段生成2张,用户选最佳)
node generate-image.js \
--prompt "Portrait of a young Chinese man in his 20s, broad face, large dark eyes, short black hair, wearing late Qing dynasty peasant clothing, 1890s era, photorealistic, cinematic lighting" \
--aspect 16:9 \
--count x2 \
--output ./characters
⚠️ 角色审核是全流程唯一手工环节。 用户确认脸型、眼镜、服装、气质后才进入批量视频生成。
[
{
"id": 1,
"title": "片头-厦门大学全景",
"prompt": "Video of a cinematic aerial view of a historic Chinese university campus at dawn, golden sunlight, photorealistic, cinematic",
"narration": "在东南沿海的鹭岛,有一座大学,它的故事,要从一个人说起。"
}
]
关键字段:
id — 镜头编号(1开始,用于文件命名排序)title — 镜头标题(中文,用于文件命名 XX-标题.mp4)prompt — 英文视频提示词,必须以 Video of 开头(否则生成图片!)narration — 中文旁白(TTS用)角色锚定词(每个涉及人物的镜头必须包含):
young Chinese man with broad face, short black hairmiddle-aged Chinese man with broad face and round metal-rimmed glasseselderly Chinese man with broad face, white hair and round metal-rimmed glasses技术架构:
batch-generate.js (批量调度)
│
├── 逐镜头调用 generate-one.js (google-flow-automation skill)
│ ├── Chrome CDP 连接 (port 9222)
│ ├── 页面状态诊断 (DOM检测,非URL判断)
│ ├── 空状态检测 → 返回主页 → New project
│ ├── 进入 Scenes 模式 → New session
│ ├── Agent Settings: Omni Flash + 16:9 + 10s
│ ├── 填入提示词并提交
│ ├── 自动点击积分确认 (Yes)
│ ├── 轮询等待视频生成 (8分钟超时)
│ ├── page.evaluate fetch 下载 (带Cookie认证)
│ └── process.exit(0) 强制退出 ★关键
│
├── 断点续传 (检查已完成的 XX-标题.mp4)
├── 自动重命名 (video-xxx.mp4 → XX-标题.mp4)
├── 写入 progress.json
└── 失败重试 (最多2次/镜头)
使用模板脚本:
# 批量生成(断点续传)
cd ~/.workbuddy/skills/ai-short-film-studio/scripts
NODE_OPTIONS="" node batch-generate.js \
--script /path/to/storyboard.json \
--output /path/to/videos \
--name "我的短剧"
# 持续重试直到全部完成(最多10轮)
NODE_OPTIONS="" node retry-until-complete.js \
--script /path/to/storyboard.json \
--output /path/to/videos \
--name "我的短剧"
| 问题 | 修复方案 | 版本 |
|---|---|---|
| ------ | --------- | ------ |
提示词不以 Video of 开头 → 生成图片 | 脚本自动添加前缀 | v6 |
| DOM搜索找不到模型按钮 | 用坐标点击 page.mouse.click(825, 868) | v6 |
| 提示词被当聊天消息 | 每次生成前点 New session | v6 |
| 内联模型选择器不存在(Scenes模式由Settings控制) | 步骤⑤.5自动跳过 | v7 |
| 生成超时6分钟不够 | 增加到8分钟 | v7 |
| CDP WebSocket导致进程不退出 ★ | finally 块末尾 process.exit(0) | v7→v8 |
URL不含 /project/ 误判页面状态 | 用DOM状态(导航栏/输入框)判断 | v8 |
| Chrome被重定向到其他网站 | 自动导航回 Flow | v8.1 |
| 空状态页面 "doesn't seem to be anything here" | 检测→返回主页→创建项目 | v8.2 |
--use-system-ca is not allowed 错误 | NODE_OPTIONS="" 清空环境变量 | — |
execSync 输出被缓冲 | 改用 spawnSync + stdio: 'inherit' | — |
"scheduled and is waiting in the queue due to high demand"路线C使用与路线B相同的 TTS(edge-tts)和字幕(Pillow)方案,但通过 compose-video.py 模板脚本一键完成:
python3 ~/.workbuddy/skills/ai-short-film-studio/scripts/compose-video.py \
--base /path/to/project \
--storyboard /path/to/storyboard.json \
--output /path/to/最终成片.mp4 \
--voice zh-CN-YunjianNeural \
--rate -5%
该脚本自动完成5步:TTS生成 → 字幕PNG → 逐段合成 → 背景音乐 → 最终混音。
接口: POST /api/async/audio_tts
价格: ¥0.0006/字
{
"text": "台词内容",
"voice_id": "male-qn-jingying",
"speed": 1.0
}
注意事项:
{"model":"audio_tts","params":{...}}import edge_tts
comm = edge_tts.Communicate(text, "zh-CN-YunjianNeural", rate="0%")
await comm.save(output_path)
| 方法 | 场景 | 示例 |
|---|---|---|
| ------ | ------ | ------ |
| 加逗号 | 复合名词 | "小行星带,的战斗中" |
| 加顿号 | 并列词 | "绕着太阳、转十五个圈" |
| 改措辞 | 逗号也不行时 | "绕着太阳转"→"围绕太阳飞行" |
| 出3版选 | 不确定时 | 3种标点各出,听完选 |
| 角色类型 | 速创API | edge-tts |
|---|---|---|
| --------- | --------- | ---------- |
| 旁白/叙述者 | male-qn-jingying | zh-CN-YunjianNeural |
| 男主角 | male-qn-jingying | zh-CN-YunxiNeural |
| 霸道/硬汉 | male-qn-badao | — |
| 反派/俊朗 | junlang_nanyou | — |
| 成熟女性 | female-chengshu | zh-CN-XiaoxiaoNeural |
| 少女 | female-shaonv | zh-CN-XiaoyiNeural |
| 学生 | male-qn-daxuesheng | — |
| 醇厚长辈 | male-chunhou | — |
核心理念: 画面长度由语音旁白决定。先确定TTS节奏,再裁剪画面适配。叙事节奏由台词自然驱动。
每段(镜头, TTS)的处理:
1. ffprobe获取TTS实际时长 tts_dur
2. ffprobe获取源视频时长 src_dur
3. 决策:
├── src_dur ≥ tts_dur+0.5s → 直接裁剪到tts_dur
├── src_dur ≈ tts_dur → 直接裁剪
└── src_dur < tts_dur → stream_loop循环(路线A)/ 减速+冻结末帧(路线B)
4. 输出:seg_NNN.mp4(精确匹配配音时长)
ffmpeg -y -stream_loop -1 -i shot.mp4 -t {tts_dur} -c:v libx264 -preset fast seg.mp4
循环1-2次视觉重复感不明显,超过3次建议换镜头。
tpad=stop_mode=clone:stop_duration=Xs,适合末尾自然静止cumulative = 0.0
for i, (tts_file, shot_file) in enumerate(segments):
tts_dur = get_duration(tts_file)
trim_video(shot_file, tts_dur, f"seg_{i:03d}.mp4")
cumulative += tts_dur
# 验证:sum(seg) ≈ audio_concat ≈ final
FFmpeg路径: /opt/homebrew/bin/ffmpeg
已知限制: FFmpeg 8.x 无drawtext/libass,用Pillow替代字幕
方案: Pillow生成透明PNG → FFmpeg overlay叠加
from PIL import Image, ImageDraw, ImageFont
img = Image.new('RGBA', (1920, 160), (0,0,0,0))
draw = ImageDraw.Draw(img)
font = ImageFont.truetype('/System/Library/Fonts/STHeiti Medium.ttc', 48)
draw.text((960, 80), "台词文本", fill='white', font=font,
anchor='mm', stroke_width=3, stroke_fill='black')
ffmpeg -i seg.mp4 -i sub.png -filter_complex "overlay=0:H-h" output.mp4
字幕设计规范:
/System/Library/Fonts/STHeiti Medium.ttc)| 层级 | 音量 | 说明 |
|---|---|---|
| ------ | ------ | ------ |
| 旁白 | 1.0 | 最上层,永远最清晰 |
| SFX | 0.8-2.0 | 中层,按场景调整 |
| BGM | 0.18 | 底层,fade in 4s / fade out 5s |
-r 24)# 拼接视频
for f in seg_*.mp4; do echo "file '$f'" >> video_list.txt; done
ffmpeg -f concat -safe 0 -i video_list.txt -c copy video_concat.mp4
# 拼接音频
for f in audio_*.mp3; do echo "file '$f'" >> audio_list.txt; done
ffmpeg -f concat -safe 0 -i audio_list.txt -c copy audio_concat.aac
# 合并
ffmpeg -i video_concat.mp4 -i audio_concat.aac \
-c:v copy -c:a aac final.mp4
| 维度 | 检查内容 | 常见问题 |
|---|---|---|
| ------ | --------- | --------- |
| 音画同步 | 画面匹配配音 | 角色A说话但画面是角色B |
| 时长匹配 | 视频完整覆盖TTS | 话没说完画面就切 |
| 视觉一致性 | 人物/场景/道具一致性 | 同角色不同集长相不同 |
| 字幕准确 | 字幕与TTS一致 | 错别字、标点 |
| 节奏感 | 叙事节奏流畅 | 某段拖沓/仓促 |
| 画面质量 | 无AI瑕疵 | 人物变形、闪烁 |
| 物理方向 | 运动方向正确 | 发动机喷射方向错 |
| 视觉重复 | 无明显循环 | 超过3次循环 |
V1(初版合成)
↓
逐段审核(8个维度)
↓
问题清单按严重程度排序
├── P0(必须修):音画不匹配、字幕错误、一致性崩塌
├── P1(建议修):节奏拖沓、视觉重复>3次
└── P2(可优化):色调、画面质量
↓
V2(修复P0)→ 再次审核 → V3...
↓ 直到 P0=0, P1≤2
最终交付
v7_S05.mp4, v8_S05.mp4)MUST_REGEN(需重做)和 REUSE(可复用)~/Desktop/项目名称/
├── 01_字幕/ → 字幕PNG
├── 02_配音/ → TTS音频
├── 03_主图/ → 镜头缩略图
├── 04_视频/ → 分段视频
├── 05_矩阵表/ → 矩阵表.html + 素材结构.json
└── 最终成片.mp4
项目根目录/
├── scripts/E{XX}/
│ ├── narration.json # 分镜叙事结构
│ ├── motion_prompts.json # 运镜prompt
│ ├── produce_e{XX}_v{N}.py # 生产脚本(每版一个)
│ └── generate_tts.py # TTS批量生成
├── images/E{XX}/ # 插画(所有版本+标杆图)
├── audio/E{XX}/
│ ├── narration_v{N}/ # TTS + durations.json
│ └── bgm-*.mp3
├── output/E{XX}/ # 视频片段(按版本前缀)
├── storyboard/E{XX}/ # 分镜表
├── references/ # 标杆参考图
├── style-bible.md # 风格圣经
├── characters.md # 角色设定
├── world-bible.md # 世界观圣经
└── PRODUCTION_HANDBOOK.md # 本手册
路线A(速创直出):
| 项目 | 计算方式 | 参考单价 |
|---|---|---|
| ------ | --------- | --------- |
| Grok Imagine视频 | 总秒数 × 重试 × ¥0.05 | ¥0.05/秒 |
| TTS配音 | 总字数 × ¥0.0006 | ¥0.0006/字 |
| 合计 | — | ¥30-50/部 |
路线B(可灵精制):
| 项目 | 计算方式 | 参考单价 |
|---|---|---|
| ------ | --------- | --------- |
| Gemini Image出图 | ~70张 × 2版 = 140张 | ~$0.134/张 |
| 可灵视频 | ~35个片段 | ~¥3/个 |
| BGM (Suno等) | — | ~¥10 |
| TTS | 免费(edge-tts) | ¥0 |
| 合计 | — | ¥80-120/部 |
路线C(Google Flow免费):
| 项目 | 计算方式 | 参考单价 |
|---|---|---|
| ------ | --------- | --------- |
| Nano Banana 2 出图 | ~3张角色参考图 | ~5 credits/张 |
| Omni Flash 视频 | 25镜头 × 15 credits | 15 credits/镜头 |
| TTS | edge-tts 免费 | ¥0 |
| BGM | FFmpeg 生成 | ¥0 |
| 合计 | — | ¥0(仅需Google Flow免费积分) |
不只是描述画面,要把故事背景+情节+情绪融入prompt。这是出图质量飞跃的关键。
运镜、画面动态、镜头语言这些专业决策要主动做好,不能等用户指出。
不要堆砌。简单有力的画面比复杂冗余的画面更有情感冲击力。
过度优化是陷阱。用户确认OK → 不动。
不套模板,不用一张好图的风格去套另一张。
| 模型 | 价格 | 说明 |
|---|---|---|
| ------ | ------ | ------ |
| Grok Imagine 视频 | ¥0.05/秒 | 文生/图生视频,6-15秒 |
| audio_tts | ¥0.0006/字 | 多音色TTS |
| video_digital_humans | 按次 | 数字人视频 |
| ~~Sora2~~ | — | 已弃用(400错误) |
| 模式 | 时长 | 适用 |
|---|---|---|
| ------ | ------ | ------ |
| 单图 | 5s/10s | 短镜头、静态场景 |
| 首尾帧 | 5-15s | 有叙事连续感 |
google-flow-automation(generate-image.js / generate-one.js)| 模型 | 用途 | 积分 | 说明 |
|---|---|---|---|
| ------ | ------ | ------ | ------ |
| Nano Banana 2 | 文生图 | ~5 credits/张 | 角色参考图 |
| Omni Flash | 文生视频 | 15 credits/条 | 10秒/条,16:9或9:16 |
关键限制:
--remote-debugging-port=9222 启动Video of 开头(否则生成图片)process.exit(0) 必须加(CDP WebSocket不释放)process.exit(0) 解决 CDP WebSocket 导致进程不退出scripts/batch-generate.js、scripts/retry-until-complete.js、scripts/compose-video.pysucuang_api.md — 速创API完整接口文档和踩坑经验production_workflow.md — 制作流程详细参考batch-generate.js — Google Flow 批量视频生成(断点续传+自动重试+自动重命名)retry-until-complete.js — 持续重试包装脚本(最多10轮,应对Flow队列拥堵)compose-video.py — TTS+字幕+背景音乐一键合成(edge-tts + Pillow + FFmpeg)共 2 个版本