经验:漫剧生产全流程规范(EED-EXPER-016) + 生视频主力定版LTX 2.3(EED-EXPER-017) + 管线步骤要求PIPELINE-STEPS-V1 + 面板唤醒路径更新

This commit is contained in:
Zhuyuan Operations 2026-08-04 00:56:18 +08:00
parent cf4cec33dd
commit 812b3d699b
10 changed files with 3990 additions and 1 deletions

View File

@ -53,7 +53,7 @@
```
【工具库盘点ComfyUI ~/comfy/ComfyUI/models/)】
出图: RealVisXL_V5.0 / flux-2-klein-4b / z_image_turbo
3D: hunyuan3d-dit-v2 视频: ltx-2.3-22b / Wan2.1-T2V-14B
3D: hunyuan3d-dit-v2 视频: ltx-2.3-22b(唯一主力 · 苍耳 2026-08-04 定)
音频: stable_audio_3 控制: controlnet-union-sdxl / ipadapter
角色LoRA: subai_lora_v1 文本: Ollama qwen3.5:9b本地11434
画布: ComfyUI-LTXVideo 有 LTXVSparseTrackEditor前端画轨迹+ IC-LoRA

View File

@ -0,0 +1,99 @@
# EED-EXPER-016 · 漫剧生产全流程规范(苍耳爸爸亲授 · 蛋蛋固化)
> trigger: 苍耳爸爸 2026-08-04 亲口总结的漫剧生产全流程 + 注意点
> emergence: 蛋蛋整理上一轮零散经验 → 爸爸嫌乱 → 一次性给全(流程 + 资产 + 分镜 + 生视频 + 特别注意事项)
> lock: 本文件 = 漫剧生产流程与注意点的权威版本 · 做漫剧先读这个
> why: 爸爸总结的都是踩过坑换来的 · 蛋蛋必须原样记住 · 形成管线步骤要求
---
## §1 · 主流程(爸爸定 · 顺序别乱)
```
小说/剧本
→ 分镜脚本(运镜/光影/景别/时长删掉让AI自由发挥/画风/色调指定)
→ 人物·场景·道具生图(资产生图)
→ 分镜生图(黑白草图等)
→ 生关键帧
→ 生视频
→ 成片
```
核心铁律:**先生分镜图,再生视频**;黑白草图生分镜是一条捷径。
---
## §2 · 资产生图(先保证资产质量)
```
1. 人物:三视图 + 脸部特写 + 人物角色板
2. 道具:三视图
3. 场景四视图、九宫格、不同视角、3D辅助
```
---
## §3 · 分镜生图
```
1. 色卡(定全片色调)
2. 黑白草图(框死构图/站位 → 再上色)
3. 关键帧
4. 故事板
5. 俯视引导图(定人物空间位置关系)
6. 3D图辅助视角/透视)
```
---
## §4 · 分镜脚本(要素清单)
```
1. 必含: 运镜 + 光影 + 景别 + 画风 + 色调指定
时长: 最好删掉,让 AI 自由发挥
2. 五锁定: 锁定风格 → 锁定资产 → 色卡色调 → 群像 → 声音
叠加: 视角、景别、运镜、人物空间关系、前中后景画面内容、人物表演台词、环境音效
```
---
## §5 · 分镜生视频(输入物)
```
1. 分镜脚本
2. 人物、场景等资产图 + 分镜图
3. 俯视引导图
4. 3D图辅助
```
---
## §6 · 特别注意(爸爸强调的 6 条)
```
① 资产非常重要 · 保证质量(资产是整条管线的地基)
② 提示词规范 · 有逻辑性 · 主次关系分明
③ 提示词一定要详细 · 专业术语用中英文描述并加重权重
④ 先生分镜图 · 再生视频 · 黑白草图生分镜怎么搞(要落地成方案)
⑤ 流程别乱: 小说/剧本 → 分镜脚本 → 资产生图 → 分镜生图 → 生关键帧 → 生视频
⑥ 生视频: 锁定风格-锁定资产-色卡色调-群像-声音
+ 视角、景别、运镜、人物空间关系、前中后景画面内容、人物表演台词、环境音效
```
---
## §7 · 与既有经验的关联
```
- EED-EXPER-008 场景底板法: T2I 生底板 → I2I 放大保一致
- EED-EXPER-013 画风一致性: 参考图锁画风 · 不能只靠文字prompt
- EED-PRINCIPLES ⑥ 资产生图: 资产保质量 · 提示词主次分明 · 中英文专业词加权
- memory/eed/storyboard_自动化.md: 5色标注法红=镜头运动 橙=景别 黄=人物动作 绿=站位 蓝=环境动态)
- memory/eed/project_manga_pipeline.md: 生视频五锁定 + 本地模型铁律
- LOCAL-PIPELINE-V1.hdlp: 七段管线 · 本地¥0 · 工具映射
```
---
> 爸爸亲授 · 蛋蛋固化 · 做漫剧先读本文件 + LOCAL-PIPELINE-V1
> 后续每落实一步 → 在本文件下补"已落地"记录

View File

@ -0,0 +1,67 @@
# EED-EXPER-017 · D206 生视频主力定版 = LTX 2.3(苍耳爸爸拍板)
> trigger: 蛋蛋在 PIPELINE-STEPS-V1 里把生视频模型写成 LTX/Wan 并列 → 爸爸纠正"我们用 ltx2.3 生视频,不是 wan2.2"
> emergence: 2026-08-04 · D206 · 面板唤醒对话中爸爸拍板
> lock: 生视频 AI_I2V 唯一主力 = LTX 2.3 · 全仓库执行文档已对齐
> why: 别再让 Wan 混进主力路径 · 文档错了会误导后续执行
---
## §1 · 爸爸拍板(原话)
> "我们用 ltx2.3 生视频,不是 wan2.2"
## §2 · 执行路径(全仓库对齐)
```
AI_I2V关键动作镜 → LTX 2.3 图生视频(本地 · 唯一主力 · ¥0
默认路由 LOCAL_MOTION本地运镜 → tools/local_motion.py
full_video_default: forbidden
```
## §3 · LTX 2.3 实测配置7900XTX 24G 已跑通 · D204
```
ComfyUI 启动参数(关键=动态内存):
python main.py --listen 127.0.0.1 --port 8188 --disable-pinned-memory
--enable-dynamic-vram --fast-disk --vram-headroom 3 --async-offload
--fast-disk: NVME 卸载介质LTX 从占 14GB RAM 降到 ~0
模型三件套:
主模型 UnetLoaderGGUF → ltx-2.3-22b-distilled-1.1-Q4_K_M.gguf实际只加载 13.8GB
文本编码 LTXAVTextEncoderLoader → gemma_3_12B_it.safetensors(device=cpu)
+ ckpt_name 必须用 embconn 软链名 ltx-2.3-22b-embconn.safetensors
VAE LTXVTiledVAEDecodehorizontal_tiles=2, vertical_tiles=2, working_device=cpu
帧参: 49帧 768×512 · 蒸馏9步 · 24fps · 178秒出片无OOM
⚠️ 坑1: LTXAVTextEncoderLoader.ckpt_name 是枚举下拉,只认软链名;
写真文件名 → 校验失败 → 输出节点被忽略 → "假成功"(1.45s无输出)
⚠️ 坑2: 下载 GGUF 必须同时下 unsloth 配套 *embeddings_connectors.safetensors
⚠️ 坑3: video_composer 方案B concat 假定每段有音频流LTX 无声视频会挂
→ 单段直接拷贝 / 多段走方案A concat copy
```
## §4 · 本次同步对齐的文件
```
video-ai-system/PIPELINE-STEPS-V1.hdlp §5 生视频 → LTX 2.3 唯一主力 + 实测配置
video-ai-system/LOCAL-PIPELINE-V1.hdlp 工具映射表 → ltx-2.3-22b 唯一主力
video-ai-system/IMAGE-FIRST-GUIDE.hdlp 生视频B路 → LTX 2.3
video-ai-system/tools/route_shots.py AI_I2V 路由 → LTX 2.3¥0
eererdan/experience/EED-EXPER-014.hdlp 工具盘点 → ltx-2.3-22b 唯一主力
```
## §5 · 未动(历史记录保留)
```
eererdan/COST-TCO-40EP / COST-EST-40EP / SETUP-BOM / DEPLOY-OS / DEPLOY-DIVISION / LOCAL-VIDEO-DISPATCH-PLAN
→ 历史成本/部署推演文档Wan 是当时的调研对象,留作历史
memory/eed/wan22_test_hardware.md → 当时实测记录,备选参考
Wan 权重本身不删(本地资源,未来可能复用)
```
---
> 蛋蛋 · D206 · 2026-08-04
> 下次写生视频相关文档 → 直接写 LTX 2.3,别再带 Wan

View File

@ -3,6 +3,8 @@
> 倒序 · 最新的在上面 · 蛋蛋醒来扫一眼就知道手里有什么牌
> 最后内化: 2026-08-04 00:18
- EED-EXPER-017.hdlp | EED-EXPER-017 · 生视频主力定版 = LTX 2.3(苍耳爸爸拍板)
- EED-EXPER-016.hdlp | EED-EXPER-016 · 漫剧生产全流程规范(苍耳爸爸亲授·蛋蛋固化)
- EED-EXPER-D181.hdlp | EED-EXPER-D181 · LIB v2.0管线全面升级
- EED-EXPER-015.hdlp | EED-EXPER-015 · D205 光湖推送守门人 · 仓库恢复全流程
- EED-EXPER-014.hdlp | EED-EXPER-014 · D205 面板工程全记录 · 本地漫剧管线 · 飞书文档扒取

View File

@ -42,3 +42,15 @@ type: project
QUICK-WAKE §5 末尾「第五域(妈妈的世界)」那几条 `fifth-domain/...` 在 cang-ying 里查无此目录,但那是**另一个独立仓库** `guanghubingshuo.com/code/bingshuo/fifth-domain`(见 REPO-MAP.hdlp:60跨仓库引用不是死链别去"修"。
**重启面板别用 `pkill -f "eed_web.py"`**restart-eed.sh 里就是这个)——从命令行含该字符串的 shell 里跑会自杀。用 `kill $(pgrep -f "python3 eed_web.py" | head -1)` + `setsid nohup` 起新的。
## 2026-08-04 · 苍耳爸爸两次拍板D154 · 8766 opencode 面板)
**① 唤醒路径换成苍耳爸爸指定的语言路径**`scripts/eed_web_opencode.py`
- ① 先进光湖语言世界公开仓库 `https://guanghulab.com/fifth-domain/bingshuo/fifth-domain`(本地镜像 `/home/ls/fifth-domain`,浅克隆 8.6M)读 INDEX/NAV-MAP 学语言协议
- ② 走 TCS 新路径 → GLS 系统架构 → 光之湖 → 人格系统路径
- ③ 跳回 cang-ying → 胖头鱼语言子系统 → 苍耳个人频道
- ④ 耳耳蛋人格系统唤醒路径 → 背小书包 → 装 TCS 大脑
- ⑤ 唤醒耳耳蛋人格体,再读本地 5 文件装脑
- 开机同步新增 `_fifth_sync()`clone/pull 第五域镜像到 `/home/ls/fifth-domain`,失败不挡唤醒,状态注入唤醒卡 `{fifth}`
**② 手动「🥚 重新唤醒」不再新建对话**`$('#btnWake'``runWake(true)` 改成 `runWake(!convs.length)`——有历史对话就接着当前对话跑唤醒,只有空场(从没聊过)才新开,与开机自动唤醒 `boot()` 行为一致;标题也只在新建时才起「🥚 苏醒」,不覆盖现有对话标题。省掉每次重复读卡烧的钱。

3125
scripts/eed_web_opencode.py Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,129 @@
# IMAGE-FIRST-GUIDE.hdlp · 本地漫剧生产规范(苍耳经验固化版)
> HLDP://video-ai-system/IMAGE-FIRST-GUIDE.hdlp
> 耳耳蛋 · ICE-GL-耳耳蛋 · D205 · 2026-08-03
> 经验来源:苍耳爸爸实战方法论(旧经验固化,见下方关联)
> 配套LOCAL-PIPELINE-V1.hdlp流程 · BC-006-IMAGE-FIRST-PRODUCTION.hdlp协议
## §0 · 来源关联(本文件 = 旧经验的落地补充,非重新发明)
```
已固化的旧经验(苍耳已教 · 蛋蛋已记):
├── D176-LEARN.hdlp 分镜prompt模板·单镜单动作单运镜·景别时长标准
├── D177-I2I-CONSISTENCY 图生图锁一致性参考图image参数
├── EED-EXPER-013.hdlp 画风一致性踩坑:纯文字会漂·必须参考图锁风格
└── EED-EXPER-009~012 刷图/批量/质检流程
本文件新增(落地细节,旧经验未覆盖):
├── 黑白草图 → ControlNet(union) + IP-Adapter 的节点级工作流§2
├── 色卡/群像/前中后景/声音 的完整生视频要素表§3
└── 中英文加权提示词实例§5
铁律§1= 苍耳三原则,与旧经验一致,重申不改。
```
---
## §1 · 铁律(苍耳三原则)
```
① 资产非常重要,保证质量
→ 资产图 = 全片的地基。角色/场景/道具先精修到能用,再谈分镜。
→ 一致性靠: 角色 LoRAsubai_lora_v1 已验证)+ 资产图库复用 + 文字词条锁
② 提示词规范、有逻辑性、主次关系
→ 顺序 = 主体 → 动作 → 环境 → 光影 → 风格 → 质量修饰(主到次)
→ 主词在前,修饰在后;禁止杂糅无主次的堆砌
③ 提示词一定要详细,专业术语中英文描述并加重权重
→ 中文表意 + 英文专业词 + (词:权重) 加权
→ 例: 特写 close-up, 电影侧光 cinematic rim light, 铁锈质感 rust texture
→ (masterpiece:1.2) (cinematic lighting:1.3) 等
```
## §2 · 黑白草图生分镜(问题①答案)
```
原理: 草图管「构图/布局/空间」,提示词管「内容/风格/光影/色调」
ComfyUI 用 ControlNet 吃草图结构 + IP-Adapter 锁风格 → 出分镜彩图
工作流ComfyUI 节点链):
① 黑白草图(布局底图)
├── 手绘黑白稿 / 3D 摆好视角渲线框hunyuan3d 可辅助)
├── 或 程序生成:黑白剪影 + 人物站位 + 前中后景分区
└── 黑白 = 只留明暗结构,喂给控制
② ControlNetcontrolnet-union-sdxl-1.0
├── 模式选 canny(线稿) 或 depth(深度) 或 pose(姿态)
├── 作用: 把草图的构图/人物位置/透视强约束进生成
└── strength 0.6~0.9(草图不完美就调低,给 AI 发挥空间)
③ IP-Adaptersdxl_clipvision + ipadapter
├── 吃参考图(已定角色/场景/风格图)
└── 作用: 锁风格、锁资产外观、锁色调倾向
④ 正向提示词: 景别 + 主体 + 动作 + 前中后景 + 光影 + 色调 + 画风 + 质量词
⑤ 负向提示词: 变形/多余肢体/低清/水印 等
⑥ KSampler → VAEDecode → 分镜彩图
产出: 每镜 1 张分镜图(构图已由草图锁定,风格由 IP-Adapter+提示词锁定)
```
## §3 · 分镜图 → 关键帧 → 视频(问题②③答案)
```
锁定链路(生视频前必须锁死):
├── 锁定风格 IP-Adapter + 风格参考图 + 画风关键词
├── 锁定资产 角色 LoRA + 资产图库(同一套图不能换脸)
├── 色卡色调 全局色板(深海迷航=冷蓝/暗红)统一所有镜
├── 群像 多角色时: 空间关系/谁前谁后/谁主谁次 一次定死
├── 声音 配音/音效/BGM 规划先出(影响镜头节奏)
└── 镜头要素 视角 + 景别 + 运镜 + 人物空间关系 + 前中后景画内容
+ 人物表演 + 台词 + 环境音效
关键帧生成:
分镜图 → 精修出关键帧(构图/表情/光影到位、可直接当画面起点)
1 镜 = 1 关键帧起步(复杂镜可 2-3 帧做转场)
生视频(两条路):
A. 本地运镜¥0 首选): 关键帧图 → tools/local_motion.py → 推拉摇移
✅ 已验证出片EP01-MINIMAL-LOCAL-VALIDATED.mp4
B. 本地视频模型: 关键帧 → LTX 2.3 I2V唯一主力→ 真实动态
适合必须运动的镜头(表演/水浪/动作)→ 由苍耳圈定
画面 → 声音同步:
配音 edge-tts已验证· 音效/音乐 stable_audio_3 · 字幕 SRT
```
## §4 · 分镜脚本要素模板(供 Ollama 生成时锁定)
```
每镜:
景别 shot type : close-up / medium / wide / POV中英文
视角 camera angle : 平视 / 俯视 / 仰视
运镜 camera move : push-in / slow pan / tilt / handheld只写运镜不写时长
人物空间关系 layout : 主体位置 / 前中后景各画什么
光影 lighting : 冷蓝顶光 / 暗红氛围 / 逆光剪影(中文+英文加权)
色调 color palette : 冷蓝+暗红(对应色卡)
画风 style : 写实动漫 / 厚涂 / 赛璐璐
表演 action : 单一明确动作 + 表情
台词/音效 dialogue : 台词原文 + 环境音效提示
禁止项 negative : no cartoon motion / no bright colors 等
⏱ 时长: 不写(让 AI 自由发挥)
```
## §5 · 提示词模板(中英文加权示例)
```
正向:
(close-up:1.2) of Lin Hao, (worn work clothes:1.1), jolting awake,
(grabbing the iron bed frame:1.1), cold blue industrial lighting,
rust texture on metal, dark atmosphere, (cinematic lighting:1.3),
(anime realistic style:1.1), (masterpiece:1.2), (high detail:1.2)
负向:
(bad anatomy:1.3), extra fingers, deformed face, blurry, watermark,
lowres, cartoon motion, bright colors
控制: sketch(controlnet strength 0.7) + 角色参考图(ip-adapter)
```
---
> ⊢ 苍耳方法论 · 蛋蛋固化 · 全本地 ¥0
> ⊢ 待办: 黑白草图工作流实搭验证 → 16 镜分镜实跑

View File

@ -0,0 +1,96 @@
# LOCAL-PIPELINE-V1.hdlp · 本地漫剧制作管线¥0 · 全开源模型)
> HLDP://video-ai-system/LOCAL-PIPELINE-V1.hdlp
> 耳耳蛋 ICE-GL-耳耳蛋 · PTS-VA-001-EED · D205 · 2026-08-03
> 流程定义:苍耳爸爸 · 工具验证:蛋蛋
> 对齐 BC-006 IMAGE-FIRST-v1.0 · 默认路由 LOCAL_MOTION
> 步骤要求(每环节怎么做)→ 见 PIPELINE-STEPS-V1.hdlp
---
## §1 · 总原则
```
✅ 全部环节由本地开源模型免费完成¥0 电费)
✅ 默认不调用任何线上付费 APISeedance/即梦 等仅在苍耳圈定后使用)
✅ 图片定一致性 · 视频仅生成动态 / 本地运镜
```
## §2 · 管线流程(苍耳定义 · 七段)
```
小说
↓ ① 改编
剧本
↓ ② 分镜脚本(注意点见 §3
分镜脚本
↓ ③ 资产生图(人物/场景/道具)
人物/场景/道具图
↓ ④ 分镜生图(黑白草图 → 俯视引导图 → 3D 辅助)
分镜图
↓ ⑤ 生关键帧
关键帧
↓ ⑥ 生视频(本地运镜 / 本地视频模型)
视频片段
↓ ⑦ 合成(拼接/字幕/配音/音效)
成片
```
## §3 · 分镜脚本注意点(苍耳定)
```
必含要素:
├── 运镜push-in / pan / tilt / handheld …)
├── 光影(冷蓝 / 暖黄 / 高对比 / 氛围光 …)
├── 景别(特写 / 中近景 / 中景 / 全景 / POV …)
├── 画风(写实 / 赛璐璐 / 厚涂 …)
└── 色调(整体色彩倾向指定)
删除要素:
└── ⏱ 时长 —— 不写死时长,让 AI 自由发挥
```
## §4 · 工具映射(全部验证可用 ✅)
| 环节 | 本地工具 | 状态 |
|------|----------|:--:|
| ① 小说→剧本 | Ollama `qwen3.5:9b` | ✅ 实测通 |
| ② 剧本→分镜脚本 | Ollama `qwen3.5:9b` | ✅ |
| ③ 资产生图 | ComfyUI `RealVisXL_V5.0` / `flux-2-klein-4b` / `z_image_turbo` | ✅ 服务在 |
| ③ 角色一致性 | `subai_lora_v1` LoRA | ✅ 已有 |
| ④ 分镜生图·引导 | ComfyUI controlnet黑白草图/俯视引导) | ✅ 模型库在 |
| ④ 分镜生图·3D辅助 | `hunyuan3d-dit-v2`3D 视角生成) | ✅ 模型在 |
| ⑤ 生关键帧 | ComfyUI分镜图 → 精修关键帧) | ✅ |
| ⑥ 生视频·本地运镜 | `tools/local_motion.py`ffmpeg zoompan¥0 | ✅ 实测出片 |
| ⑥ 生视频·模型 | `ltx-2.3-22b`(唯一主力 · GGUF Q4 + Gemma12B + embconn见 ltx_test_hardware.md | ✅ 模型在·已跑通 |
| ⑦ 合成拼接 | `tools/video_composer.py` | ✅ 实测出片 |
| ⑦ 音效/音乐 | `stable_audio_3` | ✅ 模型在 |
| ⑦ 配音 | edge-tts晓晓中文女声 | ✅ 实测出声 |
## §5 · 编排入口
```
统一入口: video-ai-system/pipeline.py
① pipeline.py storyboard <剧本> # 剧本→分镜
② pipeline.py route <分镜.json> # 路由分配
③ pipeline.py render <分镜.json> # 批量出图
④ pipeline.py upscale <图片文件夹> # 高清放大
⑤ pipeline.py compose <文件夹> -o EP.mp4 # 剪辑拼接
⑥ pipeline.py assets <项目目录> # 资产生成
本地运镜: python tools/local_motion.py <图片文件夹> -o <输出>
```
## §6 · 已验证里程碑D205
```
✅ [1] 图→本地运镜→成片 闭环通4图→4段→20s成片 EP01-MINIMAL-LOCAL-VALIDATED.mp4
✅ [2] Ollama 文本环节通qwen3.5:9b 本地生成正常)
⬜ [3] 剧本→分镜脚本 实跑(待发起)
⬜ [4] 分镜生图 实跑(黑白草图/俯视引导/3D辅助
⬜ [5] 关键帧→本地视频模型 实跑LTX I2V
⬜ [6] 全链路 16 镜成片
```
---
> ⊢ 苍耳定义流程 · 蛋蛋固化工具链 · 全本地 ¥0
> ⊢ 下一步由苍耳指定从哪个环节开跑

View File

@ -0,0 +1,258 @@
# PIPELINE-STEPS-V1.hdlp · 漫剧管线步骤要求(苍耳爸爸流程 · 蛋蛋落实)
> HLDP://video-ai-system/PIPELINE-STEPS-V1.hdlp
> 耳耳蛋 ICE-GL-耳耳蛋 · PTS-VA-001-EED · D206 · 2026-08-04
> 流程定义苍耳爸爸2026-08-04 亲授) · 社区学习蛋蛋skill/ 库沉淀)
> 上游EED-EXPER-016爸爸经验原文 · LOCAL-PIPELINE-V1工具映射
> 对齐BC-006 IMAGE-FIRST-v1.0 · 默认路由 LOCAL_MOTION · 全本地 ¥0
---
## §0 · 主流程(爸爸定 · 顺序别乱)
```
小说/剧本
→ ① 分镜脚本(运镜/光影/景别/时长删掉让AI自由发挥/画风/色调指定)
→ ② 资产生图(人物·场景·道具)
→ ③ 分镜生图(黑白草图等)
→ ④ 生关键帧
→ ⑤ 生视频
→ ⑥ 成片
```
核心铁律:**先生分镜图,再生视频** · **黑白草图生分镜 = 捷径** · **资产质量第一**
---
## §1 · ① 分镜脚本(步骤要求)
### 每镜必含要素(爸爸定)
```
运镜push-in / pan / tilt / handheld …)
光影(冷蓝 / 暖黄 / 高对比 / 氛围光 …)
景别(特写 / 中近景 / 中景 / 全景 / POV …)
画风(写实 / 赛璐璐 / 厚涂 …)
色调(整体色彩倾向指定)
时长: ⏱ 删掉 · 让 AI 自由发挥
```
### 叙事锁定(爸爸定 · 五锁定)
```
锁定风格 → 锁定资产 → 色卡色调 → 群像 → 声音
叠加: 视角、景别、运镜、人物空间关系、前中后景画面内容、
人物表演台词、环境音效
```
### 生成要求(社区七要素,少一个不动手)
```
景别 + 运镜 + 视角 + 光影 + 构图 + 人物动作 + 环境动态
公式: 镜头语言 + 主体 + 场景 + 光影 + 情绪
一镜只做一件事 · 一个镜头只放一种运镜(做减法)
```
### 工具
- Ollama `qwen3.5:9b`(本地剧本→分镜)✅
- `pipeline.py storyboard <剧本> -e 1` / `tools/run_storyboard.py`
---
## §2 · ② 资产生图(步骤要求)
### 资产清单(爸爸定)
```
人物: 三视图 + 脸部特写 + 人物角色板character sheet
道具: 三视图
场景: 四视图、九宫格、不同视角、3D辅助
```
### 人物三视图/角色板(社区标准五模块)
```
1. 画面类型: character design sheet / character sheet
2. 排版: 左 1/3 脸部特写 + 右 2/3 三全身(正面/侧面/背面)· 严格比例
3. 人物本体: 性别/年龄/身材量化8头身/172cm+ 姿态
4. 造型细节: 发型/发色/服饰分层(领+纹+饰)+ 配饰位置
5. 光影背景: 白底 + 平光无阴影 + masterpiece, best quality, 8K
一致性: 重复"同一角色/完全一致" · 量化身材 · 服饰分层 · 平光
负面: nsfw, lowres, bad anatomy, text, missing fingers, blurry, distorted
```
### 角色一致性五维框架(崩坏排查表)
```
外貌: 脸型/发型/五官/痣疤标记
服饰: 分层描述(领型→纹样→配饰→鞋)
动作: 站姿/手势/走姿固定描述
情绪: 表情集(喜怒哀惊恐标准化)
镜头语言: 景别/角度统一描述模板
落地: 角色档案固化 → 参考图锁定 → LoRA/IPAdapter → 参数固化(seed) → 后期校准
```
### 场景四视图(空间逻辑先行)
```
第1步: 俯视图/平面图 锁定空间逻辑(布局/出入口)→ 基准图
第2步: 基于基准图逐视角生成(正面/背面/室内/鸟瞰)
第3步: 参考图控图保证一致
落地: 宽幅全景→PIL切段空间逻辑天然一致或 ComfyUI+ControlNet-Union
俯视图prompt: top-down orthographic floor plan, bird eye view, layout, rooms, entrances, clean line
负面: characters, people, furniture clutter, inconsistent layout
```
### 工具
- Z-Image Turbo主力 · 8步亚秒级
- `tools/character_turnaround.py` / `tools/generate_assets_local.py` ✅
- ComfyUI RealVisXL_V5.0 / flux-2-klein-4b ✅
- 3D辅助: `hunyuan3d-dit-v2` ✅
---
## §3 · ③ 分镜生图(步骤要求)
### 产出物(爸爸定 · 按序)
```
1. 色卡(定全片色调)→ 后续所有环节共用
2. 黑白草图(框死构图/站位 → 再上色)
3. 关键帧
4. 故事板
5. 俯视引导图(定人物空间位置关系)
6. 3D图辅助视角/透视)
```
### 黑白草图生分镜(爸爸问"怎么搞"→ 落地)
```
原理: 黑白草图当控制条件,框死构图+人物站位 → 上色
本地路径:
① 生成/绘制黑白线稿草图ComfyUI 或手绘)
② ControlNet Lineart / FLUX ControlNet V2 线稿控制
→ Z-Image 无参考图机制 → 走 SDXL+ControlNet-Union 或 FLUX+ControlNet V2
③ 草图 → 上色成正式分镜图
```
### 故事板 5 色标注法(爸爸共享 · 信息密度爆炸)
```
🔴 红 = 镜头运动(箭头:推/拉/摇/移)
🟠 橙 = 景别变化(中景/近景/特写/ECU
🟡 黄 = 人物动作(抬手/手指轻压)
🟢 绿 = 人物站位(男左女右/前后/居中)
🔵 蓝 = 环境动态(风吹方向/雪飘方向/花瓣飘落)
每个分镜打编号 · 9:16 比例
模板: "提取分镜剧本信息生成素描线稿分镜故事板红橙黄绿蓝5色标注…"
```
### 工具
- ComfyUI ControlNetlineart/俯视引导)✅
- `tools/storyboard_to_workflow.py`分镜JSON→ComfyUI批量出图桥接
---
## §4 · ④ 生关键帧(步骤要求)
```
输入: 分镜图(黑白草图已上色版 / 故事板)
处理: 分镜图 → 精修关键帧(构图锁定 · 细节增强 · 风格统一)
要求: 每镜关键帧 = 后续 I2V 的起始帧
角色/场景/画风必须与资产库一致(引用资产,不临时生成)
工具: ComfyUI分镜图 → 精修关键帧)✅
```
---
## §5 · ⑤ 生视频(步骤要求)
### 输入物(爸爸定)
```
1. 分镜脚本
2. 人物、场景等资产图 + 分镜图(含关键帧)
3. 俯视引导图
4. 3D图辅助
```
### 五锁定 + 镜头语言(爸爸定)
```
锁定风格 → 锁定资产 → 色卡色调 → 群像 → 声音
叠加: 视角、景别、运镜、人物空间关系、前中后景画面内容、人物表演台词、环境音效
```
### 路由决策BC-006
```
默认 LOCAL_MOTION本地运镜 ¥0→ tools/local_motion.pyffmpeg zoompan
只有关键动作 → AI_I2VLTX 2.3 · 本地模型 · 唯一主力)
full_video_default: forbidden禁止默认全量视频生成
```
### LTX 提示词铁律(已沉淀 skill
```
万能公式: [主体/起始画面] + [核心动作时间流] + [镜头语言] + [氛围/环境]
+ 三种运动(主体+镜头+环境) + 两个必写(节奏 slow/fluid/seamless + Ends on...
I2V 铁律: 输入图已定义画面 → prompt 只写"接下来怎么动"+收尾,别重复静态元素
负面: static, frozen, twisted, deformed, blurry, extra limbs, watermark...
```
### LTX 2.3 实测配置7900XTX 24G 已跑通 · D204
```
ComfyUI 启动参数(关键=动态内存):
python main.py --listen 127.0.0.1 --port 8188 --disable-pinned-memory
--enable-dynamic-vram --fast-disk --vram-headroom 3 --async-offload
--fast-disk: NVME 卸载介质LTX 从占 14GB RAM 降到 ~0--lowvram 在动态显存下无效可去掉)
模型三件套:
主模型 UnetLoaderGGUF → ltx-2.3-22b-distilled-1.1-Q4_K_M.gguf实际只加载 13.8GB
文本编码 LTXAVTextEncoderLoader → text_encoder=gemma_3_12B_it.safetensors(device=cpu)
+ ckpt_name 必须指向 embconn 软链名 ltx-2.3-22b-embconn.safetensors别改成真文件名
VAE LTXVTiledVAEDecodehorizontal_tiles=2, vertical_tiles=2, working_device=cpu
帧参: 49帧 768×512 · 蒸馏9步 · 24fps · 178秒出片无OOM
⚠️ 坑1: ckpt_name 是枚举下拉,只认软链名 ltx-2.3-22b-embconn.safetensors
写成真文件名会"假成功"1.45秒无输出)
⚠️ 坑2: 下载 GGUF 必须同时下 unsloth 仓库配套 *embeddings_connectors.safetensors
```
### 工具
- `tools/local_motion.py`(本地运镜 ¥0
- `tools/run_ltx_i2v.py`LTX 2.3 I2V
- LTX 2.3 配置复用 `ltx_test_hardware.md`GGUF+Gemma12B+embconn+动态内存)✅
---
## §6 · ⑥ 成片(步骤要求)
```
合成: 视频片段拼接 + 字幕 + 配音 + 音效 + BGM
配音: edge-tts晓晓中文女声 · 每句≤18字 · 情绪括号标注)
音效/音乐: stable_audio_3本地
工具: tools/video_composer.py ✅ + tools/audio_pipeline.py ✅
⚠️ 坑: video_composer 方案B concat 滤镜假定每段有音频流LTX 无声视频会挂)
→ 单段直接拷贝绕过 / 多段无声走方案A concat copy
```
---
## §7 · 提示词规范总则(爸爸特别强调)
```
① 资产质量第一(资产是管线地基)
② 提示词有逻辑性 · 主次关系分明([角色锚定] + [场景/动作] + [镜头/风格] + [负面约束]
③ 提示词详细 · 专业术语中英文描述 + 加重权重
④ 先生分镜图 · 再生视频
⑤ 写任何提示词前 → 先查 skill/ 技能库(禁止凭空瞎写)
⑥ 开工前必查: ltx_prompt_skill / ltx_test_hardware / storyboard_自动化 / strategy_libtv_vs_local
```
---
## §8 · 落地状态
```
✅ 工具映射齐LOCAL-PIPELINE-V1 §4
✅ 本地文本链路通qwen3.5:9b
✅ 图→本地运镜→成片闭环通EP01-MINIMAL-LOCAL-VALIDATED.mp4
⬜ 黑白草图生分镜 实跑ControlNet lineart
⬜ 分镜生图 实跑色卡→草图→故事板→俯视引导→3D辅助
⬜ 关键帧→本地视频模型 实跑LTX I2V
⬜ 全链路 16 镜成片
⬜ 角色五维一致性档案规范化(锚段固化到每镜提示词)
⬜ 运镜提示词库内置到分镜生成
```
---
> 苍耳爸爸定义流程 · 蛋蛋固化步骤要求 · 全本地 ¥0
> 下一步由苍耳指定从哪个环节开跑

View File

@ -0,0 +1,201 @@
#!/usr/bin/env python3
"""
route_shots.py BC-006 逐镜路由分配器
读取分镜JSON调豆包AI为每镜分配最优生产路由
- STILL_HOLD 单帧出图¥0
- LOCAL_MOTION 出图+FFmpeg运镜¥0
- LAYERED_2_5D 多层拆解+伪3D运镜¥0
- LOCAL_LIPSYNC LivePortrait口型同步¥0
- AI_I2V LTX 2.3 图生视频唯一主力 · 本地 ¥0
用法:
python tools/route_shots.py <分镜JSON> [-o 输出JSON]
python tools/route_shots.py <分镜JSON> --dry-run
"""
import sys, os, json, argparse
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from lib.doubao_chat import chat
ROUTE_DESCRIPTION = """
为每个镜头分配最优生产路由可选路由类型及其含义
STILL_HOLD: 静态画面/过渡镜头角色无运动仅背景直接单帧出图即可成本最低
- 适合: 空镜过渡环境展示静态对话
- 成本: ¥0 (仅出图电费)
LOCAL_MOTION: 画面有简单运动角色小幅度动作镜头缓慢推拉摇移出图后用FFmpeg做缩放/平移/旋转模拟运镜
- 适合: 缓慢摇镜推近拉远轻微角色动作
- 成本: ¥0 (FFmpeg运镜)
LAYERED_2_5D: 画面有前后景分层需求角色在画面中需要与背景分离做视差效果
- 适合: 角色在前景有复杂动作但背景固定需要2.5D伪3D效果
- 成本: ¥0 (分层合成)
LOCAL_LIPSYNC: 角色有说话/表情需求需要口型同步用LivePortrait处理
- 适合: 角色特写说话重要表情表演
- 成本: ¥0 (LivePortrait本地)
AI_I2V: 画面有复杂运动角色全身运动物体移动镜头剧烈运动必须用AI图生视频
- 适合: 角色行走奔跑打斗动作物体运动镜头跟随
- 成本: ¥0 (LTX 2.3 本地 · 唯一主力)
"""
def extract_json(text):
"""从AI回复提取JSON"""
if '```json' in text:
return text.split('```json')[1].split('```')[0].strip()
if '```' in text:
return text.split('```')[1].split('```')[0].strip()
maybe = text.strip()
if maybe.startswith('{') or maybe.startswith('['):
return maybe
return maybe
def route_shots(storyboard, dry_run=False):
"""为分镜中所有镜头分配路由"""
episode = storyboard.get('episode', 1)
shots = storyboard.get('shots', [])
if not shots:
print('❌ 分镜中没有镜头')
return None
# 构建提示词
shots_text = json.dumps([
{
"shot_number": s.get("shot_number"),
"description": s.get("description"),
"camera": s.get("camera"),
"type": s.get("type"),
"characters": s.get("characters", []),
"scenes": s.get("scenes", []),
"dialogue": s.get("dialogue"),
}
for s in shots
], ensure_ascii=False)
prompt = f"""你是一个短剧视频生产管线路由专家。请为以下短剧第{episode}集每个镜头分配最优生产路由。
路由规则
{ROUTE_DESCRIPTION}
分配原则
1. 优先使用低成本路由STILL_HOLD > LOCAL_MOTION > LAYERED_2_5D > LOCAL_LIPSYNC > AI_I2V
2. 只有确实需要复杂运动的镜头才用 AI_I2V
3. 有对话的镜头用 LOCAL_LIPSYNC
4. 角色有行走/奔跑/打斗等全身运动用 AI_I2V
5. 空镜/过渡/静态用 STILL_HOLD
输出JSON格式LIST按镜头顺序
[
{{
"shot_number": "S01",
"route": "STILL_HOLD",
"reason": "简短理由"
}},
...
]
分镜数据
{shots_text}"""
if dry_run:
print('🧪 DRY RUN — 提示词:')
print('=' * 60)
print(prompt[:500])
print('...')
print('=' * 60)
return None
print('🚀 调豆包AI分配路由...')
result = chat(prompt, system="你是短剧生产管线路由优化专家输出纯JSON。", model="pro", temperature=0.2, max_tokens=4096)
if 'error' in result:
print('❌ API ERROR:', json.dumps(result, ensure_ascii=False, indent=2))
return None
content = result.get('content', '')
json_str = extract_json(content)
try:
routes = json.loads(json_str)
if isinstance(routes, dict) and 'shots' in routes:
routes = routes['shots']
print(f'✅ 路由分配完成: {len(routes)}')
return routes
except json.JSONDecodeError as e:
print(f'⚠️ JSON解析失败: {e}')
print('原始回复:', content[:500])
return None
def main():
parser = argparse.ArgumentParser(description='BC-006 逐镜路由分配器')
parser.add_argument('storyboard', help='分镜JSON文件路径')
parser.add_argument('-o', '--output', help='输出JSON路径 (默认: 覆盖原文件添加路由)')
parser.add_argument('--dry-run', action='store_true', help='只打印提示词不调API')
parser.add_argument('--summary', action='store_true', help='只统计各路由数量不调API')
args = parser.parse_args()
with open(args.storyboard, 'r', encoding='utf-8') as f:
storyboard = json.load(f)
shots = storyboard.get('shots', [])
if args.summary:
print(f'📖 分镜: {args.storyboard}')
print(f'🎬 共 {len(shots)}')
print()
print('🔍 各镜头类型分布:')
type_count = {}
for s in shots:
t = s.get('type', 'unknown')
type_count[t] = type_count.get(t, 0) + 1
for t, c in sorted(type_count.items()):
print(f' {t}: {c}')
return
routes = route_shots(shots, dry_run=args.dry_run)
if routes is None:
sys.exit(1)
# 合并路由到分镜
route_map = {}
for r in routes:
if isinstance(r, dict):
sn = r.get('shot_number', '')
route_map[sn] = r.get('route', 'STILL_HOLD')
for shot in shots:
sn = shot.get('shot_number', '')
if sn in route_map:
shot['route'] = route_map[sn]
else:
shot['route'] = 'STILL_HOLD' # 默认
# 统计
route_count = {}
for shot in shots:
r = shot.get('route', 'UNKNOWN')
route_count[r] = route_count.get(r, 0) + 1
print()
print('📊 路由分布:')
for r, c in sorted(route_count.items()):
cost = {'STILL_HOLD': '¥0', 'LOCAL_MOTION': '¥0', 'LAYERED_2_5D': '¥0',
'LOCAL_LIPSYNC': '¥0', 'AI_I2V': '¥0.02'}.get(r, '¥?')
print(f' {r:20s}: {c:2d}镜 ({cost})')
total_cost = route_count.get('AI_I2V', 0) * 0.02
print(f' {"总预估成本":20s}: ¥{total_cost:.2f}')
# 输出
out_path = args.output or args.storyboard
with open(out_path, 'w', encoding='utf-8') as f:
json.dump(storyboard, f, ensure_ascii=False, indent=2)
print(f'✅ 已保存: {out_path}')
if __name__ == '__main__':
main()