# 视频工厂 · 总体架构 v2.0(唯一权威版) > 创建:2026-10-01 | 状态:**讨论中,待确认后动手** > 本文档**替代**此前的 `VIDEO_FACTORY_FRAMEWORK.md` / `VIDEO_FACTORY_ARCHITECTURE.md` / `DCS_VIDEO_FACTORY_PLAN.md`(已归档,见文末) > 原则:**流程是主角,能力是零件,资产是原料** —— 三者是引用关系,不是平级菜单 --- ## 〇、一句话 > 我进「流程」做一件事(口播 / 短剧 / 导演创作…)→ 流程由若干「节点」串成 → 每个节点是一个「能力」(可换、可配、可调模型)→ 执行后**每一步都能看结果、能改、能重做** → 产物出片。 > 「资产底座」(角色 / 场景 / 道具 / 产品 / 音色…)是所有流程共用的原料库。 --- ## 一、三层模型(核心,先看这张) ``` ┌─────────────────────────────────────────────────────────────┐ │ 【流程】Process / Template —— 我要做的一件事 │ │ 导演创作 · 口播 · 卡点视频 · 角色叙事 · 数字人口播 │ │ 口播+混剪 · 短剧创作 · 人物置换 · …(可扩展、可自建) │ │ │ │ 流程 = 节点串(每个节点 = 一个能力 + 该节点的配置) │ │ 可预制(原来的 6 条)· 可自建(拖节点拼)· 节点可替换 │ └──────────────────────────┬──────────────────────────────────┘ │ 节点引用能力 ▼ ┌─────────────────────────────────────────────────────────────┐ │ 【能力】Capability —— 解决"一个环节"的最小可执行单元 │ │ 语音合成(文字→音频)· 文生图(文字→图片)· 图生视频 │ │ 音色提炼(音频→音色)· 去AI化 · 拼接/变速/转场 · 字幕 │ │ 分镜规划 · 提示词生成 · 审核门 · 导演编排(元能力)… │ │ │ │ 每个能力都有:默认设置 + 可调整参数 + **可选不同大模型** │ │ 同一个环节可以有多个能力可选(要声音:调库音色 / AI提炼音色 /│ │ 文字直转),节点上可**替换** │ │ │ │ 能力分两类用途: │ │ ① 产出型(生成资产):角色生成 / 背景生成 / 音色提炼 … │ │ ② 处理型(流程节点):TTS / 生图 / 生视频 / 合成 … │ └──────────────────────────┬──────────────────────────────────┘ │ 产物落入 / 被引用 ▼ ┌─────────────────────────────────────────────────────────────┐ │ 【资产底座】Assets —— 共用原料库(所有流程共享) │ │ 角色 · 场景/背景 · 道具 · 产品 · 服装 · 音色 · BGM · 音效 │ │ 特效预设 · 风格 · … │ │ (字段与分类:**待你给出**,见第九节) │ └─────────────────────────────────────────────────────────────┘ ``` **关键结论**: - **导演创作 = 一条流程**(不是独立板块) - **人物置换 = 一条流程**(选人→换人),不属于资产 - **工作流 = 流程本身**(画布是流程的编辑/查看形式) - **资产 ≠ 能力**:资产是"原料"(角色图、音色文件),能力是"做事的手"(生成、合成、转换) --- ## 二、前端信息架构(一二级菜单) ``` 🎬 视频工厂 ← 一级:大模块 │ ├─ 📦 资源库 ← 二级:基础底座(原料) │ ├─ 🧑 角色库 角色筛选/生成/引用 │ ├─ 🏞️ 场景库 AI 生成场景 │ ├─ 🏙️ 真实场地库 实拍参考(多角度图 + 视频) │ ├─ 🧰 道具库 │ ├─ 📦 产品库 含 must_keep 必保特征 │ ├─ 👗 服装库 │ ├─ 🔊 音色库 音色样本 + 音色 ID(可从音频提炼) │ ├─ 🎵 BGM 库 │ ├─ 💥 音效库 │ └─ ✨ 特效预设库 子弹时间/环绕/慢动作(参数模板) │ ├─ 🎞️ 流程 ← 二级:做事入口(模板) │ ├─ 🎬 导演创作 ★ 剧本→分镜→逐镜头配置→生成→成片 │ ├─ 🎭 短剧创作 故事→脚本→角色→分镜→场景→配音→字幕→成片(原有,12 节点) │ ├─ 🎙️ 基础口播 脚本→TTS→素材→BGM→输出(原有) │ ├─ 🥁 卡点视频 BGM→卡点风格→审核→输出(原有) │ ├─ 📖 角色叙事 剧本→改编→角色→策略→生成→旁白→审核→输出(原有) │ ├─ 👤 数字人口播 文案→人声→数字人角色→数字人视频(原有) │ ├─ 🎞️ 口播+混剪 口播脚本→人声→混合风格→混合视频(原有) │ ├─ 🔄 人物置换 选源人物→选目标人物→换人→出片 │ └─ ➕ 新建流程 从能力库拖节点自建 │ ├─ 🧩 能力中心 ← 二级:能力配置 │ ├─ ⚙️ 能力配置 25 能力 × 供应商 × 模型 × 参数默认值 │ ├─ 🔌 供应商管理 各能力可选哪些供应商 + 密钥状态 │ └─ 🧪 能力试跑 单独测某个能力(不跑整条流程) │ └─ 📊 运营 ← 二级:辅助 ├─ 📋 生产记录 每次跑流程的记录(产物/耗时/状态) ├─ 💰 费用统计 按能力/供应商/项目统计 ├─ 🕐 历史操作 谁在什么时候改了什么 └─ ⚙️ 视频工厂设置 全局默认(去AI化参数/输出规格…) ``` **设计原则**: - **一级只有 4 个**:资源库(原料)· 流程(做事)· 能力中心(零件)· 运营(辅助) - **二级是具体库/流程**(可继续扩) - 你**日常只用「流程」**(选一条 → 画布 → 执行);资源库/能力中心是**配置时**才去 ### 2.1 🧑 角色库细化(重点,按你的要求) **列表页** ``` 🔍 [搜索名字/标签] 筛选:类型▾ 用途▾ 项目▾ 标签▾ 有音色☐ 有LoRA☐ 排序:最近使用▾ ──────────────────────────────────────────────────────────── 卡片视图(默认): ┌─────────┐ ┌─────────┐ ┌─────────┐ │ [缩略图] │ │ [缩略图] │ │ [缩略图] │ │ 阿远 │ │ 小漫 │ │ 患者A │ │ 真人·主角│ │ 动漫·配角│ │ 真人·主角│ │ 用过 12 次│ │ 用过 3 次│ │ 用过 8 次│ └─────────┘ └─────────┘ └─────────┘ 表格视图:名字 | 类型 | 用途 | 音色 | 参考图数 | 使用次数 | 更新时间 批量操作:☑多选 → 加标签 / 导出 / 删除 ``` **角色详情页** ``` [基本信息] 名字 · 类型(真人/动漫/3D) · 用途(主角/配角/群演) · 项目 · 标签 · 一致性种子 [参考图] 正面 / 侧面 / 背面 / 全身 / 多角度缩略图(可上传、可生成、可删) [服装变体] 服装A(图) · 服装B(图) …(每套可切换) [音色] voice_sample.mp3 ▶ + 音色 ID(可从「音色库」选,或现场提炼) [使用记录] 被哪些项目/流程用过(可跳转) [操作] ✏️ 编辑 · 🎨 重新生成参考图 · 📤 导出 · 🔒 锁定(流程中不被覆盖) ``` **生成入口**("基础能力"的体现) ``` ➕ 新建角色 → ① 填描述(性别/年龄/外形/性格) → ② 调「文生图」能力(Kling Grid Method 出 6 张候选) → ③ 选 1 张 → ④ 生成多角度(图生图变体) → ⑤ 补音色(录音上传 / TTS 合成 / 从音色库选) → ⑥ 确认入库 📤 上传已有参考图(跳过生成) ``` **在流程里怎么用**(引用机制) ``` 流程节点「角色」字段 → 点击 → 弹【角色选择器】(带上面的筛选器) 选中 → 节点保存 character_id → 执行器按 ID 从资源库取:参考图路径 + 音色文件 → 注入 API 请求 分镜级:每个镜头可指定不同角色(shot.character_id) ``` ### 2.2 其他资源库(同结构,字段按 DCS 文档第五节) | 库 | 字段要点 | |:--|:--| | **场景库** | id / 名字 / 拓扑结构 / 空间锚点 / 光源 / 材质 / 参考图 + 参考视频 | | **真实场地库** | 多角度图(wide/detail/light)+ 实拍视频 + 备注 | | **道具库** | id / 结构 / 比例 / 可见面 / 持用状态 / 新旧状态 / 参考图 | | **产品库** | id / 名字 / **category** / **must_keep[](必保特征)** / 参考图(front/angle/detail/in_hand)/ 一致性种子 | | **服装库** | 关联角色 / 正面背面图 / 材质 · 可挂到角色的"服装变体" | | **音色库** | id / 名字 / 样本音频 / 来源(官方库/AI提炼/录制)/ owned_by | | **BGM 库 / 音效库** | 标签(情绪/节奏)· 时长 · 版权 | | **特效预设库** | 类型(子弹时间/环绕/慢动作/焦点锁定)· 参数模板 · 适用供应商 | **统一能力**(每个库都有): ``` 🔍 搜索 + 筛选 + 排序 📤 上传 ➕ 生成(调对应产出型能力) ✏️ 编辑 🗑 删除 🔗 查看被哪些流程引用 ``` --- ## 三、流程清单与现状(诚实标注) | # | 流程 | 节点链 | 现状 | 待修 | |:--|:--|:--|:--|:--| | 1 | **导演创作** | 剧本输入 → 剧本创作(导演系统) → 分镜配置 → 编排执行 → 结果挑选 | 🟡 可跑通(引擎已接),但缺"每步审视/纠正" | 补:分镜后的逐镜头配置面板、执行前预览 | | 2 | 基础口播 | 脚本 → TTS → 素材搜索 → BGM → 视频输出 | ❌ **模板在,执行器空转** | 通电(接能力)+ 逐节点审视 | | 3 | 卡点视频 | BGM导入 → 卡点风格 → 质量审核 → 视频输出 | ❌ 同上 | 同上 | | 4 | 角色叙事 | 剧本→改编→角色→策略→Kling生成→旁白TTS→审核→输出 | ❌ 同上 | 同上 | | 5 | 数字人口播 | 文案 → 人声合成 → 数字人角色 → 数字人视频 | ❌ 同上(且数字人能力未接) | 同上 + 接数字人供应商 | | 6 | 口播+混剪 | 口播脚本 → 人声合成 → 混合风格 → 混合视频 | ❌ 同上 | 同上 | | 7 | 短剧创作 | 12 节点(故事→…→成片) | ❌ 同上(但模板结构完整) | 同上 | | 8 | 人物置换 | 选源人物 → 选目标人物 → 换人 → 出片 | 🟡 能力已接(百炼 wan2.2),未包成流程 | 包成流程 + 界面 | > **现状真相**:`workflows.py` 的 6 条模板**结构完整、节点定义齐全**,但 `WorkflowRunner._execute()` **只做拓扑排序然后标记 completed**,**没有任何节点真的执行** —— 这是"点了不跑"的根因。 --- ## 四、节点与配置体系(你强调的重点) ### 4.1 节点 = 能力 + 配置 + 上下游 ```yaml node: id: n3 capability_id: tts_generate # 用哪个能力(可替换!) provider: volcano # 该能力的供应商(默认可改) model: CosyVoice-v2 # 大模型(默认可改) params: # 该节点所有可配置项(默认值预填,全部可改) text: "{{n1.script}}" # 上游节点输出 → 本节点输入(数据流) emotion: warm speed: 1.0 outputs: { audio_path: "var.vo" } # 本节点输出 → 供下游引用 ``` ### 4.2 配置的三个来源(全部暴露给你) ``` ① 能力默认值(出厂设置) ← 打开节点就能看到 ② 流程级默认(这条流程整体改) ← 比如"这条流程统一用 9:16 竖屏" ③ 节点级覆盖(本次执行改) ← 只改这一个节点 ``` **UI 规则(你要求的"能改的地方都要能选")**: - 每个节点的**所有可配置项都列出来**(默认值预填) - 显示**来源标记**(默认 / 流程 / 节点),改了就在当前层生效 - 提供「恢复默认」 - **供应商 + 模型**是独立下拉(每个能力可选多家 → 每个供应商可选自家模型) ### 4.3 节点可替换("同一个需求找不同能力") 以"要一段声音"为例,节点里可以选: ``` ▸ 能力 A:TTS 合成 输入文字 → 出音频(默认路径) ▸ 能力 B:音色提炼 + 合成 先给一段参考音频 → 提炼音色 → 再合成 ▸ 能力 C:从资产库调音色 选一个已有音色 → 合成 ``` → 节点上有个「🔄 替换能力」,选不同能力,参数面板随之切换。 --- ## 五、执行与审查机制 ★ 你最关心的部分 ### 5.1 两种模式(可随时切换) ``` ▸ 自动模式:点「▶▶ 全部执行(默认配置)」→ 一条龙跑完 → 出成品 → 你在成品上审 (前提:默认配置必须能走通 —— 我会保证并逐条验证) ▸ 逐步模式:点「▶ 执行本节点」→ 出结果 → 你审视 → 改 or 继续 (可设"断点":跑到某节点自动停) ``` ### 5.2 每个节点的结果展示 + 纠正(核心) | 节点类型 | 产物形态 | 你怎么审视/纠正 | |:--|:--|:--| | **文本类**(剧本/提示词/台词/字幕) | 原文显示在节点里 | **直接编辑**;不满意可「🔄 重生成」(可加"修改意见"再生成) | | **音频类**(配音/BGM) | 内嵌播放器 | 听;不满意 → 改参数(音色/语速/情绪)→「🔄 重做」 | | **图片类**(参考图/分镜图) | 缩略图预览 | 看;不满意 → 改提示词/换模型 →「🔄 重做」;可「选一张」 | | **视频类**(镜头片段) | 内嵌播放器 | 看;不满意 → 改提示词/换镜头 →「🔄 重做」;可「换一版」多出几条挑 | | **决策类**(策略/风格/审核门) | 选项列表 | 直接改选项;审核门可"通过/打回" | **统一交互**: ``` 节点卡片 ┌───────────────────────────────┐ │ 🔊 TTS 合成 [执行] [重做] │ │ ├ 供应商 [火山▾] 模型 [Cosy▾] │ │ ├ 情绪 [warm▾] 语速 [1.0] │ │ ├ 输入: ← 脚本节点"口播稿" │ │ └ 结果: ▶ [播放音频] 3.2s ✅ │ └───────────────────────────────┘ ``` - **未执行的节点**:灰显 + 「▶ 执行」 - **已执行的节点**:绿标 + 产物预览 + 「🔄 重做」(改配置后重跑,下游自动标记"需重跑") - **全局**:可「从某节点起重跑下游」 ### 5.3 导演创作流程的审视点(按你的描述) ``` ① 输入剧本/小说/思路 → 你写(或从资产/素材带入) ② 剧本创作(导演系统产出分镜) → **审视**:看分镜表,逐镜头改台词/画面/镜头契约 ③ 逐镜头配置(选特效/角度/模型)→ **审视**:每个镜头有默认配置,你只改不满意的 ④ 编排执行(生成→去AI化→拼接)→ **审视**:每条片段可看/可重做 ⑤ 结果挑选 / 调整 → 选终版 or 重跑某镜头 ``` > 你的原话:"每个镜头我不需要手动配,但我要去审视一下现在配的结果;中间要修改就修改,不修改就用默认" ✓ **就是这个设计**。 --- ## 六、后端架构 ``` ┌── L1 能力层(Capability Registry)── ✅ 已有(25 个),需扩展 │ capabilities.yaml + 加载器 + /api/ave/capabilities │ 每个能力:输入输出契约 / 参数 schema / 供应商[] / 默认值 / 实现位置 │ ├── L2 节点层(Node)── 🟡 部分有(workflows.py 的 15 种节点定义) │ Node = 能力引用 + 参数覆盖 + 上下游映射 + 状态(未跑/跑完/失败) │ ├── L3 流程层(Template/Process)── 🟡 6 条模板已有,需扩展(+导演创作/人物置换) │ Template = 节点 + 连线 + 流程级默认 + 元信息 │ ├── L4 执行器(Runner)── ❌ **空转,必须重做** │ 拓扑执行 → 逐节点调能力 → 产物落地 → 状态回写 → 断点/续跑 → 重跑上游 │ (这是"工作流能真跑"的核心) │ ├── L5 资产层(Assets)── ❌ **要重建**(旧 character_registry 只覆盖角色且字段旧) │ 按你的分类建库 + 生成入口 + 引用机制 │ └── L6 接口/UI ── 前端页面 + FastAPI 路由 ``` **执行通道**: - 轻任务(解析/规划/合成)→ 本地线程 - 长任务(可灵生成 / ComfyUI)→ 走 guardd 任务(有任务面板、可停、可重试) --- ## 七、与现有代码的映射(哪些复用、哪些重做) | 现有资产 | 处置 | |:--|:--| | `capabilities.yaml`(25 能力) | **复用**(L1 底座)→ 按需扩充 | | `workflows.py` 的 6 模板 + 15 节点定义 | **复用结构**(L2/L3)→ 重做执行器 | | `workflow.js` 画布 UI(485 行) | **复用**(拖拽 + 节点配置面板)→ 补"产物预览 + 重做" | | `scheduler.py` / `scorer.py`(模板引擎) | 参考(筛选模板用) | | `composer/*`(去AI化/拼接/变速/转场) | **复用**为能力实现 | | `capabilities/kling_video.py`(可灵) | **复用**为能力实现 | | `character_registry/`(旧角色库) | **改造**:字段按你的要求重建;补场景/道具/产品 | | `character_sheet.py`(定妆照) | **复用**为产出型能力 | | `person_swap/`(百炼换人) | **复用** → 包成"人物置换"流程 | | `story_director/` + `directors/` | **复用**(导演流程的②环节) | | `schemas.py`(统一分镜) | **复用**(导演流程的数据契约) | | `video_factory.py`(CLI 老流程) | **改造**:拆成能力 + 流程模板 | | `workflows.py` 的 Runner | **重写**(执行器) | --- ## 八、改造计划与**实际进度**(每阶段以"能点、能看结果、能改"验收) | 阶段 | 内容 | 状态 | |:--|:--|:--| | **P1 架构对齐** | 本文档定稿 + 旧文档归档 + 菜单按新结构重组 | ✅ **已完成**(`4.10.0`:菜单 4 组 + 20 占位页) | | **P2 执行器** | 重写 `WorkflowRunner`:真执行 + 逐节点产物 + 状态 + 重做 | ⏳ **待决策**(编排层 A/B)· 前置调研已完成(15 节点映射表见附录 D) | | **P3 节点配置面板** | 每节点全配置暴露(默认值 + 供应商 + 模型 + 参数)+ 替换能力 | ⏳ 属 P2 范围(依赖执行器) | | **P4 导演创作补全** | 统一分镜 Schema + 导演可切换 + 分镜编辑 + 一键出片 | ✅ **已完成**(`2607a973b`→`304d7e30e`;实测 3 镜头 **1.9 分钟**出片 / **3.2MB**) | | **P5 资产底座** | 按分类建库(角色/场景/道具/产品/音色…)+ 上传/编辑 | ✅ **主体完成**(`2b866c23a` `eebeabcbc` `1aa4651f6`:**10 类资产** + 通用组件;**生成入口待图片模型名确认**) | | **P6 流程补齐** | 人物置换 + 6 条老流程逐条通电验证 | ⏳ **待 P2** | | **P7 辅助** | 生产记录 + 费用 + 设置 | ✅ **已完成**(生产记录含磁盘持久化 · 费用统计含可灵估算+AI token · 设置含去AI化/输出/渲染) | | — | **S1 能力注册表**(25 能力 + 能力库页 + 供应商管理 + 能力试跑) | ✅ **已完成**(`952b39970` `4c6caf2f3`:39 个供应商,密钥状态 18/27 已配) | | — | **S2 导演创作**(v5.2 技能入库 + 六模块提示词 + 交付状态三级 + Webhook 验签) | ✅ **已完成**(`82a63f4b3` 起) | **当前剩余**:**P2(编排通电)** —— 等编排层决策(① 复用 `workflows.py` / ② 装 n8n)后即可开工;「历史操作」页仍为占位(低优先级)。 --- ## 九、待你确认(关键,定了才动手) 1. **资产分类的字段**(你说"我给的分类都没有" —— 请再给一次): - 角色要什么字段?(正面照/多角度/服装变体/表情/音色/年龄/身高…) - 场景/道具/产品各要什么?**产品 vs 道具**怎么区分? - 分类方式(按项目?按类型真人/动漫?按用途主角/配角?) 2. **菜单是否按本文第二节重组**?(流程/能力/资产/辅助 四大块) 3. **执行模式默认哪个**?(逐步 or 自动;我建议默认"逐步",你熟了可切自动) 4. **阶段优先级**:P2(执行器通电)和 P5(资产重建)你想先做哪个? --- ## 附录 C|与《导演创作系统说明书 v2.0》的对齐(**重要基准**) > 用户原始设计文档:`~/Documents/导演创作系统(Director.docx`(829 行,v2.0,2026-10-01 更新) > 本节把文档的**逻辑架构**映射到**现有看板**,明确哪些复用、哪些要补 —— **以文档为基准,不再自由发挥** ### C.1 文档的五层架构 → 我们的实现 | 文档层 | 文档原方案 | 我们的现状 | 处置 | |:--|:--|:--|:--| | **层0 导演控制台** | Appsmith(Docker :80);页面:分镜编辑/资产库/3D角色/特效库/任务状态/成片预览/参数模板/系统设置 | **Dashboard(:9988)** 已有:导演创作 / 能力库 / 工作流 / 生产记录 / 费用 | ✅ **复用现有看板**(功能更全,不必新装 Appsmith) | | **层1 导演层** | 任一导演系统输出统一 Schema | `directors/`(v5.2 + legacy)+ `schemas.py`(14 模型) | ✅ 已完成 | | **层2 编排层** | n8n(Docker :5678):Webhook→读Schema→循环shot→Switch按type分发→等完成→下载→FFmpeg→回调 | `workflows.py`(6 模板 + 15 节点 + 画布)**但执行器空转** | ⚠️ **二选一**(见 C.3) | | **层3 能力层** | 远端 API,8 大类每家多供应商(TTS/口播/动作/背景/ComfyUI/3D/特效) | `capabilities.yaml`(25 能力,含多供应商)+ 可灵/video 引擎 | ✅ 骨架已备,供应商待补 | | **层4 合成层** | FFmpeg:去AI化 → 帧混合 → 拼接 | `composer/`(de_ai.py + pipeline.py) | ✅ 已完成(**注意**:文档写 `-crf 18`,我们改为 `23` 以控体积) | ### C.2 资产库规范(文档第五节 → 落地基准) ``` assets/ ├── characters/ 角色 2D — reference.png / _side.png / _full.png / lora.safetensors / voice_sample.mp3 / meta.json ├── characters_3d/ 角色 3D — model.glb / model.fbx / texture/ / rig_info.json / meta.json ├── locations/ 场景(AI生成)— reference.png / reference_video.mp4 / meta.json ├── real_locations/ 真实场地 — reference_wide.jpg / _detail.jpg / _light.jpg / reference_video.mp4 / meta.json ├── products/ 产品 — reference_front.png / _angle.png / _detail.png / _in_hand.png / meta.json ├── props/ 道具(结构同 products) ├── bgm/ sfx/ 音频资产 └── vfx_presets/ 特效预设 — bullet_time.yaml / orbit.yaml / slow_motion.yaml ``` **元数据规范(文档原文)**: - **产品**:`id / name / category / must_keep[](必保特征,如"瓶身标签文字""瓶盖金色边框")/ reference_images{front,angle,detail,in_hand} / consistency_seed` - **3D 角色**:`id / name / source_tool / model_formats[] / rigged / rig_type / reference_2d_id / consistency_seed / created_at` - **引用方式**:分镜 Schema 通过 `character_id / character_3d_id / location_id / product_id / props[] / bgm_id / sfx.id / vfx.vfx_id` 引用 → 执行器按 ID 从资产库取文件注入 API **我们现状**:只有 `character_registry/registry.yaml`(14 角色;字段:description/appearance/personality/voice_style/art_style/bgm_style/reference_images/prompt_template)→ **需按上述结构重建** ### C.3 两个关键决策(等你定) **决策 1:编排层用哪个?** | 方案 | 说明 | 优劣 | |:--|:--|:--| | **A. 复用现有 workflows.py + 重写执行器** | 已有 6 模板 + 15 节点 + 画布 UI + 节点配置面板;只需把"假执行"换成真执行 | ✅ 不用新装服务 · ✅ 与看板一体 · ⚠️ 执行器要自己写 | | **B. 按文档装 n8n(Docker :5678)** | 照文档原方案,n8n 做编排,看板只当控制台 | ✅ n8n 成熟(可视化/重试/日志) · ⚠️ 要装 Docker 服务 + 学 n8n · ⚠️ 与看板两套系统 | | **C. 混合** | 看板做控制台 + 流程配置,轻任务本地执行;把"逐镜头生成"这段交给 n8n | 复杂度高 | **决策 2:控制台用哪个?** - **A. 现有 Dashboard(:9988)** ← 建议(已能跑、功能多、Tailscale 可访问) - B. 按文档装 Appsmith(:80)—— 要重搭所有页面 ### C.4 文档「导演操作流程 12 步」→ 现状对照 | # | 文档步骤 | 现有看板 | 状态 | |:--|:--|:--|:--| | 1 | 打开浏览器 | :9988 | ✅ | | 2 | 分镜编辑页输入故事大纲 | 视频工厂 → 🎬 导演创作 | ✅ | | 3 | **选内容类型**(产品广告/个人日记/场景短剧) | — | ❌ **缺** | | 4 | **选角色**(2D 参考图 / 3D 绑定模型) | — (Schema 有字段,UI 未暴露) | ❌ **缺** | | 5 | **选场景/场地/产品** | — | ❌ **缺** | | 6 | 点击生成分镜 | 🚀 生成分镜 | ✅ | | 7 | 逐条检查/修改 + **添加特效**(子弹时间/环绕运镜) | 能改文字;**特效面板无** | 🟡 部分 | | 8 | 提交任务 | 🎥 生成成片 | ✅ | | 9 | 编排层调各 API 生成片段 | 我们的流水线(逐镜头→可灵) | ✅ | | 10 | FFmpeg 去AI化 + 拼接 | composer(已修 + 体积优化) | ✅ | | 11 | 刷新预览成片 | 进度条 + 成片路径 | ✅ | | 12 | 不满意 → **改对应镜头参数** → 重试单条 | 有单镜头重生成,但**不是"改参数重试"** | 🟡 部分 | **缺的 4 项**:③内容类型 ④选角色 ⑤选场景/产品 ⑦特效面板 ⑫改参数重试 ### C.5 文档里的能力清单(供应商维度,能力注册表要照此扩充) | 模块 | 文档列出的可选供应商 | |:--|:--| | TTS | Fish Audio / ElevenLabs / Qwen3-TTS | | 口播视频 | D-ID / HeyGen / 本地 LongCat | | 动作视频 | 可灵 / Wan-Animate-2 / Runway | | 背景空镜 | 通义万相 / Sora 2 / 可灵 | | ComfyUI | RunningHub / ComfyDeploy / 自建 | | 3D 角色 | 混元3D / Autodesk Flow Studio | | 特效·子弹时间 | 万兴天幕 / 海螺AI / 可灵 | | 特效·运镜 | 可灵(camera_control 六参数 ∈[-10,10])/ 海螺AI(T2V-01-Director) | --- ## 附录 D|节点 → 能力映射表(P2 执行器的实施依据) > 调研结论:`workflows.py` 的 15 种节点定义**只有 UI 元数据**(label/icon/description/default_config/options_map), > **没有绑定到真实能力**;`WorkflowRunner` 是空壳。下表把 15 种节点映射到能力注册表里的实现。 | # | 节点类型 | 名称 | 对应能力 | 状态 | |:--|:--|:--|:--|:--| | 1 | `story_prototype` | 剧本原型 | `script_generate`(LLM 生成) | ✅ ready | | 2 | `script` | 脚本输入 | **无执行**(用户输入 / 读文件) | — 透传 | | 3 | `script_adaptor` | 剧本改编 | `script_parse` + `script_generate` | ✅ ready | | 4 | `strategy` | 策略选择 | LLM 决策 或 参数选择 | 🟡 待明确 | | 5 | `tts` | TTS 合成 | `tts_generate`(火山/阿里) | ✅ ready | | 6 | `model` | AI 模型 | LLM(DeepSeek)通用调用 | ✅ ready | | 7 | `material` | 素材源 | `material_search`(Pexels/万相/兜底) | ✅ ready | | 8 | `style` | 风格预设 | **无执行**(参数注入) | — 透传 | | 9 | `bgm` | BGM 选择 | `bgm_generate` / `music_select` | ✅ ready | | 10 | `character` | 角色 | **资产引用**(无执行,取资产注入) | — 引用 | | 11 | `audit_gate` | 审核门 | **人工暂停/继续**(需实现断点机制) | 🟡 待实现 | | 12 | `output` | 输出 | `video_concat` + `de_ai` | ✅ ready | | 13 | `storyboard` | 分镜规划 | `storyboard_plan`(v5.2/clip/legacy) | ✅ ready | | 14 | `prompt_gen` | 分镜提示词 | `prompt_gen`(六模块编译器) | ✅ ready | | 15 | `subtitle` | 字幕生成 | `subtitle` | 🟡 partial | **结论**: - **12/15 节点已有现成能力**(ready 或 partial) - 4 个是"无执行"节点(`script` 输入 / `style` 参数 / `character` 引用 / `strategy` 决策)→ 执行器**透传**即可 - 1 个需新机制:`audit_gate`(人工审核门 → 暂停/继续) **P2 执行器工作量**(已明确): 1. 建 `NODE_TYPE → capability_id` 映射(上表) 2. 执行器:拓扑排序 → 逐节点调能力 → 产物存 run context → 下游按 `{{node.xxx}}` 引用 → 状态回写 3. 特殊处理:无执行节点透传 · `audit_gate` 暂停 · 失败重试 · 「从某节点起重跑下游」 4. 前端:节点卡片显示产物预览(文本可编辑 / 音视频可播放)+ 🔄 重做 --- ## 附录 E|P2 实施要点(执行器改动清单 —— 决策后即可开工) **目标文件**:`05_tools/10_dashboard/workflows.py`(599 行) **现状(3 处关键代码)**: | 位置 | 现状 | |:--|:--| | `WorkflowRunner._execute()`(519 行) | 只做拓扑排序 → 把节点标记 `completed`,**无任何真实执行** | | `NODE_DEFINITIONS`(35 行) | 15 种节点**只有 UI 元数据**(label/icon/description/options_map),**未绑定能力** | | `start_run()`(510 行) | 起后台线程调 `_execute` ✓ 骨架可用(可直接复用) | **改动清单(3 步)**: 1. **建映射**:`NODE_TO_CAPABILITY = {node_type: capability_id}` —— 附录 D 已给出 15 项对应(12 项有现成能力) 2. **写节点执行** `_run_node(node, ctx) -> dict`: - 查映射 → 取能力 → 合并参数(**能力默认 ← 流程覆盖 ← 节点覆盖**)→ 调实现 → 返回产物 - **4 个无执行节点**(`script` / `style` / `character` / `strategy`)→ **透传**(直接传上游值) - `audit_gate` → 置 run 状态为 `paused`,等外部 `resume` 3. **改 `_execute()`**:逐节点调 `_run_node` → 产物存 `run["context"][node_id]` → 下游按 `{{node.xxx}}` 解析 → 状态回写(success/failed/skipped)→ 失败按节点重试配置重试 **后端新接口(3 个)**: | 接口 | 用途 | |:--|:--| | `POST /api/workflow/runs/{run_id}/redo/{node_id}` | 单节点重做(改配置后重跑) | | `POST /api/workflow/runs/{run_id}/resume` | `audit_gate` 审核通过 → 继续 | | `GET /api/workflow/runs/{run_id}/artifacts` | 各节点产物列表(供前端预览) | **前端配合**(`views/workflow.js` 画布已就绪): - 节点卡片加**状态徽章** + **产物预览**(文本可编辑 / 视频可播放) - 「🔄 重做此节点」·「▶️ 从此刻起跑下游」按钮 **可复用**(无需重写): - 能力注册表(`capabilities/`)· 可灵引擎(`kling_video.py`)· 流水线(`composer/pipeline.py`)· 资产库(`assets_manager/`)· 成本统计(`api_costs`) --- ## 附:归档说明 以下文档**已归档**(内容被本文档取代,避免误导后续开发): - `VIDEO_FACTORY_FRAMEWORK.md`(v1 框架:菜单分类有误,见第二节) - `VIDEO_FACTORY_ARCHITECTURE.md`(技术细节,已并入本文第六节) - `DCS_VIDEO_FACTORY_PLAN.md`(调研 + M1 计划,M1 已完成) 归档位置:`90_archive/video_factory_docs_20261001/`