经验:漫剧生产全流程规范(EED-EXPER-016) + 生视频主力定版LTX 2.3(EED-EXPER-017) + 管线步骤要求PIPELINE-STEPS-V1 + 面板唤醒路径更新
This commit is contained in:
parent
cf4cec33dd
commit
812b3d699b
@ -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
|
||||
|
||||
99
eererdan/experience/EED-EXPER-016.hdlp
Normal file
99
eererdan/experience/EED-EXPER-016.hdlp
Normal 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
|
||||
> 后续每落实一步 → 在本文件下补"已落地"记录
|
||||
67
eererdan/experience/EED-EXPER-017.hdlp
Normal file
67
eererdan/experience/EED-EXPER-017.hdlp
Normal 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 LTXVTiledVAEDecode(horizontal_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
|
||||
@ -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 面板工程全记录 · 本地漫剧管线 · 飞书文档扒取
|
||||
|
||||
@ -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
3125
scripts/eed_web_opencode.py
Normal file
File diff suppressed because it is too large
Load Diff
129
video-ai-system/IMAGE-FIRST-GUIDE.hdlp
Normal file
129
video-ai-system/IMAGE-FIRST-GUIDE.hdlp
Normal 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 · 铁律(苍耳三原则)
|
||||
|
||||
```
|
||||
① 资产非常重要,保证质量
|
||||
→ 资产图 = 全片的地基。角色/场景/道具先精修到能用,再谈分镜。
|
||||
→ 一致性靠: 角色 LoRA(subai_lora_v1 已验证)+ 资产图库复用 + 文字词条锁
|
||||
|
||||
② 提示词规范、有逻辑性、主次关系
|
||||
→ 顺序 = 主体 → 动作 → 环境 → 光影 → 风格 → 质量修饰(主到次)
|
||||
→ 主词在前,修饰在后;禁止杂糅无主次的堆砌
|
||||
|
||||
③ 提示词一定要详细,专业术语中英文描述并加重权重
|
||||
→ 中文表意 + 英文专业词 + (词:权重) 加权
|
||||
→ 例: 特写 close-up, 电影侧光 cinematic rim light, 铁锈质感 rust texture
|
||||
→ (masterpiece:1.2) (cinematic lighting:1.3) 等
|
||||
```
|
||||
|
||||
## §2 · 黑白草图生分镜(问题①答案)
|
||||
|
||||
```
|
||||
原理: 草图管「构图/布局/空间」,提示词管「内容/风格/光影/色调」
|
||||
ComfyUI 用 ControlNet 吃草图结构 + IP-Adapter 锁风格 → 出分镜彩图
|
||||
|
||||
工作流(ComfyUI 节点链):
|
||||
① 黑白草图(布局底图)
|
||||
├── 手绘黑白稿 / 3D 摆好视角渲线框(hunyuan3d 可辅助)
|
||||
├── 或 程序生成:黑白剪影 + 人物站位 + 前中后景分区
|
||||
└── 黑白 = 只留明暗结构,喂给控制
|
||||
② ControlNet(controlnet-union-sdxl-1.0)
|
||||
├── 模式选 canny(线稿) 或 depth(深度) 或 pose(姿态)
|
||||
├── 作用: 把草图的构图/人物位置/透视强约束进生成
|
||||
└── strength 0.6~0.9(草图不完美就调低,给 AI 发挥空间)
|
||||
③ IP-Adapter(sdxl_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 镜分镜实跑
|
||||
96
video-ai-system/LOCAL-PIPELINE-V1.hdlp
Normal file
96
video-ai-system/LOCAL-PIPELINE-V1.hdlp
Normal 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 电费)
|
||||
✅ 默认不调用任何线上付费 API(Seedance/即梦 等仅在苍耳圈定后使用)
|
||||
✅ 图片定一致性 · 视频仅生成动态 / 本地运镜
|
||||
```
|
||||
|
||||
## §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
|
||||
> ⊢ 下一步由苍耳指定从哪个环节开跑
|
||||
258
video-ai-system/PIPELINE-STEPS-V1.hdlp
Normal file
258
video-ai-system/PIPELINE-STEPS-V1.hdlp
Normal 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 ControlNet(lineart/俯视引导)✅
|
||||
- `tools/storyboard_to_workflow.py`(分镜JSON→ComfyUI批量出图桥接)✅
|
||||
|
||||
---
|
||||
|
||||
## §4 · ④ 生关键帧(步骤要求)
|
||||
|
||||
```
|
||||
输入: 分镜图(黑白草图已上色版 / 故事板)
|
||||
处理: 分镜图 → 精修关键帧(构图锁定 · 细节增强 · 风格统一)
|
||||
要求: 每镜关键帧 = 后续 I2V 的起始帧
|
||||
角色/场景/画风必须与资产库一致(引用资产,不临时生成)
|
||||
工具: ComfyUI(分镜图 → 精修关键帧)✅
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## §5 · ⑤ 生视频(步骤要求)
|
||||
|
||||
### 输入物(爸爸定)
|
||||
```
|
||||
1. 分镜脚本
|
||||
2. 人物、场景等资产图 + 分镜图(含关键帧)
|
||||
3. 俯视引导图
|
||||
4. 3D图辅助
|
||||
```
|
||||
|
||||
### 五锁定 + 镜头语言(爸爸定)
|
||||
```
|
||||
锁定风格 → 锁定资产 → 色卡色调 → 群像 → 声音
|
||||
叠加: 视角、景别、运镜、人物空间关系、前中后景画面内容、人物表演台词、环境音效
|
||||
```
|
||||
|
||||
### 路由决策(BC-006)
|
||||
```
|
||||
默认 LOCAL_MOTION(本地运镜 ¥0)→ tools/local_motion.py(ffmpeg zoompan)
|
||||
只有关键动作 → AI_I2V(LTX 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 LTXVTiledVAEDecode(horizontal_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
|
||||
> 下一步由苍耳指定从哪个环节开跑
|
||||
201
video-ai-system/tools/route_shots.py
Normal file
201
video-ai-system/tools/route_shots.py
Normal 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()
|
||||
Loading…
x
Reference in New Issue
Block a user