feat(monitor): 抖音 Web 接口客户端 —— 绕开爬虫子进程,直接发 HTTP
Deploy VitePress site to Pages / build (push) Canceled after 0s
Deploy VitePress site to Pages / Deploy (push) Canceled after 0s

移植自 mac-agent-os 的 mediacrawler_adapter:不起子进程、不开页面,用浏览器里那份
登录态直接调抖音 Web 接口。产物键名照抄 store/douyin,所以 ingest 那条链路一个字不用改。

**目前能用的(真环境实测,非推断)**:

    profile/other : 200, 7075 字节  —— 博主主页指标(粉丝/获赞/作品数/昵称)
    aweme/detail  : 200, 45425 字节 —— 单条作品详情(含点赞/评论/收藏/分享)

**目前不能用的:作品列表 `aweme/post`。** 两个互相独立的原因:
  1. 这个接口被抖音单独升级成了真校验:不带 x-tt-argus 回 403「Uifid Not Found」,
     带上 dummy 值回 200 + **空 body**。也就是说「头在不在」骗得过,「真校验」过不了。
     同一套头打 profile/other 和 aweme/detail 都是通的 —— 抖音是挑着接口加保护的,
     挑中的恰好是「批量拉作品列表」这个最敏感的动作。
  2. 改走页面截获也不行:CDP 浏览器打开博主主页会落到「验证码中间页」(当天大量探测的
     代价,过几小时要重测)。

  所以现在的边界是:**已知作品的指标刷新能做,自动发现新作品做不了**。

**排查中控住变量后得到的两条事实**(都写进注释了):
  · `Accept` / `Accept-Language` / `Referer` 才是主页接口能返回真数据的原因 —— 只有
    UA+client hints+Cookie 时是 200 但仅 121 字节的空壳,补上这三个头变 7074 字节。
    (我先前猜的 sec-ch-ua 不是关键。)
  · 因此 UA 与 client hints 必须**成套地取自同一个浏览器**,所以 BrowserIdentity 一次
    从 CDP 取齐 cookie + UA + hints,而不是各自写死。

「200 + 空 body 必须当场报错」也是刻意写死的:放过去它会在下游变成「这个博主没作品」,
把一次失败伪装成一条正常结果 —— 爬虫那条路正是这么栽的,还被翻译成「账号被封」。

测试 +11:cookie 解析、请求头成套性(含 uifid 缺失/回退)、产物键名与 store 对齐、
以及 _get 的三条失败路径(空 body / 403 带网关原话 / 正常返回)。
This commit is contained in:
2026-10-10 17:12:25 +08:00
parent 21ff01b894
commit 2112c1a870
1601 changed files with 367425 additions and 0 deletions
@@ -0,0 +1,289 @@
# 视频工厂模块梳理与 DCS 落地规划
> 创建: 2026-10-01 | 状态: 方案待确认
> 输入文档: `~/Documents/导演创作系统(Director.docx`(DCS 项目开发说明书 v2.0)
> 目标: 把 DCS 的「故事 → 分镜 → 成片」能力落到现有 Dashboard 视频工厂,先跑通一条片子
---
## 一、背景
用户提供 DCS 文档(5 层架构、统一分镜 Schema、8 类能力 API、去 AI 化合成链)。文档原设计用
**Appsmith(控制台)+ n8n(编排)+ Docker** 三件套;但项目**已有 Dashboard 控制台 + command_bus/guardd 执行体系**,
且 `09_ave` 后端**已有完整的视频生产流水线**。
**结论:融入现有 Dashboard(不引入 Appsmith/n8n)**,把 DCS 的分镜 Schema 与去 AI 化链补进来。
---
## 二、现状全景(2026-10-01 实测)
### 2.1 后端 `05_tools/09_ave/scripts/`(能力远比预期完整)
**六个分层目录**(已有):
| 目录 | 职责 |
|:--|:--|
| `01_director_parser/` | 导演脚本解析(文案 → 结构化脚本) |
| `02_voice_synthesizer/` | 语音合成(TTS) |
| `03_bgm_generator/` | BGM 生成 |
| `04_anchor_extractor/` | 锚点提取(一致性锚点) |
| `05_material_producer/` | 素材生产 |
| `06_composer/` | 合成器(**已有 2635 行**:`ffmpeg.py` 702 / `hybrid.py` 453 / `speed_ramp.py` 370 / `lipsync.py` 369 / `character_locker.py` 68 / `beat_sync.py`) |
| `07_service_layer/` | 服务层(**空壳,只有 `__init__.py`**) |
**核心脚本**:
| 文件 | 规模 | 职责 |
|:--|:--|:--|
| `main.py` | 931 行 | 原子能力 CLI:`voice`(TTS aliyun/volcano)/ `material`(素材搜索)/ `parse`(文案→导演脚本)/ `compose`(视频合成)/ `anchors`(锚点提取)等 |
| `character_sheet.py` | 841 行 | 定妆照/角色图(Kling 接入处) |
| `character_portrait.py` | 790 行 | 角色画像 |
| `video_factory.py` | 641 行 | **5 种生产模式**:`run_oral`(口播)/ `run_beat`(卡点)/ `run_digital_human`(数字人)/ `run_hybrid`(口播+卡点)/ **`run_story`(故事·漫剧,← DCS 目标)** |
| `story_director/` | 1430 行 | `scene_planner` 444(剧本→场景+Prompt)/ `temporal_bridge` 322(场景过渡桥接)/ `batch_generator` 664(批量 Kling + 固定 seed) |
| `director_parser/` | 323 行 | `parser.py` 192 + `schemas.py` 131 |
| `composer/` | 2635 行 | FFmpeg 封装 / 混合合成 / 对口型 / 变速 / 节拍同步 / **角色锁定** |
| `lib/` | — | `config.py` / `cost_tracker.py`(成本追踪)/ `dashboard.py`(生产埋点)/ `logger.py` |
| `demo_full_pipeline.py` | 256 行 | 完整流程演示 |
| `AVE_ARCHITECTURE_PLAN.md` | 480 行 | **既有架构规划**(见 2.3) |
**集成方式**:`09_ave` **没有独立 FastAPI 层**;Dashboard 通过 `app.py` 把 `09_ave/scripts` 加入 `sys.path`,
并由 `plugins/ave.py`(243 行)解析能力清单供 `/api/capabilities` 使用。
### 2.2 前端视图(`10_dashboard/frontend/src/views/`)
**菜单已挂 8 项**(`nav-menu.js` → 视频工厂):
| 视图 | 行数 | 实际状态 |
|:--|:--|:--|
| `workflow` | 485 | 节点画布(拖拽 + 模板系统,模板来自 `10_dashboard/workflows.py`) |
| `capabilities` | 80 | 能力目录(调 `/api/capabilities`,数据源 `AVE_ARCHITECTURE_PLAN.md`) |
| `person-swap` | 269 | 人物置换(已实现) |
| `characters` | 138 | 角色列表 |
| `char-gen` | 389 | 角色生成器 |
| `productions` | 88 | 生产记录 |
| `assets` | 57 | 素材库 |
| `costs` | 61 | 费用分析 |
**未挂菜单的空壳**(各 9 行,仅"功能开发中"):`ave-script`(脚本生成)/ `ave-materials` / `ave-render` / `ave-templates`
### 2.3 工作流模块现状(`10_dashboard/workflows.py`,599 行)
**已有 6 个模板**(`WORKFLOW_TEMPLATES`):
| 模板 ID | 名称 | 节点数 | 节点链 |
|:--|:--|:--|:--|
| `basic_dub` | 基础口播 | 5 | 脚本 → TTS → 素材搜索 → BGM → 视频输出 |
| `beat_sync` | 卡点视频 | 4 | BGM 导入 → 卡点风格 → 质量审核 → 视频输出 |
| `character_narrative` | 角色叙事 | 8 | 剧本输入 → 脚本改编 → 角色引用 → 故事策略 → Kling 生成 → 旁白 TTS → 生成审核 → 最终输出 |
| `digital_human` | 数字人口播 | 4 | 文案输入 → 人声合成 → 数字人角色 → 数字人视频 |
| `hybrid_dub` | 口播+卡点混合 | 4 | 口播脚本 → 人声合成 → 混合风格 → 混合视频 |
| **`short_drama`** | **短剧创作** | **12** | 故事输入 → 脚本编辑 → 角色设定 → 短剧策略 → **分镜规划** → **提示词生成** → 场景视频 → 角色配音 → 配乐 → 字幕 → 成片审核 → 短剧成片 |
**15 种节点类型**(`NODE_DEFINITIONS`)—— 已含 DCS 所需关键节点:
`story_prototype`(剧本原型)/ `script_adaptor`(剧本改编)/ `storyboard`(**分镜规划**:景别/运镜/转场/对白/动作)/ `prompt_gen`(**分镜提示词**)/ `character`(角色引用+定妆照)/ `tts` / `material` / `bgm` / `style` / `strategy` / `model` / `audit_gate`(人工审核门)/ `subtitle` / `output`
**🔴 关键问题:执行器是空转的**
`workflows.py:519-530` 的 `WorkflowRunner.start_run()` → `_execute()`:
```python
def _execute():
ordered = self._kahn_sort(run["nodes"], run["edges"]) # 只做拓扑排序
for n in ordered:
run["node_states"][n["id"]] = "completed" # 直接标记完成
run["status"] = "completed"
```
**没有任何真实节点执行逻辑**(不调 TTS / Kling / 合成)→ 工作流"能画、能存、能排序,但点了不真跑"。
真正能出片的是 `09_ave/scripts/video_factory.py`(`run_story` / `run_oral` / `run_beat` ...),走 CLI,**与 workflow 画布未打通**。
**接口现状**(`app.py:1083-1130`):`GET /api/workflow/nodes|node/{type}|templates|runs|runs/{id}`、`POST /api/workflow/run`
### 2.4 三视角分工(结论)
```
「🎬 导演创作」新建视图 ← 分镜视角(表格:逐条编辑/删/重试)★ M1 做这个
「🔀 工作流」现有画布 ← 流程视角(6 模板 + 15 节点;执行器待补)
「📋 生产记录 / 💰 费用」 ← 结果与成本视角
────────────────────────────────────────────
后端 09_ave 真实流水线 ← 真正出片的地方(run_story / run_oral / ...)
```
**M1 正确做法**:新建导演创作视图(分镜表)+ 后端接**真实流水线**;
工作流保留为流程视角(把画布节点接到真实能力的"执行器补齐"另排期,不在 M1)。
### 2.5 既有架构规划(`AVE_ARCHITECTURE_PLAN.md`,2026-05-18)
**已定义 6 条生产路径**:
```
1. 口播线 文案→TTS→素材→BGM→字幕→合成
2. 卡点线 BGM→节拍检测→素材→拍点切换→xfade
3. 数字人线 照片/视频→OmniHuman对口型 / DreamActor动作模仿
4. 口播+卡点线 人声锚点+BGM变速→帧锁定拼接 (hybrid)
5. 故事/漫剧线 ★ 剧本→场景分解→Kling批量→角色拼接 ← DCS 要的这条
6. 模仿视频线 ★ 参考视频→结构分析→动作迁移/角色替换→合成
```
**已识别的问题**(原文):
1. 各策略独立实现,**底层能力重复**(口播和卡点的素材搜索各写一遍)
2. **角色系统只在"故事"线使用**,口播/卡点/数字人都需要角色但未接入
3. AudioLine 建成但未接入主流程
**既有解法**(原文):分层架构 —— 底层能力层(原子操作)→ 策略编排层(生产路径)→ 接入层(CLI/Dashboard)。
**与 DCS 的分层思路一致**,可直接承接。
---
## 三、视频工厂定位:能解决哪几类问题
**三层 × 六线矩阵**:
**A. 共用底座**(所有生产路径共享,应统一管理)
| 层 | 内容 | 现状 |
|:--|:--|:--|
| 资产管理 | 角色(2D 参考图 / 定妆照 / 3D 模型)、场地、产品、道具、BGM、音效、特效预设 | 部分(`characters`/`char-gen`/`assets`/`character_registry`) |
| 能力层 | 语音合成 / 素材搜索 / 图像生成(Kling)/ 图生视频(Kling)/ 人物置换(百炼)/ BGM 生成 | 大部分已有(`main.py` 原子命令 + `character_sheet` + `person_swap`) |
| 合成层 | FFmpeg 拼接 / 变速 / 对口型 / 节拍同步 / 角色锁定 / **去 AI 化**(缺) | 除"去 AI 化"外已有 |
**B. 生产路径**(6 条线,每条是"策略编排")
**C. 编排与任务**(分镜级任务分发、进度、重试、成本)
---
## 四、模块重构方案(菜单分层)
现有 8 项菜单**混了三种性质**(资产 / 生产路径 / 分析),建议按层重组为 **4 组**(二级分类):
```
🎬 视频工厂
├─ 📦 资产管理 ← 共用底座
│ ├─ 🧑 角色库 (characters + char-gen 合并:生成/列表/定妆照)
│ ├─ 🎬 场景与道具 (待建:locations/products/props)
│ ├─ 🖼️ 素材库 (assets,扩展 ave-materials)
│ └─ 🔄 人物置换 (person-swap)
│
├─ 🎞️ 生产路径 ← 6 条线,一条一个入口
│ ├─ 🎬 导演创作 ★ (新建,DCS 主线:故事→分镜→成片)
│ ├─ 🎙️ 口播视频 (run_oral)
│ ├─ 🥁 卡点视频 (run_beat)
│ ├─ 👤 数字人 (run_digital_human)
│ └─ 🎭 模仿换人 (run_hybrid / 第六线)
│
├─ ⚙️ 编排与任务 ← 执行层
│ ├─ 🔀 工作流 (workflow 画布,保留)
│ ├─ 📋 生产记录 (productions)
│ └─ 💰 费用分析 (costs)
│
└─ 🔧 配置
├─ ⚡ 能力目录 (capabilities)
└─ 🎨 模板 (ave-templates → 参数模板,DCS 第八节)
```
**关键判断:新做的"导演创作"应该新建视图,不塞进工作流**
- `workflow` 是**节点画布**(拖拽式编排),适合"流程可视化"
- DCS 的**分镜编辑**是"逐条表格 + 逐条修改 + 逐条重试",表格化交互更适合
- 二者互补:分镜编辑产出 Schema → 可"发送到工作流"做可视化编排(后期联动)
---
## 五、DCS 落地映射(复用 vs 新写)
| DCS 要求 | 项目现状 | 落地动作 |
|:--|:--|:--|
| 统一分镜 Schema(12 pydantic 模型) | 无(`director_parser/schemas.py` 131 行,非此 Schema) | **新写** `09_ave/scripts/schemas.py` |
| 层1 导演系统(故事→Schema) | `story_director/scene_planner`(剧本→场景+Prompt) | **适配**:输出对齐统一 Schema |
| 层0 控制台分镜编辑页 | `ave-script` 空壳 | **新建** `views/ave-director.js`(分镜编辑器) |
| 层2 编排(n8n) | `command_bus` + `guardd` + `workflow` 画布 | **复用** command_bus 派任务(M2 阶段接) |
| 层3 TTS | `main.py voice`(aliyun/volcano) | 复用;DCS 提的 Fish Audio 可选接 |
| 层3 图生视频 | `story_director/batch_generator`(Kling) | 复用(**Kling 余额不足,需充值**) |
| 层3 素材/背景 | `main.py material` | 复用;DCS 提的通义万相可选接 |
| 层4 合成 | `composer/ffmpeg.py` + `speed_ramp` + `lipsync` | 复用 |
| 层4 **去 AI 化链** | **无**(grep `gblur`/`deai` 无命中) | **新写** `composer/de_ai.py`(DCS 第八节 FFmpeg 模板) |
| 资产库规范(characters/locations/products/…) | `character_registry/` 已有角色部分 | **扩展**目录结构对齐 DCS 第五节 |
| 任务状态/重试(`/api/task/*`) | `lib/dashboard.py` 有生产埋点;Dashboard 有任务面板 | 复用 + 补分镜级重试 |
| 特效库(子弹时间/环绕运镜) | 无 | 后期(M4,接 Kling camera_control) |
| 3D 角色(混元3D) | 无 | 后期(M4) |
**环境确认**:
- ✅ **FFmpeg 6.0 已装**(`~/.local/bin/ffmpeg` + `ffprobe`,非 brew 安装)
- ⚠️ **可灵余额不足**(`code:1102`)→ M2 实测前需充值,或先用火山方舟(已配 key)
- ✅ Dashboard `:9988` 运行中;Tailscale 访问已通
---
## 六、M1 实施计划(本期:故事 → 分镜 → 成片)
**目标**:输入一段故事 → 生成可编辑分镜表 → 提交生成 → 输出一条 20 秒成片。**先看效果,再决定后续**。
**M1 范围(4 步)**:
1. **统一分镜 Schema**(`09_ave/scripts/schemas.py`)
- 按 DCS 第四节实现 12 个模型(`Storyboard`/`Shot`/`GlobalAnchors`/`ShotContract`/`VFXConfig`/`AudioConfig`/`Subtitle`/`Transition`/`Speed`/`ColorConfig`/`PostProcess`/`OutputConfig`)
- 提供 `to_dict()` / `from_dict()` 便于 JSON 传输
2. **故事 → 分镜**(后端)
- `routes/` 新增 `ave.py`(或其插件扩展):`POST /api/ave/storyboard/generate`(body: story/content_type/global_anchors)
- 内部调 `story_director.scene_planner.plan_scenes` → 转成统一 Schema
- `POST /api/ave/storyboard/revise`(单镜头重生成,为后期重试预留)
3. **分镜编辑 UI**(`views/ave-director.js`,菜单「🎬 导演创作」)
- 故事输入(textarea)+ 内容类型 + 全局锚点(角色/场地选择)
- 分镜表:逐条显示 `镜号/时长/类型/画面描述/台词/情绪`,可编辑、可删除、可加特效占位
- 「生成分镜」→ 表格;「提交生成」→ 派任务
4. **生成 + 合成**(后端流水线)
- 每镜头按 `type` 调能力(M1 先支持:`action`(Kling 图生视频)/ `background`(素材)/ `talking_head`(预留))
- 去 AI 化链 `composer/de_ai.py`(DCS 第八节 FFmpeg 参数)
- 拼接输出到 `output/<project_id>.mp4`;分镜状态回写(排队/生成中/完成/失败)
**验收标准**:一条 20 秒片子(3~6 个镜头),画面连贯、角色一致(`consistency_seed`)、有去 AI 化处理、能在「成片预览」播放。
---
## 七、后续里程碑(M1 之后,视效果再定)
| 里程碑 | 内容 |
|:--|:--|
| M2 | 资产库规范化(locations/products/props/vfx_presets 目录 + 上传 UI)+ `global_anchors` 全量注入 |
| M3 | 能力层扩展(TTS 多提供商 / 口播 D-ID / 背景通义万相)+ 编排接入 command_bus(并行/重试/停止) |
| M4 | 特效库(Kling camera_control 六参数 + 子弹时间)+ 3D 角色(混元3D) |
| M5 | 批量生产(多故事并行)+ 成本追踪接入(`lib/cost_tracker` 已有) |
| M6 | 按 2.2 节方案重组视频工厂菜单(资产/生产路径/编排/配置 4 组) |
---
## 八、待确认
1. **M1 生成引擎**:可灵余额不足 —— 先充值,还是先用火山方舟(即梦)跑通?
2. **故事输入源**:手写故事 / 粘贴文案 / 也给「AI 从主题生成故事」?
3. **菜单重组时机**:M1 先加一个「🎬 导演创作」入口(不动现有),还是先按第四节的 4 组方案整体重组?
4. **成片时长**:M1 目标时限(20 秒 / 30 秒 / 不限,按分镜数定)?
5. **去 AI 化是否默认开**?DCS 默认参数(模糊 0.4 / 颗粒 12 / 饱和 -0.12 / 色温 5300K)
---
## 九、关键文件索引
**后端(`05_tools/09_ave/scripts/`)**
- `video_factory.py` — 5 种生产模式(`run_story` 在 518-631 行)
- `story_director/scene_planner.py` / `temporal_bridge.py` / `batch_generator.py`
- `composer/ffmpeg.py` / `hybrid.py` / `lipsync.py` / `speed_ramp.py` / `character_locker.py`
- `main.py`(原子能力 CLI)/ `character_sheet.py`(Kling)/ `lib/`(config/cost_tracker/dashboard/logger)
- `AVE_ARCHITECTURE_PLAN.md`(**既有架构规划,6 条生产路径**)
- 待新建:`schemas.py` / `composer/de_ai.py`
**前端(`10_tools/10_dashboard/frontend/src/`)**
- `nav-menu.js`(菜单单点定义)→ 视频工厂分组
- `views/workflow.js`(画布+模板)/ `capabilities.js` / `person-swap.js` / `characters.js` / `char-gen.js`
- 待新建:`views/ave-director.js`(分镜编辑 + 生成)
**集成**
- `10_dashboard/app.py`(把 `09_ave/scripts` 加 sys.path)
- `10_dashboard/plugins/ave.py`(能力目录数据源)/ `10_dashboard/workflows.py`(工作流模板)
**外部参考**
- `~/Documents/导演创作系统(Director.docx`(DCS 说明书,已转文本 `/tmp/director_doc.txt`)
@@ -0,0 +1,23 @@
# 归档:视频工厂旧设计文档(2026-10-01)
这批文档是**视频工厂重构前**的设计稿,内容已被 **`PLANS/VIDEO_FACTORY_MASTER.md`(v2.0 唯一权威版)** 取代。
| 文档 | 归档原因 |
|:--|:--|
| `VIDEO_FACTORY_FRAMEWORK.md` | **菜单分类有误**:把"流程"和"能力"混着平铺;「导演创作」被当成独立板块(实际是一条流程)、「人物置换」被错放进资产(实际也是一条流程)→ 正确结构见 MASTER 第二节 |
| `VIDEO_FACTORY_ARCHITECTURE.md` | 技术细节已并入 MASTER(第六节后端架构、第七节代码映射) |
| `DCS_VIDEO_FACTORY_PLAN.md` | 现状调研 + M1 计划;**M1 已完成**(统一分镜 Schema → 导演适配器 → 端到端出片),计划部分作废 |
## 仍可参考的部分
- M1 的实施记录与实测数据(统一分镜 Schema 14 模型 / 导演适配器 / 可灵引擎 / 去AI化 / 流水线 / 并发与体积优化)
- 现有代码盘点表(哪些是空壳、哪些真能跑)
## 已失效的部分
- **菜单/信息架构**(错把流程与能力平级摆放)
- 阶段划分(S1~S5 → 已重排为 MASTER 的 P1~P7)
## 当前权威文档
**`PLANS/VIDEO_FACTORY_MASTER.md`** —— 三层模型(流程 / 能力 / 资产)+ 前端信息架构 + 流程清单与现状 + 执行审查机制 + 后端架构 + 改造计划 + 待确认项。
@@ -0,0 +1,340 @@
# 视频工厂结构化设计 v1.0
> 创建: 2026-10-01 | 状态: 设计待确认
> 定位: 视频工厂的**整体架构设计**(能力层/节点层/流程层/执行器 + 4 个可替换点)
> 配套: `DCS_VIDEO_FACTORY_PLAN.md`(现状调研 + M1 落地计划)
> 输入: DCS 说明书 v2.0 + 用户口述需求 + 4 个导演系统调研
---
## 一、设计目标(用户原话转译)
> "我用不同的导演系统,最后都出现统一的这种调度;把大家的优点结合起来,怎么嵌入进去"
**五件事要串起来**:
1. **能力节点**(原子能力)—— 一个个小工作能力(TTS / 图生视频 / 换脸 / 对口型…)
2. **流程拼接**(模板)—— 能力节点串成流水线(口播 / 短剧 / 广告…)
3. **节点设置 + 流程设置** —— 每个节点打开有**默认值**,可改成别的(含数据库、大模型)
4. **基础资源库**(资产)—— 角色 / 场景 / 道具 / 产品 / BGM / 音效 / 特效预设,**所有流程共用**
5. **导演选择 + 路径/脚本/分镜设置** —— 导演系统可切换(5.2 为主),统一输出分镜
**三个核心机制**:
- **可插拔**:导演系统、能力供应商、大模型、资产 —— 都能换,换了不改流程
- **统一调度**:无论哪个导演系统、哪个供应商,下游执行完全一样
- **分层配置**:全局默认 → 流程级 → 节点级(逐级覆盖)
---
## 二、总体架构
```
┌─────────────────────────────────────────────────────────────────────┐
│ ① 导演层(可替换)★ 替换点 1 │
│ OpenDirector │ AI Storyboard Director v5.2(默认) │ clip-storyboard │
│ Seedance Director 4.0 │ …(任何导演系统) │
│ ↓ 都输出「统一分镜 Schema」 │
├─────────────────────────────────────────────────────────────────────┤
│ ② 编排层:流程(Template)= 节点 + 连线 │
│ 短剧线 / 口播线 / 卡点线 / 数字人线 / 广告线 / 模仿线 │
│ ↓ 每个节点引用能力 │
├─────────────────────────────────────────────────────────────────────┤
│ ③ 能力层(Capability Registry)★ 替换点 2(供应商)★ 替换点 3(模型) │
│ 音频:TTS / 变声 / BGM / 节拍分析 / 混音 │
│ 视觉:文生图 / 图生视频 / 文生视频 / 换脸 / 对口型 / 运镜 / 特效 │
│ 视频:拼接 / 变速 / 转场 / 字幕 / 去AI化 │
│ 分析:剧本解析 / 分镜规划 / 提示词生成 / 内容审核 │
│ 外部:ComfyUI 工作流(=能力孵化器) │
│ ↓ 每个能力多供应商可选 │
├─────────────────────────────────────────────────────────────────────┤
│ ④ 执行层(统一调度)★ 要补 │
│ 任务派发 → 状态机 → 轮询 → 重试 → 停止 → 产物收集 → 成本记账 │
│ 复用:command_bus / guardd / 任务面板 / lib.cost_tracker │
├─────────────────────────────────────────────────────────────────────┤
│ ⑤ 资产层(共享底座)★ 替换点 4(内容) │
│ 角色 / 场景 / 道具 / 产品 / BGM / 音效 / 特效预设 / 风格 │
│ 被所有流程按 id 引用 │
└─────────────────────────────────────────────────────────────────────┘
```
**统一调度的实现关键**:所有导演系统输出**同一份分镜 Schema** → 编排层/能力层/执行层完全不感知导演是谁。
---
## 三、① 导演层(可替换)
### 3.1 四个候选系统定位
| 系统 | 形态 | 强项 | 弱点 | 在我们的定位 |
|:--|:--|:--|:--|:--|
| **AI Storyboard Director v5.2** | Agent Skill(提示词/方法论) | **分镜质量最高**;先锁视觉概念再拆镜头;两遍交付(设计稿+生产稿) | 不自动出片(要接生成 API) | **默认导演**(分镜/摄影精细打磨) |
| clip-storyboard-director | Agent Skill(本地优先) | **跨场景一致性最强**(4D 持久化缓冲区,"病房→走廊→室外"角色不变) | 配置复杂(维护 persistence_buffer) | **一致性模式**(多场景长片、角色要严格不变时切换) |
| Seedance Director 4.0 | 提示词工程(16 技能) | **模板化最好**(9 层工程文件 + 广告/短剧/生活方式配方) | 需 Claude Code/Cursor 环境 | **批量复用模式**(配方化生产) |
| OpenDirector | Docker 全自动流水线(9 Agent) | **全自动程度最高**(研究→剧本→分镜→配音→成片),34 风格模板 | 叙事精细控制弱(适合粗剪) | **快速验证模式**("一句话→成片"粗剪) |
### 3.2 接入规范(适配器模式)
```python
# 09_ave/scripts/directors/base.py
class BaseDirector:
id: str # "storyboard_v52" / "clip_storyboard" / "seedance_4" / "open_director"
name: str
capabilities: list # ["storyboard", "visual_concept", "consistency", "auto_pipeline"]
def generate(self, story: str, anchors: GlobalAnchors, options: dict) -> Storyboard:
"""任何导演系统 → 统一分镜 Schema(Storyboard)"""
```
- **Skill 型**(v5.2 / clip / Seedance):把技能文档作为**提示词注入**,调 LLM 产出分镜 → 适配器转 Schema
- **Service 型**(OpenDirector):调它的 HTTP 服务拿结果 → 适配器转 Schema
- **切换方式**:控制台下拉选导演 + 每个导演独立的选项面板(如 clip 的 persistence 开关、Seedance 的配方选择)
### 3.3 视觉概念锁定(v5.2 的"两遍交付")
```
第一遍:设计稿 —— 锁定视觉概念(风格/色调/材质/构图语言),供导演确认
第二遍:生产稿 —— 按确认的概念拆镜头,输出可执行分镜
```
→ 我们的 UI:分镜页分**两个 Tab**(设计稿 / 生产稿),设计稿确认后才生成生产稿。
---
## 四、③ 能力层(Capability Registry)★ 用户最想要的"基础能力整理"
### 4.1 能力定义结构
```yaml
# 09_ave/config/capabilities.yaml
capabilities:
- id: tts_generate
name: 语音合成
category: audio # audio | visual | video | analysis | external
description: 文本 → 语音音频
input: { text: string, emotion: string?, speed: float? }
output: { audio_path: string, duration: float }
params_schema: # 参数定义(用于生成 UI 表单)
emotion: { type: enum, options: [normal, happy, sad, angry], default: normal }
speed: { type: number, min: 0.5, max: 2.0, default: 1.0 }
providers: # ★ 多供应商
- { id: volcano, name: 火山语音, api_key_ref: volcano.voice_app_key, default: true }
- { id: aliyun, name: 阿里语音, api_key_ref: aliyun.api_key }
- { id: fish_audio,name: Fish Audio, api_key_ref: fish_audio.api_key }
defaults: { provider: volcano, emotion: normal, speed: 1.0 }
```
### 4.2 四类能力来源
| 来源 | 说明 | 现有资产 |
|:--|:--|:--|
| **原子能力** | 后端已实现的固定能力 | `09_ave/scripts/01~06` + `main.py` CLI(voice/material/parse/compose/anchors…) |
| **外部 API** | 第三方服务(多供应商) | 可灵 / 火山方舟(即梦) / 百炼(人物置换) / 阿里 TTS / Pexels |
| **ComfyUI 工作流** | **能力孵化器**:一个工作流 = 一个新能力 | RunningHub(待接入)→ 可长出面部件表情控制、风格渲染等 |
| **技能包** | 提示词型能力(导演/编剧/审核) | `ai-film-skills` 21 模块(待下载) |
### 4.3 能力盘点(从现有资产映射)
| 类别 | 已有能力 | 来源 |
|:--|:--|:--|
| 音频 | TTS 合成(火山/阿里)、BGM 生成、节拍分析、混音 | `02_voice_synthesizer` / `03_bgm_generator` / `main.py voice` |
| 视觉 | 文生图(Kling)、图生视频(Kling)、人物置换(百炼)、定妆照 | `character_sheet.py` / `person_swap/` |
| 视频 | 拼接、变速、转场、对口型、节拍同步、角色锁定 | `composer/`(ffmpeg/hybrid/speed_ramp/lipsync/character_locker/beat_sync) |
| 分析 | 文案解析、分镜规划、锚点提取、素材搜索 | `01_director_parser` / `story_director` / `04_anchor_extractor` / `main.py material` |
| **缺** | **去 AI 化**、字幕生成增强、ComfyUI、面部微表情 | 待建 / 待接 |
### 4.4 与大模型的关系
**能力 ≠ 模型**,但很多能力**背后是模型**:
- TTS 能力 → 背后可选火山/阿里模型
- 分镜能力 → 背后可选 DeepSeek / 其他 LLM
- 图生视频 → 可灵 / 即梦 / 其他
→ 所以能力定义里既列 **providers**(服务商),也在 providers 里带 **model** 字段 → 与现有「🔑 API 配置」页打通(4.6.0 已做密钥管理)。
---
## 五、② 编排层:节点与流程
### 5.1 节点模型
```yaml
node:
id: n3
type: capability # capability(能力节点)| control(控制节点)
capability_id: tts_generate # 引用能力
provider: volcano # 覆盖默认供应商
model: null # 覆盖默认模型(null=用能力默认)
params: # 覆盖能力默认参数(只写要改的)
emotion: warm
inputs: { text: "{{n1.script}}" } # 上游节点输出引用
outputs: { audio_path: "var.audio" }
ui: { x: 300, y: 160, collapsed: false }
```
**两种节点**:
- **能力节点**:引用一个能力(占 15 种节点类型的大部分)
- **控制节点**:`audit_gate`(人工审核门)、分支、循环(现有 `audit_gate` 已有)
### 5.2 流程模板(Template)
现有 6 个 + 建议补充:
| 模板 | 线 | 现状 |
|:--|:--|:--|
| `basic_dub` 基础口播 | 口播线 | ✅ 已有(5 节点) |
| `beat_sync` 卡点视频 | 卡点线 | ✅ 已有(4 节点) |
| `character_narrative` 角色叙事 | 故事线 | ✅ 已有(8 节点) |
| `digital_human` 数字人口播 | 数字人线 | ✅ 已有(4 节点) |
| `hybrid_dub` 口播+卡点 | 混合线 | ✅ 已有(4 节点) |
| `short_drama` 短剧创作 | 故事线 | ✅ 已有(12 节点) |
| **`director_cut` 导演精剪**(建议新增) | DCS 主线 | 🆕 分镜编辑 + 逐镜头重试 + 去AI化 |
### 5.3 配置继承链(用户说的"默认值 + 可改")
```
全局默认(capability.defaults)
↓ 被覆盖
流程级(template.node_defaults) ← 这个流程普遍要改的
↓ 被覆盖
节点级(node.params) ← 这一次执行的
↓ 被覆盖
运行时输入(用户当场填) ← 内容/临时调整
```
**UI 呈现**:节点配置面板里每个字段显示"**当前值 + 来源标记**"(默认/流程/节点/临时),改了就在当前层生效,并提供"恢复默认"。
---
## 六、④ 执行层(统一调度)★ 要补
### 6.1 现状问题
`workflows.py:519-530` 的 `WorkflowRunner._execute()` **只做拓扑排序然后标记 completed**,不真跑。
真正能出片的是 `video_factory.py`(CLI),**两者未打通**。
### 6.2 补齐方案
```python
# 执行器职责
1. 拓扑排序(已有)
2. 逐节点执行:按 node.capability_id 查能力注册表 → 取 provider → 调实现
3. 状态机:pending → running → succeeded / failed / skipped
4. 产物收集:每节点输出存入 run context(供下游 {n1.xxx} 引用)
5. 失败重试:节点级重试次数 + 指数退避(复用 lib/retry 思路)
6. 停止:支持中断运行中的流程
7. 成本记账:调 lib.cost_tracker 记录每次调用花费
8. 进度上报:写 run 状态 → 前端轮询展示(复用现有 /api/workflow/runs/{id})
```
**执行通道选项**:
- **本地线程**(现有 `WorkflowRunner` 骨架 + threading)—— 适合轻量任务(解析/规划/合成)
- **command_bus 派发**(现有养号体系)—— 适合长任务(Kling 生成、ComfyUI 渲染),有任务面板/重试/停止
- **建议**:能力定义里带 `execution: local | remote` 字段,执行器按此选择通道
---
## 七、⑤ 资产层(共享底座)
### 7.1 目录结构(对齐 DCS 第五节 + 复用现有)
```
agent-local/tools/ave/assets/ ← 运行时资产(不进 git)
├── characters/ 角色 2D 参考图 + 定妆照 + voice_sample ✅ character_registry 已有
├── characters_3d/ 3D 模型(混元3D,后期)
├── locations/ 场景(AI 生成)
├── real_locations/ 真实场地参考(多角度图 + 视频)
├── products/ 产品资产(多角度 + must_keep 清单)
├── props/ 道具
├── bgm/ sfx/ BGM / 音效
└── vfx_presets/ 特效预设(bullet_time.yaml 等)
```
### 7.2 引用方式
分镜 Schema 里按 **id** 引用(`character_id` / `location_id` / `product_id` / `props[]` / `bgm_id` / `vfx.vfx_id`),执行器按 id 去资产库取文件路径注入 API 请求。
---
## 八、④/⑤ 之外的横切:大模型与供应商管理
| 项 | 现状 | 落地 |
|:--|:--|:--|
| 密钥管理 | ✅ 「🔑 API 配置」页(脱敏 + 测试 + 版本回滚) | 能力注册表的 `api_key_ref` 指向它 |
| 供应商切换 | 🟡 分散在代码 | 能力定义里 providers 列表 + UI 下拉 |
| 模型切换 | 🟡 仅 AI 文本(DeepSeek) | 扩展到 TTS/图像/视频模型 |
| 效果对比 | ❌ | **建议**:每次执行记录所用 provider/model 组合 → 后续可按"效果好的组合"复用 |
---
## 九、UI 结构(菜单重组)
```
🎬 视频工厂
├─ 📦 资产管理 ← 共享底座
│ 🧑 角色库(生成/列表/定妆照/音色)· 🎬 场景库 · 🧊 产品道具 · 🖼️ 素材库 · 🔄 人物置换
│
├─ 🎞️ 创作(生产路径) ← 一条线一个入口
│ 🎬 导演创作★(故事→分镜→成片,默认)· 🎙️ 口播 · 🥁 卡点 · 👤 数字人 · 🎭 模仿换人
│
├─ ⚙️ 编排 ← 能力与流程
│ 🔀 工作流(画布 + 真执行)· 🧩 能力库(注册表 + 供应商/参数默认值)· 🎨 流程模板 · 📋 生产记录 · 💰 费用
│
└─ 🔧 配置
⚡ 能力目录(只读总览)· 🤖 模型与供应商 · 🎯 导演系统 · 🔑 API 配置
```
**每个节点打开后的配置面板**(用户核心诉求):
```
┌─ 节点:语音合成 ────────────────────┐
│ 供应商 [火山语音 ▾](默认) │ ← 可换:火山/阿里/Fish
│ 模型 [CosyVoice ▾](默认) │ ← 可换
│ 情绪 [normal ▾](流程覆盖) │ ← 显示来源
│ 语速 [1.0](默认) │
│ ────────────────────────────── │
│ 输入 text ← {{n1.script}} │
│ 输出 audio_path → var.audio │
│ [测试此节点] [恢复默认] [保存] │
└─────────────────────────────────────┘
```
---
## 十、实施路线
| 阶段 | 内容 | 交付 |
|:--|:--|:--|
| **S1|能力注册表** | `capabilities.yaml` + 后端加载器 + 「🧩 能力库」页(列表 + 供应商/参数默认值编辑) | 看得见"我有哪些能力" |
| **S2|M1 导演创作** | 统一分镜 Schema + 导演适配器(先接 v5.2)+ 分镜编辑页 + 调真实流水线出片 | **一条 20 秒成片** |
| **S3|执行器补齐** | `WorkflowRunner` 真执行(能力注册表驱动)+ 节点配置面板(默认/覆盖)+ 状态/重试/停止 | 工作流"通电" |
| **S4|资产库扩展** | locations / products / props / vfx_presets + 上传 UI + `global_anchors` 全量注入 | 一致性保障 |
| **S5|能力扩展** | ComfyUI(RunningHub) 接入 + 更替导演系统(clip/Seedance 可切)+ 效果对比记录 | 能力孵化 |
---
## 十一、现有资产映射(复用 / 改造 / 新建)
| 现有资产 | 处置 |
|:--|:--|
| `09_ave/scripts/01~06`、`main.py` CLI | **复用**为能力层实现(包一层能力接口) |
| `composer/`(ffmpeg/hybrid/lipsync/speed_ramp/beat_sync/character_locker) | **复用**为视频类能力 |
| `video_factory.py`(run_oral/beat/story/…) | **改造**:拆成能力 + 保留为"快速命令"入口 |
| `story_director/`(scene_planner/temporal_bridge/batch_generator) | **改造**为"导演适配器"之一(与 v5.2 并列可选) |
| `workflows.py`(6 模板 + 15 节点定义) | **复用**:节点定义 → 对齐能力注册表;**补执行器** |
| `app.py` + `plugins/ave.py` + `/api/capabilities` | **复用**:能力目录数据源从"解析 Markdown"改为读能力注册表 |
| `person_swap/` / `character_sheet.py` | **复用**为能力(换脸 / 文生图) |
| `lib/cost_tracker.py` | **复用**为执行层记账 |
| `character_registry/` | **扩展**为完整资产库 |
| **能力注册表**(`config/capabilities.yaml` + 加载器) | 🆕 **新建(S1)** |
| **导演适配器**(`directors/base.py` + 各实现) | 🆕 **新建(S2)** |
| **去 AI 化**(`composer/de_ai.py`) | 🆕 **新建(S2)** |
| **分镜编辑 UI**(`views/ave-director.js`) | 🆕 **新建(S2)** |
| `ai-film-skills` 21 模块 | 🆕 **下载并入**(建议 `05_tools/09_ave/skills/`) |
---
## 十二、待确认
1. **S1 先做还是 S2 先做?**(我建议 S1 能力注册表 —— 它是后面所有事的底座,半天出初版)
2. **`ai-film-skills` 是否下载入库**?(Apache-2.0,含 v5.2 分镜技能 + 人物/场景/道具资产规范)
3. **去 AI 化默认开吗**?(DCS 参数:模糊 0.4 / 颗粒 12 / 饱和 -0.12 / 色温 5300K)
4. **执行通道偏好**:轻任务本地线程 + 长任务走 command_bus/guardd —— 认可?
5. **菜单重组时机**:S1/S2 期间只加必要入口,S3 时按第九节整体重组 —— 还是尽早重组?
@@ -0,0 +1,530 @@
# 视频工厂框架说明书 v1.0
> 创建: 2026-10-01 | 状态: **框架对齐中(待你确认后冻结)**
> 定位: 视频工厂的**纲领文档** —— 模块边界、五张地图、解耦规范、代码组织、实施路径、扩展速查
> 配套: `DCS_VIDEO_FACTORY_PLAN.md`(现状调研 + M1 落地细节)
> 输入: DCS 说明书 v2.0 + 用户口述需求 + 4 个导演系统调研
---
## 〇、一句话定位
> **视频工厂是一个「调用层 + 编排层」—— 大模型能力全部解耦在远端,我们只负责:选(哪家能力)、调(带什么参数)、串(流程怎么走)、管(资产/产物/成本)。**
**明确边界**(避免越做越乱):
| 是 ✅ | 不是 ❌ |
|:--|:--|
| 能力调用层(封装远端 API,多供应商可选) | 模型训练 / 推理(全部远端) |
| 流程编排层(能力串成流水线) | 渲染农场(FFmpeg 本地轻量处理) |
| 资产管理层(角色/场景/产品/道具/音效) | 素材库平台(只做引用与索引) |
| 产物与成本管理层 | 剪辑软件(不做精细时间线编辑) |
**与养号模块的关系**:**并列**。共用 Dashboard、账号体系、任务面板、API 配置页;互不侵入。
---
## 一、五张地图
### 地图 1|架构图(5 层 + 4 替换点)
```
┌──────────────────────────────────────────────────────────────────────────┐
│ L5 接入层(Dashboard 前端) │
│ 🎬导演创作 · 🔀工作流 · 🧩能力库 · 📦资产库 · 🎯导演系统 · 🤖模型供应商 │
└────────────────────────────────┬─────────────────────────────────────────┘
↓ HTTP (FastAPI :9988)
┌──────────────────────────────────────────────────────────────────────────┐
│ L4 编排层(后端) │
│ · 流程执行器(拓扑排序 → 逐节点执行 → 状态机 → 重试/停止) │
│ · 节点配置解析(默认 ← 流程 ← 节点 ← 运行时 四级继承) │
│ · 分镜编辑器后端(统一 Schema 读写) │
└────────────────────────────────┬─────────────────────────────────────────┘
↓ 按 capability_id 查注册表
┌──────────────────────────────────────────────────────────────────────────┐
│ L3 能力层(Capability Registry)★替换点②供应商 ★替换点③模型 │
│ 音频: TTS/BGM/节拍/混音 视觉: 文生图/图生视频/换脸/对口型/运镜 │
│ 视频: 拼接/变速/转场/字幕/去AI化 分析: 解析/分镜/提示词/审核 │
│ 外部: ComfyUI 工作流(孵化器) │
│ 每个能力: input/output/params_schema/providers[]/defaults/execution │
└────────────────────────────────┬─────────────────────────────────────────┘
↓ 本地线程 或 command_bus 派发
┌──────────────────────────────────────────────────────────────────────────┐
│ L2 执行层(统一调度) │
│ 本地任务(解析/规划/合成)· 远程任务(生成类,走 guardd) │
│ 状态机 / 轮询 / 重试 / 停止 / 产物收集 / 成本记账 │
└────────────────────────────────┬─────────────────────────────────────────┘
↓ 按 id 取资产
┌──────────────────────────────────────────────────────────────────────────┐
│ L1 资产层(共享底座)★替换点④内容 │
│ 角色(含3D) · 场景 · 产品 · 道具 · BGM · 音效 · 特效预设 · 风格 │
└──────────────────────────────────────────────────────────────────────────┘
★替换点①导演:AI Storyboard Director v5.2(默认) | clip-storyboard | Seedance 4.0 | OpenDirector
全部输出同一份「统一分镜 Schema」
```
### 地图 2|能力地图(现有 + 规划)
| 类别 | 能力 | 供应商(可选) | 现状 |
|:--|:--|:--|:--|
| **音频** | TTS 语音合成 | 火山语音 ✅ / 阿里语音 ✅ / Fish Audio(待) / ElevenLabs(待) | 已有 |
| | BGM 生成 | ACE-Step / MusicGen / Suno | 已有(`03_bgm_generator`) |
| | 节拍分析 | 本地 librosa 类 | 已有(`beat_sync`) |
| | 混音 / 变速 | 本地 FFmpeg | 已有(`composer`) |
| **视觉** | 文生图(定妆照/概念图) | 可灵 v1 ✅ / 火山即梦 ✅ | 已有(`character_sheet`) |
| | 图生视频 | 可灵 ✅(余额不足) / 火山即梦 ✅ | 已有(`batch_generator`) |
| | 文生视频 | 可灵 / 通义万相(待) / Sora(待) | 部分 |
| | 人物置换(换脸) | 阿里百炼 wan2.2-animate-mix ✅(欠费) | 已有(`person_swap`) |
| | 对口型(数字人) | 火山 OmniHuman / D-ID(待) / HeyGen(待) | 已有 |
| | 运镜控制 | 可灵 camera_control(6 参数) | 待接 |
| | 特效(子弹时间等) | 万兴天幕(待) / 海螺AI(待) / ComfyUI | 待接 |
| | **面部微表情** | ComfyUI 工作流 | 待接 |
| **视频** | 拼接 / 转场 | 本地 FFmpeg | 已有(`composer/ffmpeg`) |
| | 变速 / 速度斜坡 | 本地 | 已有(`speed_ramp`) |
| | 字幕 | 本地(SRT/ASS) | 部分 |
| | **去 AI 化** | 本地 FFmpeg 链 | 🆕 待建 |
| | 3D 角色 | 混元3D(待) | 待接 |
| **分析** | 文案解析 | LLM(DeepSeek ✅) | 已有(`01_director_parser`) |
| | 分镜规划 | **导演系统**(见替换点①) | 已有(`scene_planner`)+ 待接 v5.2 |
| | 提示词生成 | LLM / 导演技能 | 已有 |
| | 内容审核 | LLM / 人工门 | 部分(`audit_gate`) |
| **外部** | ComfyUI 工作流 | RunningHub(待) / ComfyDeploy(待) / 自建 | 🆕 待接 |
### 地图 3|菜单地图
**当前已落地(4.8.1 重组后)**:
```
📦 🎬 视频·资产 ← 共享底座
🧑 角色库(characters)· 🎭 角色生成器(char-gen)· 🖼️ 素材库(assets)· 🔄 人物置换(person-swap)
⚙️ 🎬 视频·编排 ← 能力与流程
🔀 工作流(workflow)· 🧩 能力库(ave-capabilities,可编辑注册表)
📋 生产记录(productions)· 💰 费用分析(costs)
🔧 🎬 视频·配置
⚡ 能力总览(capabilities,只读;与「能力库」互补)
🎬 视频·创作 ← 待 S2 建立页面后加入
🎬 导演创作★(ave-director)· 🎙️ 口播 · 🥁 卡点 · 👤 数字人 · 🎭 模仿换人
```
**目标形态(框架规划,S2~S4 逐步补齐)**:
```
🎬 视频工厂
├─ 📦 资产管理 🧑 角色库 · 🎬 场景库 · 🧊 产品道具 · 🖼️ 素材库 · 🔄 人物置换
├─ 🎞️ 创作 🎬 导演创作★ · 🎙️ 口播 · 🥁 卡点 · 👤 数字人 · 🎭 模仿换人
├─ ⚙️ 编排 🔀 工作流 · 🧩 能力库 · 🎨 流程模板 · 📋 生产记录 · 💰 费用
└─ 🔧 配置 ⚡ 能力总览 · 🤖 模型与供应商 · 🎯 导演系统 · 🔑 API 配置
```
### 地图 4|端到端流程图(导演创作主线)
```
【1. 起意】
选导演系统(M) ── 5.2默认 / clip一致性 / Seedance配方 / OpenDirector全自动
写故事 ─────── 手写 or 粘贴 or(AI 从主题生成)
选资产 ─────── 角色(必) / 场景 / 产品 / 风格
设全局锚点 ──── consistency_seed / shooting_style / 光照/镜头语言
↓
【2. 分镜(导演干活)】
① 设计稿:锁视觉概念(风格/色调/材质/构图)→ 人工确认 ★v5.2 两遍交付
② 生产稿:按概念拆镜头 → 统一分镜 Schema(每镜头:景别/机位/运镜/时长/画面/台词/情绪)
↓
【3. 分镜编辑(人工把关)】
逐条看 → 改画面描述/台词/时长 → 删镜头/加镜头 → 加特效(占位) → 单镜头重生成
↓
【4. 逐镜头执行(能力层)】
每镜头按 type 选能力:
action → 图生视频(可灵/即梦)
talking_head → 口播(火山/D-ID)
background → 素材/背景生成(通义万相/素材库)
vfx → 特效(可灵运镜/万兴/ComfyUI)
3d_character → 3D 角色(混元3D)
每镜头可调:供应商 / 模型 / 参数(覆盖默认)
↓
【5. 合成(本地)】
配音(TTS) → 去AI化(模糊/颗粒/调色) → 拼接 → BGM → 字幕 → 成片 mp4
↓
【6. 验收与迭代】
预览成片 → 不满意 → 回到【3】改对应镜头 → 单条重试(不必整片重跑)
满意 → 生产记录归档 + 成本入账
```
### 地图 5|数据流(统一 Schema 是中枢)
```
导演系统 ──出──→ ┌──────────────────┐ ──读──→ 分镜编辑器 UI
│ 统一分镜 Schema │
资产库 ──id引用─→ │ Storyboard │ ──读──→ 执行器(逐镜头派任务)
│ ├ GlobalAnchors│
│ └ Shot[] │ ──写──→ 执行状态(每镜头)
└──────────────────┘ ──写──→ 产物路径 + 成本记录
```
**Schema 的三大作用**:① 导演系统的"普通话"(谁都能读)② 前端编辑对象 ③ 执行器的输入契约。
---
## 二、解耦机制(4 个扩展点 + 契约)
### 扩展点①:导演系统(新增一个导演 = 实现一个类)
```python
# 09_ave/scripts/directors/base.py
class BaseDirector:
id: str # "storyboard_v52"
name: str # "AI Storyboard Director v5.2"
kind: str # "skill" | "service"
features: list # ["visual_concept", "two_pass", "consistency"]
options_schema: dict # 该导演的专属选项(自动生成 UI 表单)
def generate(self, story, anchors, options) -> Storyboard:
"""输出统一分镜 Schema —— 这是唯一的契约"""
# 注册(directors/__init__.py)
DIRECTORS = {d.id: d for d in [StoryboardV52(), ClipStoryboard(), Seedance4(), OpenDirector()]}
```
**接入一个新导演系统,只需 3 步**:
1. 在 `directors/` 加一个文件,实现 `BaseDirector`
2. 在 `directors/__init__.py` 注册
3. (如需要)加它的选项面板 schema
→ 前端下拉自动出现,下游全不用改。
### 扩展点②:能力供应商(一个能力接多家)
```yaml
# 09_ave/config/capabilities.yaml
- id: image_to_video
name: 图生视频
category: visual
input: { image: file, prompt: string, duration: number }
output: { video_path: string }
params_schema:
duration: { type: number, min: 3, max: 10, default: 5 }
providers:
- { id: kling, name: 可灵, api_key_ref: kling.api_key, model: kling-v1, default: true }
- { id: jimeng, name: 即梦, api_key_ref: volcano.ark_api_key, model: seedance }
defaults: { provider: kling }
execution: remote # local | remote(决定走本地线程还是 guardd)
impl: providers.visual.kling_i2v # 实现类路径
```
### 扩展点③:模型(能力背后的 LLM/模型)
- providers 里带 `model` 字段 → UI 可切
- LLM 类能力(解析/分镜/提示词)也走同一机制:providers = DeepSeek / 其他
- 与「🔑 API 配置」页打通(`api_key_ref` 指向已有密钥管理)
### 扩展点④:资产(内容可换)
- 所有流程按 **id** 引用资产(`character_id` / `location_id` / `product_id` / `bgm_id` / `vfx.vfx_id`)
- 新增一类资产 = 加目录 + 加 meta.json 规范 + (可选)加管理 UI
### 配置继承链(四级覆盖)
```
① 能力默认值(capabilities.yaml → defaults)
↓ 被覆盖
② 流程级(template.node_defaults)
↓ 被覆盖
③ 节点级(node.params)
↓ 被覆盖
④ 运行时(用户当场填)
```
UI 每个字段标注**来源**(默认/流程/节点/临时),并支持"恢复默认"。
---
## 三、代码组织规范
### 后端目录(`05_tools/09_ave/`)
```
scripts/
├── capabilities/ 🆕 能力层实现(每个能力一个文件,实现统一接口)
│ ├── base.py 能力基类(input/output/params/providers)+ 注册表加载器
│ ├── audio/ tts.py / bgm.py / beat.py / mix.py
│ ├── visual/ t2i.py / i2v.py / swap_face.py / lipsync.py
│ ├── video/ concat.py / speed.py / subtitle.py / de_ai.py ← de_ai 新建
│ ├── analysis/ script_parse.py / storyboard.py / prompt_gen.py / review.py
│ └── external/ comfyui.py(RunningHub)
├── directors/ 🆕 导演层(替换点①)
│ ├── base.py
│ ├── storyboard_v52.py (默认,接 ai-film-skills 的 v5.2 技能)
│ ├── clip_storyboard.py / seedance_4.py / open_director.py
│ └── legacy_scene_planner.py (现有 story_director 包装为适配器)
├── schemas.py 🆕 统一分镜 Schema(12 模型)
├── executor/ 🆕 编排执行器
│ ├── engine.py 拓扑排序 + 逐节点执行 + 状态机
│ ├── config_resolver.py 四级配置继承解析
│ └── task_runner.py local/remote 双通道(remote 走 command_bus)
├── assets/ 🆕 资产管理(loader/validator/registry)
├── composer/ ✅ 已有(ffmpeg/hybrid/lipsync/speed_ramp/beat_sync/character_locker)
├── story_director/ ✅ 已有(作为 legacy 导演,保留)
├── lib/ ✅ 已有(config/cost_tracker/dashboard/logger)
├── skills/ 🆕 ai-film-skills 21 模块(导演/资产/摄影方法论)
├── config/
│ ├── capabilities.yaml 🆕 能力注册表(唯一的"能力真相源")
│ ├── directors.yaml 🆕 导演注册配置
│ └── providers.yaml 🆕 供应商/模型配置(密钥引用 API 配置页)
└── main.py ✅ 已有(CLI 原子命令,保留为调试入口)
```
### 前端目录(`05_tools/10_dashboard/frontend/src/`)
```
views/
├── ave-director.js 🆕 导演创作(分镜编辑,M1 主入口)
├── ave-capabilities.js 🆕 能力库(注册表管理 + 供应商/参数默认值)
├── ave-assets-*.js 🆕 场景库 / 产品道具
├── workflow.js ✅ 已有(画布,补执行器)
├── capabilities.js ✅ 已有(只读总览)
├── char-gen.js / characters.js / person-swap.js / productions.js / assets.js / costs.js ✅ 已有
├── ave-script.js / ave-materials.js / ave-render.js / ave-templates.js ⚪ 空壳(择机激活或删除)
nav-menu.js ✅ 菜单单点定义(按地图 3 重组时只改这里)
```
### 接口约定
| 层 | 约定 |
|:--|:--|
| 能力接口 | `generate(inputs, params, provider) -> {status, output, cost, error}`(对齐 DCS 统一返回) |
| 导演接口 | `generate(story, anchors, options) -> Storyboard` |
| 执行器 | `run(template_id, node_overrides) -> run_id`;`get_run(run_id) -> {status, node_states, artifacts}` |
| API 路由 | 前端统一 `/api/ave/*`(新建 `routes/ave.py` 或扩插件),不散落 |
---
## 四、实施路径(5 阶段,每阶段可独立验收)
| 阶段 | 改什么 | 加什么 | 验收 |
|:--|:--|:--|:--|
| **S1 能力注册表** | `plugins/ave.py`(数据源改读注册表);`/api/capabilities` | `config/capabilities.yaml` + `capabilities/base.py` 加载器 + `views/ave-capabilities.js` | 「🧩 能力库」页能看到全部能力 + 改供应商/参数默认值并保存 |
| **S2 导演创作(M1)** | 现有流水线包能力接口 | `schemas.py` + `directors/`(v5.2 适配器)+ `routes/ave.py` + `views/ave-director.js` + `composer/de_ai.py` | **一条 20 秒成片**:故事→分镜表(可编辑)→生成→去AI化→拼接→预览 |
| **S3 执行器补齐** | `workflows.py` 的 `WorkflowRunner`(真执行) | `executor/engine.py` + `config_resolver.py` + 节点配置面板(前端) | 工作流"通电":6 模板能真跑;节点可改供应商/模型;失败可重试 |
| **S4 资产库扩展** | `character_registry` 扩展 | 场景/产品/道具/特效预设目录 + 上传 UI + `global_anchors` 全量注入 | 多镜头角色/场景一致;资产按 id 引用生效 |
| **S5 能力扩展** | — | `capabilities/external/comfyui.py`(RunningHub)+ 其他导演系统实装 + 效果对比记录 | 新能力可"加文件即接入";导演可切换对比 |
**S1 优先的理由**:它是"能力真相源",S2/S3 都依赖它;且半天可出初版,让你先看清家底。
---
## 五、扩展点速查("以后怎么加东西")
| 我要做的事 | 改哪里 | 步骤 |
|:--|:--|:--|
| **加一个新能力**(如"面部微表情") | `config/capabilities.yaml` + `capabilities/<类目>/xxx.py` | ① 写实现类(实现能力接口)② yaml 加一条(input/output/params/providers)③ 重启,UI 自动出现 |
| **给已有能力加供应商** | `config/capabilities.yaml` | providers 加一条(id/name/api_key_ref/model);密钥在「🔑 API 配置」页填 |
| **换默认模型** | `config/capabilities.yaml` 或「🧩 能力库」页 | 改 `defaults.model` / UI 里改 |
| **接一个新导演系统** | `directors/xxx.py` + `__init__.py` 注册 | ① 实现 `BaseDirector.generate() → Storyboard` ② 注册 ③ (可选)加选项 schema |
| **加一个新流程模板** | `workflows.py` 的 `WORKFLOW_TEMPLATES` | 加一条(nodes + edges),复用现有 15 种节点类型 |
| **接入一个新开源项目** | 见下方"接入清单" | — |
| **加一类新资产** | `assets/` 目录 + meta 规范 + (可选)UI | 目录 + meta.json + loader 注册 |
| **改菜单** | `frontend/src/nav-menu.js` | **单点定义**,只改这一个文件(4.6.4 已单点化) |
### 接入一个新开源项目的清单(通用)
```
□ 1. 判定类型:导演型 / 能力型 / 全流程型(OpenDirector)/ 资产规范型
□ 2. 判定形态:Skill(提示词包)→ 放 skills/ | Service(HTTP)→ 写 provider | 代码库 → 抽能力
□ 3. 查许可:Apache/MIT 可直接并入;GPL 谨慎;商业需授权
□ 4. 找契约点:它输出什么?→ 对应我们的哪个扩展点(导演/能力/资产)
□ 5. 写适配器:把它的输出转成统一 Schema 或能力返回值
□ 6. 注册 + 配置(yaml 一条)+ UI 下拉出现
□ 7. 记录来源与版本(便于后续升级)
```
**示例**:接入 v5.2(Skill 型导演)→ 放 `skills/ai-film-skills/`,写 `directors/storyboard_v52.py` 把技能文档作为提示词注入,输出转 `Storyboard`,注册 → UI 下拉出现。
---
## 六、当前状态与差距
| 层 | 现状 | 差距 |
|:--|:--|:--|
| L5 接入层 | 8 视图(4 空壳);菜单 8 项混三种性质 | 缺导演创作/能力库页;菜单待按地图 3 重组 |
| L4 编排层 | 6 模板 + 15 节点定义齐 | ❌ **执行器空转**(只拓扑排序不真跑);❌ 无节点配置面板;❌ 无分镜编辑 |
| L3 能力层 | 原子能力齐(01-06 + CLI + composer 2635 行) | ❌ 无统一注册表(供应商/参数 schema);❌ 缺去AI化 |
| L2 执行层 | guardd/command_bus 体系成熟(养号在用) | 🟡 未与视频工厂任务打通 |
| L1 资产层 | 仅有角色(character_registry + 定妆照) | ❌ 场景/产品/道具/特效预设 全缺 |
| 统一 Schema | ❌ 无 | 🆕 待建(S2) |
| 导演可切换 | 仅 `story_director/scene_planner` 一套 | 🆕 适配器框架 + v5.2 待接(S2) |
---
## 七、框架确认清单(请你逐条确认/修改)
| # | 框架要点 | 确认 |
|:--|:--|:--|
| 1 | 定位:**调用层 + 编排层**(模型全远端,不做训练/推理) | ☐ |
| 2 | 5 层架构 + **4 个替换点**(导演/供应商/模型/资产) | ☐ |
| 3 | 统一分镜 Schema 作中枢(所有导演系统输出它) | ☐ |
| 4 | 四级配置继承(能力默认→流程→节点→运行时) | ☐ |
| 5 | 菜单 4 组:资产管理 / 创作 / 编排 / 配置 | ☐ |
| 6 | 能力注册表(`capabilities.yaml`)为"能力真相源" | ☐ |
| 7 | 执行双通道:轻任务本地线程 / 长任务 guardd | ☐ |
| 8 | 代码组织:`capabilities/` `directors/` `executor/` `assets/` 四个新目录 | ☐ |
| 9 | 实施顺序 S1→S5(S1 能力注册表优先) | ☐ |
| 10 | 扩展点速查(加能力/供应商/导演/模板/开源项目)为标准流程 | ☐ |
**确认后冻结框架**,后续所有开发按此对齐;如需变更,改本文档 + 记 CHANGELOG。
---
## 附录 A|现有代码在框架中的位置(2026-10-01 实测盘点)
> 目的:看清"家底"在框架里的位置。✅ 已就位 | 🟡 需改造 | 🆕 待建
### A.1 后端资产(`05_tools/09_ave/`,约 19,000 行)
**L1 资产层(替换点④)**
| 现有资产 | 行数 | 框架位置 |
|:--|:--|:--|
| `character_registry/` | 318 | ✅ 角色注册表(资产库·角色) |
| `character_generator/` | 2296 | ✅ 角色生成能力 |
| `character_sheet.py` | 841 | ✅ 定妆照/角色图(文生图能力) |
| `character_portrait.py` | 790 | ✅ 角色画像 |
| `character_adapter/` | 397 | ✅ 角色适配(跨模块统一) |
| `asset_manager/`(cache/index/tags) | 1167 | 🟡 资产索引 → 扩展为完整资产库 |
| `lib/ghvideo_upload.py` | — | ✅ 产物上传 |
| 🆕 场景库 / 产品库 / 道具库 / 特效预设 | — | 🆕 待建(S4) |
**L3 能力层(替换点②③)**
| 现有资产 | 行数 | 能力归类 | 状态 |
|:--|:--|:--|:--|
| `audio_line/`(layer2_analysis / layer3_creation) | 3530 | 音频分析 + 创作 | ✅ 已有(**最大音频资产**,待接入主流程) |
| `bgm_generator/`(suno 等 4 文件) | 654 | BGM 生成 | ✅ 已有 |
| `music_selector/` | 371 | BGM 选择 | ✅ 已有 |
| `main.py voice`(调 aliyun/volcano) | — | TTS 合成 | ✅ 已有(无独立模块,在 CLI 内) |
| `character_sheet.py` | 841 | 文生图(Kling v1) | ✅ 已有 |
| `story_director/batch_generator.py` | 664 | 图生视频(Kling 批量) | ✅ 已有 |
| `person_swap/` | — | 人物置换(百炼 wan2.2-animate-mix) | ✅ 已有 |
| `composer/ffmpeg.py` | 702 | 拼接 / 转场 / 合成 | ✅ 已有 |
| `composer/speed_ramp.py` | 370 | 变速 / 速度斜坡 | ✅ 已有 |
| `composer/lipsync.py` | 369 | 对口型 | ✅ 已有 |
| `composer/beat_sync.py` | — | 节拍同步 | ✅ 已有 |
| `composer/hybrid.py` | 453 | 混合合成(口播+卡点) | ✅ 已有 |
| `composer/character_locker.py` | 68 | **角色锁定(一致性!)** | ✅ 已有(对应 DCS 的 consistency_seed) |
| `material_producer/`(pexels / wan2_2 / fallback) | 902 | 素材生产 | ✅ 已有 |
| `director_parser/`(parser + schemas) | 323 | 文案解析 | ✅ 已有 |
| `story_director/scene_planner.py` | 444 | **分镜规划** | ✅ 已有(→ 可包装为 legacy 导演适配器) |
| `story_director/temporal_bridge.py` | 322 | 场景过渡桥接 | ✅ 已有 |
| `anchor_extractor/` | 155 | 锚点提取 | ✅ 已有 |
| 🆕 去 AI 化 | — | 视频后处理 | 🆕 待建(S2) |
| 🆕 ComfyUI / 运镜 / 特效 / 面部微表情 / 3D | — | 视觉扩展 | 🆕 待接(S5) |
**L4 编排层**
| 现有资产 | 规模 | 框架位置 | 状态 |
|:--|:--|:--|:--|
| `video_factory.py` | 641 | 5 种生产模式(run_oral/beat/digital_human/hybrid/**run_story**) | 🟡 拆成能力 + 保留为快速入口 |
| `workflows.py`(Dashboard) | 599 | 流程模板(6 个)+ 节点定义(15 种) | ✅ 定义齐,🟡 **执行器空转需补** |
| `demo_full_pipeline.py` | 256 | 端到端演示 | ✅ 参考用 |
| `story_director/` | 1443 | 导演(legacy) | 🟡 包装为导演适配器 |
| 🆕 统一分镜 Schema | — | 中枢契约 | 🆕 待建(S2) |
| 🆕 导演适配器框架 | — | 替换点① | 🆕 待建(S2) |
| 🆕 执行器(真跑) | — | L2 执行层 | 🆕 待建(S3) |
**L5 接入层 / 支撑**
| 现有资产 | 规模 | 框架位置 |
|:--|:--|:--|
| `main.py` | 931 | ✅ CLI 原子命令(调试入口,保留) |
| Dashboard `plugins/ave.py` | 243 | ✅ 能力目录插件(🟡 数据源改读注册表) |
| Dashboard `app.py` | — | ✅ sys.path 集成 + `/api/capabilities` |
| Dashboard `workflows.py` | 599 | ✅ 模板/节点接口(`/api/workflow/*`) |
| `lib/config.py` / `cost_tracker.py` / `dashboard.py` / `logger.py` | 921 | ✅ 配置 / 成本记账 / 生产埋点 / 日志 |
| `09_ave/config.yaml` | — | ✅ 配置(kling/aliyun/volcano/llm/pexels…) |
| `AVE_ARCHITECTURE_PLAN.md` | 480 | ✅ 既有架构规划(6 条生产路径 + 原子能力表) |
### A.2 前端资产(`10_dashboard/frontend/src/`)
| 现有视图 | 行数 | 框架位置 | 状态 |
|:--|:--|:--|:--|
| `workflow.js` | 485 | ⚙️编排 → 工作流 | ✅ 画布;🟡 待接真执行 + 节点配置面板 |
| `capabilities.js` | 80 | 🔧配置 → 能力目录 | ✅ 只读总览 |
| `person-swap.js` | 269 | 📦资产 → 人物置换 | ✅ |
| `characters.js` | 138 | 📦资产 → 角色库 | ✅ |
| `char-gen.js` | 389 | 📦资产 → 角色生成器 | ✅ |
| `productions.js` | 88 | ⚙️编排 → 生产记录 | ✅ |
| `assets.js` | 57 | 📦资产 → 素材库 | 🟡 待扩展 |
| `costs.js` | 61 | ⚙️编排 → 费用分析 | ✅ |
| `ave-script.js` 等 4 个 | 各 9 | — | ⚪ **空壳**(择机激活为导演创作页或删除) |
| 🆕 `ave-director.js` | — | 🎞️创作 → 导演创作 | 🆕 待建(S2) |
| 🆕 `ave-capabilities.js`(管理) | — | ⚙️编排 → 能力库 | 🆕 待建(S1) |
### A.3 盘点发现的问题
1. **编号目录 `01-07` 全是空壳**(每个 `__init__.py` 0 字节)—— 早期分层规划残留,**实现都在无编号目录**里(`director_parser/` `composer/` `bgm_generator/` …)
→ **建议**:归档到 `90_archive/`,避免后续误导(框架里的 `capabilities/` `directors/` 等新目录才是正式分层)
2. **命名不统一**:`character_sheet.py` / `character_portrait.py` 在根级,`character_registry/` `character_generator/` 在目录
→ 按框架收进 `capabilities/` `assets/` 时统一
3. **资产比预想多**:`audio_line`(3530) + `character_*` 系(4642) + `asset_manager`(1167) 都是成熟资产,**不用重写,只需包装**
4. **缺口集中**:去 AI 化、统一 Schema、导演可切换、执行器、场景/产品资产 —— 正好是 S1~S4 的内容
### A.4 结论:现有资产覆盖率
| 层 | 覆盖度 | 说明 |
|:--|:--|:--|
| L1 资产层 | **角色 100%** / 场景产品 0% | 角色系资产最完整 |
| L3 能力层 | **约 80%** | 音频/视频/基础视觉齐;缺去AI化、ComfyUI、特效、3D |
| L4 编排层 | **定义 100% / 执行 0%** | 模板与节点齐,执行器空转 |
| L5 接入层 | **60%** | CLI + 插件齐;前端缺导演创作/能力库页 |
| 统一契约 | **0%** | 分镜 Schema 与导演适配器待建 |
**一句话**:零件大多已有(约 19,000 行可复用),缺的是**统一契约(Schema)+ 通电(执行器)+ 几个关键缺口(去AI化/资产扩展)** —— 这正是 S1~S5 要补的,不需要推倒重来。
---
## 附录 B|方法论整合(从成熟系统抓取,2026-10-01)
> 原则:**"市面上已有人把整套系统做出来了,我们抓下来做成自己的风格"** —— 不重造轮子,抓方法论、按我们的架构增量接入。
### B.1 抓取清单(ai-film-skills,Apache-2.0)
**位置**:`05_tools/09_ave/skills/ai-film-skills/`
| 类别 | 内容 | 说明 |
|:--|:--|:--|
| 技能包 | **21 个**(18 常规 + 3 实验) | 每包含 `SKILL.md` 运行正文 |
| 方法论 | **150 个 `references/`**(1.4MB) | 执行细节(编译器/引擎/协议/验收/诊断) |
**核心包**:
- `ai-storyboard-director`(v5.2 分镜,5.7.1)— **已接入为默认导演**
- `produce-ai-video`(实际生产与验收)— **六模块提示词编译器 + 三级交付状态已接入**
- `ai-short-drama-production`(短剧控制:五列分镜 + 六模块母提示词)
- `character-asset` / `scene-asset` / `prop-asset`(人物/场景/道具资产规范)— **待接资产库**
- `director-agent`(编剧与导演)
- 7 个题材风格包(武侠/战争/赛博朋克/恐怖/黑色/爱情/奇幻/史诗)
### B.2 已整合(已落地在代码里,可验证)
| 方法论 | 落地位置 | 效果 |
|:--|:--|:--|
| **六模块母提示词**<br>(生成任务/主体/场景/情绪/风格/分段脚本) | `composer/pipeline.py::build_shot_prompt` | 提示词 470~530 字、结构完整、**含负向约束**(不要 AI 塑料质感/字幕水印/快速变焦) |
| **三级交付状态**<br>(合格成片/候选成片/未完成) | `schemas.py::Storyboard.delivery_status` + `pipeline.delivery_status()` + 前端徽章 + `POST .../review` 确认接口 | **诚实标注**:未经完整播放审查一律标「候选成片」 |
| **v5.2 分镜方法论** | `directors/storyboard_v52.py`(技能文档作系统提示词) | 分镜质量显著优于 legacy(场面调度/连续性/按内容选景别) |
### B.3 待整合(接入点已明确,按需做)
| 方法论 | 接入点 | 预期收益 |
|:--|:--|:--|
| **设计记忆协议**(`design-memory-protocol.md`) | `Shot` 加 `enter_state`/`exit_state`;`Storyboard` 加 `locked_facts`(用户锁定)/`source_hash`(源剧本校验) | 跨镜头状态传递 + **用户改过的镜头不被重生成覆盖** |
| **十二项完成门** | 导演 prompt 强化 + 可选校验器(时间轴闭合/轴线一致/台词时长/道具追溯) | 分镜质量自检,减少"术语轮换"式假分镜 |
| **资产规范**(人物/场景/道具) | 资产库 UI + `GlobalAnchors`(多角度参考图 + 必保特征) | 角色一致性(换场景不变脸) |
| **五列人读分镜** | 分镜表 UI 列:时间 / 景别机位 / 摄影机 / 画面与动作 / 台词声音 | 更专业的编辑视图(当前是单列卡片) |
| **验收细则**(`qualified-video-acceptance.md`) | 交付前的检查清单(连续性/瑕疵/声音) | 合格成片判定有据可依 |
### B.4 整合原则
1. **不推翻现有设计**:统一分镜 Schema 是中枢,方法论以"字段 / 提示词 / 校验器"形式**增量**接入
2. **能跑通优先**:先保证端到端可用(✅ 已完成),再补精细化
3. **可切换**:所有接入点设计为可选(v5.2 与 legacy 并存、六模块与简洁模式并存)
4. **不动别人的代码**:技能包原样存放 `skills/`,通过适配器/编译器接入,便于后续升级技能版本