CineCog Studio — 技术文档

AI 视频生产管理系统 · Last Updated: 2026-03-26

01系统概述

CineCog Studio 是一个自部署的 Web 管理系统,专为 AI 视频内容生产设计。管理从剧本到成片的完整生产流程,包括关键帧、多版本视频、音频混音、审查流程。

1.1 核心问题(来自 EP01 生产经验)

1.2 设计目标

  1. 项目工程文件 (YAML) — 单一来源记录所有生产参数
  2. 版本管理 — 每段保留多个版本,可切换/对比
  3. 一键重编译 — 修改任意段落后自动重新拼接完整视频
  4. 审查 Gate — 关键帧视觉审查集成到流程
  5. ComfyUI 集成 — 从界面直接触发视频生成
  6. 音频混音器 — 可视化管理 BGM/旁白/音效/台词的时间轴

02项目工程文件格式 (YAML)

2.1 为什么选 YAML

2.2 完整数据结构

# ============================================================
# CineCog Project File
# Format: CineCog v1.0
# ============================================================

project:
  name: "EP01 — I Chose This Name"
  version: "v7b"                    # 当前整体版本
  created: "2026-03-26"
  updated: "2026-03-26T19:44:00+02:00"

  # 输出规格
  output:
    resolution: [576, 1024]         # [width, height]
    aspect_ratio: "9:16"
    fps: 32                         # 最终输出帧率
    generation_fps: 16              # ComfyUI 生成帧率
    format: "mp4"
    codec: "libx264"
    crf: 18

# ============================================================
# 角色系统
# ============================================================
characters:
  vera:
    name: "Vera"
    face_ref: "assets/characters/vera/vera-studio-front.png"
    reference_slots:
      - "assets/refs/vera-ref-slot1.jpg"   # 正面全尺寸
      - "assets/refs/vera-ref-slot2.jpg"   # 多角度 collage
      - "assets/refs/vera-ref-slot3.jpg"   # 表情 collage
      - "assets/refs/vera-ref-slot4.jpg"   # 全身+场景 collage
      - "assets/refs/vera-ref-slot5.jpg"   # 补充 collage

    # 角色特定的参考图(用于 Split Reference)
    angle_refs:
      front: "assets/refs/vera-front.jpg"
      back: "assets/refs/vera-back.jpg"
      profile_left: "assets/refs/vera-profile-left.jpg"
      profile_right: "assets/refs/vera-profile-right.jpg"

# ============================================================
# 服装规范 — 唯一来源,所有 prompt 引用此文本
# ============================================================
costume_specs:
  vera_gown:
    name: "Black Velvet Gown"
    description: |
      Long-sleeved black velvet fitted gown, deep plunging V-neckline
      to mid-sternum, body-hugging silhouette, center-front high slit
      to upper thigh, black thigh-high stockings with lace-trimmed band,
      visible garter strap/suspender clips connecting to stockings,
      black stiletto heels with red soles (Louboutin),
      platinum blonde hair in sleek low bun, small stud earrings only.
    segments: [SEG06, SEG07, SEG08, SEG09, SEG10, SEG11]

  vera_robe:
    name: "Burgundy Silk Robe"
    description: |
      Burgundy/wine-red silk robe, loosely tied at waist,
      satin sheen, sleepwear style. Platinum blonde hair in sleek low bun.
    segments: [SEG04, SEG05]

# ============================================================
# 生成模型配置
# ============================================================
models:
  default_video:
    name: "Wan 2.2 Remix NSFW v2.0"
    high_noise: "Wan2.2_Remix_NSFW_i2v_14b_high_lighting_v2.0.safetensors"
    low_noise: "Wan2.2_Remix_NSFW_i2v_14b_low_lighting_v2.0.safetensors"
    text_encoder: "nsfw_wan_umt5-xxl_fp8_scaled.safetensors"
    vae: "wan_2.1_vae.safetensors"
    clip_vision: "clip_vision_h.safetensors"
    lora:
      high: "wan2.2_i2v_lightx2v_4steps_lora_v1_high_noise.safetensors"
      low: "wan2.2_i2v_lightx2v_4steps_lora_v1_low_noise.safetensors"
      strength: 0.6
    sampling:
      steps: 4
      cfg: 1.0
      sampler: "euler"
      scheduler: "simple"
      shift: 10.0
      split_step: 2          # high pass 0→2, low pass 2→end

  infinitetalk:
    name: "InfiniteTalk Single"
    model: "Wan2_1-I2V-14B-480P_fp8_e4m3fn.safetensors"
    multitalk: "InfinteTalk/Wan2_1-InfiniTetalk-Single_fp16.safetensors"
    lora: "Wan21_I2V_14B_lightx2v_cfg_step_distill_lora_rank64.safetensors"
    lora_strength: 0.8
    text_encoder: "umt5-xxl-enc-fp8_e4m3fn.safetensors"
    wav2vec: "wav2vec2-chinese-base_fp16.safetensors"
    block_swap: 30
    audio_scale: 1.5
    shift: 8.0

# ============================================================
# GPU 资源
# ============================================================
gpus:
  - id: "cuda:0"
    port: 8188
    name: "RTX 4090 #0"
    notes: "备用 GPU"
  - id: "cuda:1"
    port: 8189
    name: "RTX 4090 #1"
    notes: "首选,散热更好"

# ============================================================
# 段落定义(摘录关键段落示例)
# ============================================================
segments:
  - id: SEG01
    title: "开篇字幕"
    type: "title_card"
    duration: 2.0
    status: "approved"

  - id: SEG02
    title: "雨夜冷笑"
    type: "i2v"
    duration: 5.0
    costume: "vera_gown"
    status: "approved"
    generation:
      method: "i2v"
      model: "default_video"
      seed: 567
      frames_generate: 89
      frames_trim: 81

  - id: SEG09
    title: "宣言"
    type: "infinitetalk"
    duration: 5.0
    costume: "vera_gown"
    status: "approved"
    speech:
      text: "I chose this name. Not to be loved. To be remembered."
      language: "en"
      tts_engine: "IndexTTS-2"

  - id: SEG11
    title: "消失"
    type: "i2v"
    duration: 6.0
    costume: "vera_gown"
    status: "approved"
    generation:
      method: "i2v"
      split_reference:
        enabled: true
        clip_vision_ref: "refs/seg11-back-vision-ref.jpg"

# ============================================================
# 音频时间轴
# ============================================================
audio_timeline:
  bgm:
    file: "audio/brand-loop-v1.mp3"
    volume: 0.30
    duck_volume: 0.08
  narrations:
    - id: "narr1"
      start_time: 7.0
      text: "Three people asked her why. She didn't answer any of them."
    - id: "narr2"
      start_time: 38.0
      text: "She wasn't going to see the one who called."

# ============================================================
# 生产规则(不可违反)
# ============================================================
rules:
  - "有动作的镜头最低 4 秒"
  - "九宫格必须竖版 1024×1792,禁止方图"
  - "九宫格禁止白边"
  - "必须传 5 张参考图"
  - "Costume spec 是唯一来源,禁止凭记忆"
  - "关键帧必须通过视觉审查 Gate"
  - "InfiniteTalk 音频 ≥ 3 秒"
  - "InfiniteTalk 零延迟叠音频"
  - "后处理 trim 和 interpolate 必须分两步"
  - "concat 前统一帧率"
  - "首帧不含全身时用 Split Reference"
  - "FMLF 相邻帧景别渐进,不能跳"
  - "ComfyUI 任务用 subagent 不阻塞主线"

03Web 管理界面功能设计

3.1 项目概览页

3.2 段落详情页

3.3 Costume Spec 管理

3.4 音频混音器

3.5 角色管理

04技术架构

┌─────────────────────────────────────────┐
│           CineCog Studio Web            │
│         (Next.js / React)               │
│  ┌──────┐ ┌──────┐ ┌──────┐ ┌───────┐  │
│  │Timeline│ │Segment│ │Audio │ │Costume│  │
│  │ View  │ │Detail│ │Mixer│ │ Spec  │  │
│  └──────┘ └──────┘ └──────┘ └───────┘  │
└────────────────┬────────────────────────┘
                 │ REST API
┌────────────────┴────────────────────────┐
│         CineCog Backend                  │
│        (Python FastAPI)                  │
│  ┌──────┐ ┌───────┐ ┌───────┐          │
│  │YAML  │ │ComfyUI│ │ffmpeg │          │
│  │Parser│ │Client │ │Mixer  │          │
│  └──────┘ └───────┘ └───────┘          │
└────┬──────────┬──────────┬──────────────┘
     │          │          │
  Project    ComfyUI    File System
  YAML       API        (assets/
  Files      8188/89     segments/
                         audio/)

4.1 技术栈

4.2 核心 API

GET  /api/project                    # 读取项目 YAML
PUT  /api/project                    # 更新项目 YAML
GET  /api/segments                   # 所有段落列表
GET  /api/segments/{id}              # 单段详情
POST /api/segments/{id}/generate     # 触发 ComfyUI 生成
POST /api/segments/{id}/approve      # 审核通过
POST /api/compile                    # 重新编译完整视频
POST /api/mix                        # 重新混音
GET  /api/assets/{path}              # 静态资源(视频/图片/音频)

05向导式工作流设计

5.1 核心理念

每一步的输出是下一步的输入。没有完成前置步骤,后续步骤不可用(灰色/锁定)。

5.2 步骤流程

Step 1: 角色设定
  ├── 选择已有角色(从角色库)
  └── 临时创建(用户输入描述 prompt → AI 生成参考图 → 用户确认)
      ↓
Step 2: 服装规范
  ├── 选择已有 costume spec
  └── 新建(JSON 结构化输入 → 预览生成 → 确认)
      ↓
Step 3: 场景 & 分镜
  ├── 定义每个 segment(场景、时长、运镜、动作)
  └── 输出: segment 列表 + 每段的 prompt
      ↓
Step 4: 九宫格关键帧
  ├── 每段自动生成九宫格(用确认的角色 + costume spec)
  ├── 用户选帧(点击选 3 个 panel)
  └── 视觉审查 Gate(自动 + 人工确认)
      ↓
Step 5: 视频生成
  ├── 自动分配 GPU(双 GPU 并行)
  ├── FMLF / I2V / InfiniteTalk(根据段落类型)
  └── 用户 approve/reject/reseed
      ↓
Step 6: 音频
  ├── TTS 台词生成
  ├── MMAudio Foley 生成
  └── BGM 选择 + 混音参数
      ↓
Step 7: 编译 & 导出
  ├── 自动 concat + mix
  ├── 预览完整视频
  └── 一键部署到网站

5.3 临时角色创建流程

输入: "一个30岁的亚洲女性,短发,穿红色西装"
  ↓ AI 生成正面参考图
  ↓ 用户确认/修改
  ↓ AI 自动生成 5-slot collage(多角度/表情/全身)
  ↓ 用户确认
  ↓ 临时角色可用于后续所有步骤
  ↓ 可选: 保存到永久角色库

5.4 JSON 结构化 Prompt(来自 Nano Banana Pro 社区最佳实践)

替代自然语言 prompt,用 JSON 描述每个关键帧:

{
  "scene": {
    "location": "rainy Parisian cobblestone alley at night",
    "lighting": "warm golden streetlamp from left, cool blue shadow from right",
    "weather": "light rain, wet reflective cobblestones",
    "atmosphere": "cinematic noir, film grain"
  },
  "character": {
    "identity": "USE_REF_SLOTS",
    "costume": "USE_COSTUME_SPEC:vera_gown",
    "pose": "walking toward camera, mid-stride, confident",
    "expression": "cold, composed, slight contemptuous smirk",
    "gaze": "direct to camera"
  },
  "camera": {
    "movement": "slow dolly in",
    "angle": "eye level",
    "lens": "85mm prime",
    "dof": "shallow, subject sharp, background bokeh",
    "framing": "medium shot, waist up"
  },
  "technical": {
    "aspect_ratio": "9:16",
    "style": "photorealistic, cinematic",
    "color_grade": "warm highlights, cool shadows, high contrast"
  }
}

优势:

5.5 Cinematic Contact Sheet Prompt 模板

Using ALL reference images of [CHARACTER], generate a Cinematic Contact Sheet
containing [N] keyframes in a single [ROWS]×[COLS] grid image.

IDENTITY: [CHARACTER] must match references EXACTLY in every frame.
COSTUME: [PASTE_FROM_COSTUME_SPEC]

ENVIRONMENT ANCHOR: All frames take place in [SCENE_DESCRIPTION].
Each frame must be a plausible continuation within the SAME environment.

[N] frames arranged [ROWS]×[COLS], NO borders, NO gaps, flush edge to edge:

Frame 1: [JSON_CAMERA+POSE for frame 1]
Frame 2: [JSON_CAMERA+POSE for frame 2]
...

CRITICAL RULES:
- Character identity LOCKED across all frames
- Environment LOCKED across all frames
- Only camera angle, character pose, and expression may change between frames
- NO white borders between panels

06审查流程设计(人类审查)

6.1 核心原则

6.2 审查 UI 流程

[九宫格生成完成]
     ↓
┌─────────────────────────────────────┐
│  Panel 审查界面                      │
│                                     │
│  ┌───┐ ┌───┐ ┌───┐                 │
│  │ 1 │ │ 2 │ │ 3 │  ← 小图 ~512px  │
│  │ ✅ │ │ ❌ │ │ ✅ │                 │
│  └───┘ └───┘ └───┘                 │
│  ┌───┐ ┌───┐ ┌───┐                 │
│  │ 4 │ │ 5 │ │ 6 │                 │
│  │ ✅ │ │ ✅ │ │ ❌ │                 │
│  └───┘ └───┘ └───┘                 │
│  ┌───┐ ┌───┐ ┌───┐                 │
│  │ 7 │ │ 8 │ │ 9 │                 │
│  │ ✅ │ │ ❌ │ │ ✅ │                 │
│  └───┘ └───┘ └───┘                 │
│                                     │
│  ❌ Panel 2: [袖子] [发型]           │
│  ❌ Panel 6: [丝袜缺失]             │
│  ❌ Panel 8: [领口不对]             │
│                                     │
│  选择关键帧:                         │
│  KF1: [▼ Panel 1]                   │
│  KF2: [▼ Panel 5]                   │
│  KF3: [▼ Panel 7]                   │
│                                     │
│  [重新生成九宫格] [确认进入生成]      │
└─────────────────────────────────────┘

6.3 不合格原因标签(快速标注)

6.4 数据记录

审查结果写入项目 YAML:

nine_grid:
  file: "grids/seg08-grid-v4.jpg"
  panels:
    - {id: 1, status: "approved"}
    - {id: 2, status: "rejected", reasons: ["sleeves", "hair"]}
    - {id: 3, status: "approved"}
    # ...
  selected_keyframes:
    kf1: 1
    kf2: 5
    kf3: 7
  audit_by: "human"
  audit_time: "2026-03-26T16:00:00+02:00"

6.5 和 AI 审查的关系

6.6 简化审查交互(更新)

默认状态:全部合格。用户只需要标注不合格的。

操作流程:
1. 显示 9 个小图(~512px,无上采样)
2. 全部默认 ✅ 绿色边框
3. 用户点击有问题的图 → 变 ❌ 红色边框 + 弹出原因标签
4. 从剩余 ✅ 的里选 3 个做 KF(点击选择,高亮标记 KF1/KF2/KF3)
5. 确认 → 系统自动上采样选中的 3 个到 576×1024
6. 进入视频生成步骤

上采样时机:
- 审查前:不上采样,小图审查
- 审查后:只上采样被选中的 3 个 KF(节省时间和 API 调用)

07Character Sheet 系统

7.1 什么是 Character Sheet

一张包含角色多角度、多表情、多体型的合成图。Gemini / Nano Banana Pro 对这种"设定图"格式的一致性理解最好。

7.2 标准 Character Sheet 布局

Row 1: ANGLES    — 正面 | 左3/4 | 侧面 | 右3/4 | 背面
Row 2: EXPRESSIONS — 严肃 | 冷笑 | 命令 | 微笑 | 蔑视
Row 3: FULL BODY — 全身站立 | 走步 | 坐姿 | 低角度 | 场景中

7.3 使用方式

7.4 自动生成 Character Sheet

def generate_character_sheet(character_id):
    # 从角色目录读取所有图片
    # 按类型分类(front/profile/quarter/expression/fullbody)
    # 自动选择最佳组合
    # 拼装成标准布局
    # 保存到 assets/characters/{id}/character-sheet.jpg

7.5 Web UI 集成

08完整服装要求(从头到鞋)

8.1 问题根因(EP01 实测)

现有 Vera 24 张参考图全部裁到膝盖以上 → Gemini 对鞋/丝袜/下半身没有视觉参考 → 每次生成的下半身细节不一致。

这是 SEG11 反复失败的深层原因:不是 prompt 不够精确,而是参考图里根本没有鞋和丝袜。

8.2 Character Sheet 必须包含

元素当前状态需要
面部/五官✅ 24张
发型✅ 多角度
上身服装✅ 多角度
下半身/裙摆⚠️ 部分有需要全身
丝袜蕾丝带❌ 几乎没有必须补充
吊带/悬挂扣❌ 没有必须补充
鞋子❌ 完全没有必须补充

8.3 新 Character Sheet 标准(v2)

Row 1: 全身正面 | 全身左3/4 | 全身侧面 | 全身右3/4 | 全身背面
       (所有图必须从头到脚,包含鞋子)

Row 2: 上半身表情组(严肃/冷笑/命令/微笑/蔑视)

Row 3: 细节特写组
       鞋子特写(红底) | 丝袜蕾丝带特写 | 吊带扣特写 | V领特写 | 发髻特写

8.4 生成顺序(下次开工第一步)

1. 用现有面部参考 + costume spec → 生成 5 张全身正面/多角度照
2. 人类审查全身照(特别检查鞋/丝袜/发型)
3. 补充生成细节特写(鞋底红色/蕾丝带/吊带扣)
4. 拼装成标准 Character Sheet v2
5. 这张 Sheet 成为所有后续九宫格的唯一参考

8.5 向导流程中的位置

Step 0: Character Sheet 生成/验证  ← 新增!最先执行
Step 1: 角色设定(选择 Character Sheet)
Step 2: 服装规范(从 Sheet 自动提取/确认)
Step 3: 场景 & 分镜
...

没有通过验证的 Character Sheet → 不能进入任何生产步骤。

09完整创作流程(从角色到成片)

9.1 流程总览

Phase 0: 角色创建
  Character Sheet(从头到鞋全身多角度)→ 人类审查
     ↓
Phase 1: 人物设定 & 故事方向
  角色性格/背景 → 故事线索/主题 → 戏剧冲突点
     ↓
Phase 2: 剧本展开
  故事线索 → 分场 → 每场的视觉钩子 → 具体提示词
     ↓
Phase 3: 视觉生产
  九宫格 → 审查 → 视频生成 → 审查
     ↓
Phase 4: 音频 & 混音
  TTS → Foley → BGM → Mix
     ↓
Phase 5: 编译 & 发布

9.2 Phase 0 — 角色创建(一切的前提)

没有完整的 Character Sheet,一切都不成立。

输入:
  - 角色描述(文字 or 参考图)
  - 服装规范(JSON 结构化)

流程:
  1. 生成全身多角度照(5 张:正面/左3-4/侧面/右3-4/背面)
     → 每张必须从头到鞋,包含所有服装细节
  2. 人类审查(UI 上逐张确认)
  3. 生成细节特写(鞋/丝袜/吊带/领口/发髻)
  4. 拼装 Character Sheet
  5. 确认后锁定 → 所有后续生成引用这张 Sheet

输出:
  - character-sheet.jpg(标准布局)
  - costume-spec.yaml(结构化服装描述)
  - 角色 ID(用于后续引用)

9.3 Phase 1 — 人物设定 & 故事方向

角色不只是视觉 — 需要定义性格和叙事功能。

character_profile:
  name: "Vera"
  archetype: "The Sovereign"      # 角色原型
  personality:
    core_trait: "冷静的权力感"
    speech_style: "简短、断言式、不解释"
    emotional_range: "冰冷蔑视 → 克制的满足 → 罕见的微笑"

  visual_identity:
    signature_look: "黑丝绒长袖深V裙 + 红底高跟鞋 + 低髻"
    color_palette: [black, crimson, gold]
    visual_metaphor: "暗夜中唯一的光源"

  narrative_role:
    theme: "自我命名 = 自我定义 = 权力"
    central_question: "她为什么选了这个名字?"
    audience_hook: "观众想知道答案,但她拒绝回答"

story_direction:
  premise: "一个女人在一个雨夜做了一个决定"
  tone: "film noir, 权力美学, 克制的情感"
  time_span: "12 小时(闪回结构)"

  story_seeds:
    - "三个人问过她为什么 → 引出悬念"
    - "起床 → 准备 → 出门 → 拒绝来电 → 说出宣言 → 消失"
    - "她去见的不是打电话的那个人 → 钩子"

9.4 Phase 2 — 剧本展开(从线索到提示词)

9.4.1 叙事工具箱

每个短片/短视频应该包含:

戏剧冲突 (Dramatic Conflict)

conflict:
  type: "internal"                 # internal / interpersonal / situational
  setup: "她有一个秘密身份"
  tension: "有人试图揭露/联系她"
  climax: "她选择直面镜头宣言"
  resolution: "留下悬念,转身消失"

视觉钩子 (Visual Hooks)

visual_hooks:
  - segment: SEG01
    hook: "黑底白字,极简,制造好奇"
    technique: "typography_tension"

  - segment: SEG02
    hook: "雨中冷笑 — 美但有攻击性"
    technique: "beauty_with_edge"

  - segment: SEG08
    hook: "丝袜开叉 + 自信走步 — 视觉冲击"
    technique: "power_walk"

  - segment: SEG09
    hook: "打破第四面墙 — 直视镜头说话"
    technique: "fourth_wall_break"

  - segment: SEG11
    hook: "红底高跟鞋特写 — 品牌标识性画面"
    technique: "signature_detail"

节奏控制 (Pacing)

pacing:
  structure: "slow_build_to_climax"
  rhythm:
    - phase: "opening"        # SEG01-03
      tempo: "slow, mysterious"
      purpose: "建立悬念和氛围"

    - phase: "preparation"    # SEG04-07
      tempo: "measured, deliberate"
      purpose: "展示角色的仪式感和控制力"

    - phase: "confrontation"  # SEG08-09
      tempo: "building intensity"
      purpose: "推镜头 + 宣言 = 情感高潮"

    - phase: "resolution"     # SEG10-12
      tempo: "declining, enigmatic"
      purpose: "拒绝 + 消失 + 留下悬念"

镜头语言 (Cinematic Language)

camera_vocabulary:
  dolly_in: "亲密感增加,压迫感,关注细节"
  dolly_out: "疏离感,孤独感,角色变小"
  crane_up: "从细节到全局,揭示"
  crane_down: "从全局到细节,聚焦"
  static: "稳定,权威,不可动摇"
  steadicam_follow: "跟随,观察者视角"

  # 每种运镜对应的情感效果
  emotional_mapping:
    power: [dolly_in, static, low_angle]
    vulnerability: [dolly_out, high_angle]
    mystery: [crane_up, silhouette, back_view]
    intimacy: [close_up, shallow_dof, static]

9.4.2 从线索到分镜到提示词

故事线索: "她起床后精心准备,出门走入雨夜,说出宣言"
    ↓
分场: SEG04(水杯) → SEG05(选衣) → SEG06(照镜) → SEG07(走廊) → SEG08(雨街) → SEG09(宣言)
    ↓
每场的视觉钩子 + 运镜 + 情感节拍
    ↓
结构化 prompt (JSON):
{
  "scene": {...},
  "character": {"pose": "...", "expression": "..."},
  "camera": {"movement": "dolly_in", "lens": "85mm"},
  "hook": "power_walk",
  "emotion": "building_intensity"
}
    ↓
传给 Gemini 生成九宫格

9.5 Web 向导中的体现

Step 0: Character Sheet ──────── [创建/选择角色] [全身审查]
Step 1: Character Profile ────── [性格] [视觉身份] [叙事角色]
Step 2: Story Direction ──────── [前提] [冲突] [节奏结构]
Step 3: Scene Breakdown ──────── [分场] [每场钩子] [运镜] [情感]
Step 4: Prompt Generation ────── [JSON prompt 自动生成] [人工微调]
Step 5: Nine-Grid + Audit ────── [生成] [人类审查] [选帧]
Step 6: Video Generation ─────── [FMLF/I2V/InfiniteTalk] [审查]
Step 7: Audio ─────────────────── [TTS] [Foley] [BGM] [Mix]
Step 8: Compile & Export ─────── [concat] [preview] [deploy]

每一步的输出锁定后才能进入下一步。可以随时返回修改前面的步骤 → 系统自动标记受影响的后续步骤为"需要重做"。

10并行任务 & 依赖关系

10.1 核心原则

不是所有步骤都是串行的。有依赖关系的必须串行,没有依赖的应该并行。UI 上用 DAG(有向无环图)可视化,清楚显示什么能同时做、什么必须等。

10.2 任务依赖图

Character Sheet ─────────────────────────────────────────────────
      │
      ├──→ 人物设定 ──→ 故事方向 ──┬──→ 分场剧本 ──┬──→ Prompt生成
      │                           │              │
      │                           │              ├──→ 九宫格(并行)
      │                           │              │     ├ SEG02 grid
      │                           │              │     ├ SEG06 grid  ← 可同时生成
      │                           │              │     ├ SEG08 grid
      │                           │              │     └ SEG11 grid
      │                           │              │
      │                           └──→ 配乐选择/创作 ← 和九宫格并行!
      │                                  │
      │                                  ↓
      │                           BGM + 旁白 TTS ← 和视频生成并行!
      │
      └──→ 细节特写参考图 ← 和故事方向并行!

10.3 段落间依赖关系

独立段落(可并行生成):
  SEG01 (title card)     ← 无依赖
  SEG02 (冷笑)           ← 无依赖
  SEG03 (flashback)      ← 无依赖
  SEG04 (水杯)           ← 无依赖
  SEG05 (衣橱)           ← 无依赖
  SEG06 (镜子)           ← 无依赖
  SEG07 (走廊)           ← 无依赖
  SEG10 (手机)           ← 无依赖
  SEG12 (品牌)           ← 无依赖

有依赖的段落(必须串行):
  SEG08 (雨街zoom) → SEG09 (InfiniteTalk)
    因为: SEG09 的起始帧 = SEG08 的尾帧

  SEG09 (台词) → 需要 TTS 音频先完成
    因为: InfiniteTalk 需要音频输入

  SEG11 (高跟鞋走远) → 需要 Split Reference 参考图
    因为: 需要背影全身参考图

10.4 批量生成策略

generation_strategy:
  # 方式 A: 批量多版本(同一段落多个 seed)
  batch_variants:
    enabled: true
    seeds_per_segment: 3          # 每段生成 3 个版本
    parallel_gpus: true           # 双 GPU 并行

  # 方式 B: 批量多段落(不同段落并行)
  batch_segments:
    enabled: true
    max_parallel: 2               # 双 GPU = 最多 2 个同时

  # 方式 C: 混合(推荐)
  mixed:
    round_1:                      # 所有独立段落,双 GPU 并行
      - [SEG02, SEG06]            # GPU 0 + GPU 1
      - [SEG07, SEG08]
      - [SEG04, SEG05]
      - [SEG10, SEG11]
      - [SEG01, SEG03, SEG12]     # title cards 很快

    round_2:                      # 有依赖的段落
      - SEG09                     # 等 SEG08 完成 + TTS 完成

    round_3:                      # 不满意的重做
      - 用户选择需要 reseed 的段落
      - 每个生成 3 个变体
      - 用户 A/B/C 选择

10.5 UI 展示

┌─────────────────────────────────────────────────┐
│  生产进度面板                                     │
│                                                   │
│  ⬛⬛⬛ Phase 0: Character Sheet     ✅ 已完成    │
│  ⬛⬛⬛ Phase 1: 人物设定             ✅ 已完成    │
│  ⬛⬛⬛ Phase 2: 故事方向             ✅ 已完成    │
│                                                   │
│  === 以下任务可并行 ===                            │
│                                                   │
│  ⬛⬛░ 配乐创作                      🔄 进行中    │
│  ⬛⬛░ 旁白 TTS                      🔄 进行中    │
│                                                   │
│  ⬛⬛⬛ 九宫格 SEG02                  ✅ 审查通过  │
│  ⬛⬛⬛ 九宫格 SEG06                  ✅ 审查通过  │
│  ⬛⬛░ 九宫格 SEG08                  🔄 审查中    │
│  ⬛░░ 九宫格 SEG11                   ⏳ 排队      │
│                                                   │
│  === 视频生成(独立段可并行)===                    │
│                                                   │
│  GPU:0  ⬛⬛⬛ SEG02 v1              ✅            │
│         ⬛⬛░ SEG06 v1              🔄 生成中     │
│  GPU:1  ⬛⬛⬛ SEG07 v1              ✅            │
│         ⬛⬛░ SEG04 v1              🔄 生成中     │
│                                                   │
│  🔒 SEG09 — 等待 SEG08 尾帧 + TTS 音频            │
│                                                   │
│  === 后处理 ===                                    │
│  ⬛⬛⬛ trim + interpolate            自动         │
│  ⬛⬛⬛ Foley (MMAudio)              双GPU并行     │
│  ░░░ 最终混音                        等所有段完成  │
└─────────────────────────────────────────────────┘

10.6 依赖关系在 YAML 中的表达

segments:
  - id: SEG08
    depends_on: []                 # 独立,可随时生成

  - id: SEG09
    depends_on:
      - segment: SEG08
        type: "last_frame"         # 需要 SEG08 的尾帧作为起始帧
      - asset: "tts_audio"
        type: "audio_required"     # 需要 TTS 音频完成

  - id: SEG11
    depends_on:
      - asset: "back_view_ref"
        type: "split_reference"    # 需要背影参考图(Split Reference)

# 系统自动计算:
# - 哪些段落可以并行
# - 哪些必须等待
# - 最优的 GPU 分配顺序

10.7 多版本对比

┌──────────────────────────────────┐
│  SEG08 版本对比                   │
│                                  │
│  ┌─────┐ ┌─────┐ ┌─────┐       │
│  │ v1  │ │ v2  │ │ v3  │       │
│  │s=42 │ │s=777│ │s=999│       │
│  │     │ │     │ │     │       │
│  │ ▶️  │ │ ▶️  │ │ ▶️  │       │
│  └─────┘ └─────┘ └─────┘       │
│                                  │
│  [❌ reject] [✅ approve] [🔄]   │
│                                  │
│  已选: v2 (seed=777)             │
└──────────────────────────────────┘

11时间线编辑器(Timeline Editor)

11.1 设计理念

类似 Premiere / DaVinci Resolve 的时间线视图,但专为 AI 视频生产设计。不是做剪辑(不需要逐帧裁切),而是管理段落版本、审查、重新生成。

11.2 时间线布局

时间标尺
0s    2s    7s    8.5s    12.4s   14.8s  17.7s  20.7s    26.6s     31.7s 33.6s  39.6s 42s
|─────|─────|──|────────|──────|─────|─────|────────|──────────|───|───────|──────|────|

视频轨道 (V1)
┌─────┐┌────────┐┌─┐┌───────┐┌────┐┌────┐┌────┐┌───────┐┌────────┐┌──┐┌──────┐┌────┐
│SEG01││ SEG02  ││03││SEG04  ││ 05 ││ 06 ││ 07 ││ SEG08 ││ SEG09  ││10││SEG11 ││ 12 │
│title││ 冷笑   ││  ││ 水杯  ││衣橱││镜子││走廊││ 雨街  ││ 宣言   ││📱││ 消失 ││hook│
│ v1  ││ v5 ✅  ││v1││ v3 ✅ ││v4✅││v2✅││v1✅││ v5 ✅ ││ v7 ✅  ││v2││ v? ⚠️││ v1 │
└─────┘└────────┘└─┘└───────┘└────┘└────┘└────┘└───────┘└────────┘└──┘└──────┘└────┘

音频轨道 (A1 - BGM)
┌──────────────────────────────────────────────────────────────────────────────────────┐
│ ♫ brand-loop-v1.mp3  vol:30%  ~~~~duck~~~~  ~~~~~~duck~~~~~~  ~~~~duck~~~~          │
└──────────────────────────────────────────────────────────────────────────────────────┘

音频轨道 (A2 - 旁白)
       ┌─────────┐                                                  ┌─────────┐
       │ narr1   │                                                  │ narr2   │
       │ "Three..│                                                  │"She wasn│
       └─────────┘                                                  └─────────┘

音频轨道 (A3 - 台词)
                                              ┌──────────┐
                                              │"I chose..│
                                              │ vera TTS │
                                              └──────────┘

音频轨道 (A4 - Foley)
     ┌────┐          ┌──┐┌──┐┌──────┐         ┌─┐  ┌──────┐
     │rain│          │🦶││🦶││🦶rain│         │📱│  │🦶fade│
     └────┘          └──┘└──┘└──────┘         └─┘  └──────┘

音频轨道 (A5 - 转场)
┌┐     ┌┐                                              ┌┐
│⚡│     │⚡│                                              │⚡│
└┘     └┘                                              └┘

11.3 段落交互

点击时间线上的任何段落 → 右侧打开详情面板:

┌─────────────────────────────┐
│  SEG08 · 雨夜街头            │
│  Rain Street · Dolly In      │
│  Duration: 6.0s              │
│  Method: i2v                 │
│  Status: ✅ approved         │
│                              │
│  ┌─ 版本选择 ──────────────┐ │
│  │ ○ v1 (s=42)  ❌ 背景变  │ │
│  │ ○ v3 (s=42)  ❌ 太近    │ │
│  │ ● v5 (s=42)  ✅ 半身像  │ │ ← 当前选中
│  │ [+ 生成新版本]           │ │
│  └──────────────────────────┘ │
│                              │
│  ┌─ Prompt ────────────────┐ │
│  │ CAMERA: dolly in from   │ │
│  │ full body to waist-up.. │ │
│  │ [编辑]                  │ │
│  └──────────────────────────┘ │
│                              │
│  ┌─ 关键帧 ────────────────┐ │
│  │ [img] Start Frame       │ │
│  │ Split Ref: [img] back   │ │
│  └──────────────────────────┘ │
│                              │
│  ┌─ 修改意见 ──────────────┐ │
│  │ [文本框: 输入修改意见]    │ │
│  │ 例: "推镜头再慢一点,    │ │
│  │  结尾停顿更久"           │ │
│  │                          │ │
│  │ [🔄 重新生成]            │ │
│  │ [🔄 换 seed 重新生成]    │ │
│  │ [🔄 批量生成 3 版本]     │ │
│  └──────────────────────────┘ │
│                              │
│  ┌─ 依赖关系 ──────────────┐ │
│  │ → SEG09 使用本段尾帧     │ │
│  │ ⚠️ 修改本段会影响 SEG09  │ │
│  └──────────────────────────┘ │
└─────────────────────────────┘

11.4 重新生成流程

用户在时间线点击 SEG08 → 打开详情面板
  → 写修改意见: "推镜头再慢一点"
  → 点击 [重新生成]
  → 系统自动:
    1. 修改 prompt(根据修改意见调整)
    2. 提交到 ComfyUI(选择空闲 GPU)
    3. 时间线上 SEG08 显示 🔄 生成中
    4. 完成后显示新版本 → 用户 A/B 对比
    5. 如果有下游依赖(SEG09)→ 标记 ⚠️ 需要重做
    6. 用户确认后 → 自动重新编译完整视频

11.5 音频轨道交互

点击音频轨道上的块 → 可以:
  - 拖拽移动时间位置
  - 调整音量滑块
  - 试听单轨
  - 看 duck 区域(半透明标记)

点击空白处 → 可以:
  - 添加新音频块
  - 选择类型(BGM/旁白/台词/Foley/SFX)
  - 上传或从素材库选择

11.6 快捷操作

时间线快捷键:
  Space     — 播放/暂停预览
  ← →      — 逐段跳转
  1-9       — 跳到 SEG01-09
  R         — 重新生成选中段
  V         — 切换版本
  M         — 静音/取消静音选中轨道
  Ctrl+E    — 导出/编译完整视频

11.7 响应式设计

桌面 (>1200px):
  时间线占 70% 宽度,详情面板占 30%

平板 (768-1200px):
  时间线全宽,详情面板弹出为抽屉

手机 (<768px):
  段落列表视图(非时间线),点击展开详情

12多项目管理

12.1 数据结构

CineCog Studio/
├── projects/
│   ├── index.yaml                    # 项目索引
│   │
│   ├── velvet-ep01/                  # 一个视频工程 = 一个目录
│   │   ├── project.yaml             # 项目工程文件
│   │   ├── assets/
│   │   │   ├── characters/
│   │   │   ├── keyframes/
│   │   │   ├── grids/
│   │   │   ├── segments/
│   │   │   └── audio/
│   │   └── exports/
│   │       └── ep01-v7b-complete.mp4
│   │
│   ├── velvet-ep02/
│   │   ├── project.yaml
│   │   └── ...
│   │
│   └── suchka-brand-film/
│       ├── project.yaml
│       └── ...
│
├── library/                          # 跨项目共享资源
│   ├── characters/                   # 角色库(Character Sheets)
│   │   ├── vera/
│   │   │   ├── character-sheet.jpg
│   │   │   ├── profile.yaml
│   │   │   └── refs/
│   │   ├── sasha/
│   │   └── diana/
│   │
│   ├── music/                        # BGM 素材库
│   ├── sfx/                          # 音效库
│   └── voices/                       # TTS 参考音频库
│
└── config.yaml                       # 全局配置(GPU/API/路径)

12.2 项目索引 (index.yaml)

categories:
  - id: "velvet"
    name: "VELVET Series"
    description: "VELVET 品牌系列短片"
    color: "#DC2626"

  - id: "suchka"
    name: "Suchka Brand"
    description: "Suchka 品牌宣传"
    color: "#8B5CF6"

  - id: "experiments"
    name: "Experiments"
    description: "技术实验和测试"
    color: "#6B7280"

projects:
  - id: "velvet-ep01"
    name: "EP01 — I Chose This Name"
    category: "velvet"
    status: "completed"
    created: "2026-03-26"
    duration: 42.0
    segments: 12
    thumbnail: "velvet-ep01/exports/thumb.jpg"

  - id: "velvet-ep02"
    name: "EP02 — The Order"
    category: "velvet"
    status: "draft"

  - id: "suchka-brand-film"
    name: "Brand Film 2026"
    category: "suchka"
    status: "in_progress"

12.3 项目列表 UI

┌──────────────────────────────────────────────────────┐
│  CineCog Studio                    [+ 新建项目]       │
│                                                       │
│  ┌─ 分类筛选 ─────────────────────────────────────┐  │
│  │ [全部] [VELVET Series] [Suchka Brand] [实验]   │  │
│  └─────────────────────────────────────────────────┘  │
│                                                       │
│  VELVET Series                                        │
│  ┌─────────────────────────────────────────────────┐  │
│  │ 🎬 EP01 — I Chose This Name                    │  │
│  │ ✅ 已完成 · 42s · 12 segments · 2026-03-26     │  │
│  │ [▶️ 预览] [📝 编辑] [📋 复制]                    │  │
│  ├─────────────────────────────────────────────────┤  │
│  │ 🎬 EP02 — The Order                            │  │
│  │ 📝 草稿 · 0s · 0 segments · 2026-03-27         │  │
│  │ [📝 开始制作]                                    │  │
│  └─────────────────────────────────────────────────┘  │
│                                                       │
│  角色库                               [管理角色]       │
│  ┌────┐ ┌────┐ ┌────┐ ┌────┐                        │
│  │Vera│ │Sasha│ │Diana│ │ +  │                        │
│  └────┘ └────┘ └────┘ └────┘                        │
└──────────────────────────────────────────────────────┘

12.4 新建项目向导

[+ 新建项目]
     ↓
┌──────────────────────────────────┐
│  新建视频工程                     │
│                                  │
│  项目名称: [________________]    │
│  分类: [▼ VELVET Series    ]    │
│                                  │
│  角色选择:                        │
│  ● 从角色库选择                   │
│    [▼ Vera - The Sovereign ]    │
│  ○ 创建临时角色                   │
│    [输入描述...]                  │
│                                  │
│  服装:                            │
│  ● 使用角色默认服装               │
│  ○ 自定义服装                     │
│    [JSON 编辑器...]              │
│                                  │
│  [取消]            [创建项目 →]   │
└──────────────────────────────────┘

12.5 跨项目共享

角色库是全局的 — 同一个 Vera 可以用在 EP01、EP02、Brand Film 里。修改角色 Character Sheet 时提醒:

"⚠️ 这个角色被 3 个项目使用中。修改会影响新生成的内容。已完成的视频不受影响。"

13计算资源配置(可扩展)

13.1 设计目标

GPU/算力资源通过配置文件管理,支持动态扩展:本地 GPU、远程 GPU、Comfy Cloud。系统自动选择空闲资源,负载均衡。

13.2 资源配置 (config.yaml)

compute:
  # 本地 GPU(通过 ComfyUI API)
  local_gpus:
    - id: "gpu-local-0"
      type: "local"
      name: "RTX 4090 #0"
      host: "gpu-local"
      port: 8188
      vram: 24
      priority: 2
      capabilities: ["fmlf", "i2v", "mmaudio", "infinitetalk"]
      max_concurrent: 1

    - id: "gpu-local-1"
      type: "local"
      name: "RTX 4090 #1"
      host: "gpu-local"
      port: 8189
      vram: 24
      priority: 1               # 首选,散热更好
      capabilities: ["fmlf", "i2v", "mmaudio", "infinitetalk", "tts"]
      max_concurrent: 1

  # 远程 GPU(未来扩展)
  remote_gpus:
    - id: "runpod-a100"
      type: "remote"
      name: "RunPod A100 80GB"
      vram: 80
      cost_per_hour: 1.99
      auto_shutdown: true
      max_concurrent: 4

  # Comfy Cloud 账号
  cloud_accounts:
    - id: "comfy-cloud-1"
      type: "comfy_cloud"
      plan: "pro"
      monthly_credits: 1000
      max_concurrent: 2

  # Replicate(用于特定模型)
  replicate:
    - id: "replicate-1"
      capabilities: ["ltx_pro", "seedance", "kling"]
      max_concurrent: 10

  # 调度策略
  scheduler:
    strategy: "priority_first"    # priority_first | cost_first | speed_first
    fallback: true
    queue_timeout: 300
    retry_on_error: 2

    # 任务类型 → 首选资源映射
    task_routing:
      fmlf: ["gpu-local-1", "gpu-local-0", "comfy-cloud-1"]
      i2v: ["gpu-local-1", "gpu-local-0", "comfy-cloud-1"]
      infinitetalk: ["gpu-local-1", "gpu-local-0"]
      mmaudio: ["gpu-local-0", "gpu-local-1"]
      tts: ["gpu-local-1"]

13.3 资源状态面板 UI

┌──────────────────────────────────────────┐
│  计算资源                    [+ 添加资源]  │
│                                          │
│  本地 GPU                                │
│  ┌────────────────────────────────────┐  │
│  │ 🟢 RTX 4090 #1 (gpu-local:8189)  │  │
│  │    VRAM: 18.5/24 GB  │ 🔄 SEG08   │  │
│  ├────────────────────────────────────┤  │
│  │ 🟢 RTX 4090 #0 (gpu-local:8188)  │  │
│  │    VRAM: 空闲        │ ⏳ 待分配   │  │
│  └────────────────────────────────────┘  │
│                                          │
│  Cloud                                   │
│  ┌────────────────────────────────────┐  │
│  │ ⚪ Comfy Cloud (未激活)            │  │
│  │    Credits: 1000/1000              │  │
│  ├────────────────────────────────────┤  │
│  │ ⚪ RunPod A100 (关机)              │  │
│  │    [启动] $1.99/hr                 │  │
│  └────────────────────────────────────┘  │
│                                          │
│  任务队列: 2 running / 3 pending         │
└──────────────────────────────────────────┘

13.4 自动调度逻辑

def schedule_task(task):
    """选择最优计算资源"""
    # 1. 获取任务类型的首选资源列表
    candidates = config.scheduler.task_routing[task.type]

    # 2. 过滤在线且有空闲 slot 的资源
    available = [r for r in candidates
                 if r.status == "online"
                 and r.current_tasks < r.max_concurrent]

    # 3. 按策略排序
    if config.scheduler.strategy == "priority_first":
        available.sort(key=lambda r: r.priority)
    elif config.scheduler.strategy == "cost_first":
        available.sort(key=lambda r: r.cost_per_hour)

    # 4. 分配或排队
    if available:
        return assign(task, available[0])
    elif config.scheduler.fallback:
        return enqueue(task)  # 等待资源释放
    else:
        raise NoResourceAvailable()

14项目流程地图(Pipeline Map)

14.1 设计理念

每个项目在 UI 顶部显示一个可视化的流程地图,类似 CI/CD pipeline 视图。

14.2 流程地图可视化

                    ┌─────────────┐
                    │ 📋 角色设定  │
                    │   ✅ 已完成  │
                    └──────┬──────┘
                           │
                    ┌──────┴──────┐
                    │ 👗 服装规范  │
                    │   ✅ 已完成  │
                    └──────┬──────┘
                           │
                    ┌──────┴──────┐
                    │ 📖 故事方向  │
                    │   ✅ 已完成  │
                    └──────┬──────┘
                           │
              ┌────────────┼────────────┐
              │            │            │
       ┌──────┴──────┐ ┌──┴───┐ ┌──────┴──────┐
       │ 🎬 分场剧本  │ │🎵 BGM│ │ 🗣 旁白 TTS │
       │   ✅ 已完成  │ │ ✅   │ │   ✅ 已完成  │
       └──────┬──────┘ └──────┘ └─────────────┘
              │
    ┌─────────┴──────────────────────────────────┐
    │           九宫格 + 审查(可并行)              │
    │                                             │
    │  ┌──────┐┌──────┐┌──────┐┌──────┐┌──────┐ │
    │  │SEG02 ││SEG06 ││SEG07 ││SEG08 ││SEG11 │ │
    │  │ ✅   ││ ✅   ││ ✅   ││ ✅   ││ ⚠️   │ │
    │  └──────┘└──────┘└──────┘└──────┘└──────┘ │
    └─────────┬──────────────────────────────────┘
              │
    ┌─────────┴──────────────────────────────────────────────────┐
    │              视频生成(按依赖关系调度)                        │
    │                                                             │
    │  独立段落(可并行)              有依赖(串行)                │
    │  ┌────┐┌────┐┌────┐┌────┐     ┌────┐    ┌────┐           │
    │  │ 01 ││ 02 ││ 03 ││ 04 │     │ 08 │───→│ 09 │           │
    │  │ ✅ ││ ✅ ││ ✅ ││ ✅ │     │ ✅ │    │ ✅ │           │
    │  └────┘└────┘└────┘└────┘     └────┘    └────┘           │
    │  ┌────┐┌────┐┌────┐┌────┐              ↑                  │
    │  │ 05 ││ 06 ││ 07 ││ 10 │         ┌────┴───┐             │
    │  │ ✅ ││ ✅ ││ ✅ ││ ✅ │         │TTS 台词│             │
    │  └────┘└────┘└────┘└────┘         │  ✅    │             │
    │  ┌────┐┌────┐                     └────────┘             │
    │  │ 11 ││ 12 │                                             │
    │  │ ⚠️ ││ ✅ │                                             │
    │  └────┘└────┘                                             │
    └─────────┬──────────────────────────────────────────────────┘
              │
    ┌─────────┴──────────────────────────────────┐
    │           音效 Foley(可并行)                │
    │  ┌────┐┌────┐┌────┐┌────┐┌────┐┌────┐    │
    │  │ 02 ││ 06 ││ 07 ││ 08 ││ 10 ││ 11 │    │
    │  │ ✅ ││ ✅ ││ ✅ ││ ✅ ││ ✅ ││ ✅ │    │
    │  └────┘└────┘└────┘└────┘└────┘└────┘    │
    └─────────┬──────────────────────────────────┘
              │
       ┌──────┴──────┐
       │ 🔊 混音编译  │
       │   ✅ 已完成  │
       └──────┬──────┘
              │
       ┌──────┴──────┐
       │ 📤 导出发布  │
       │   ✅ v7b    │
       └─────────────┘

14.3 节点状态样式

/* 已完成 */
.node-completed {
  background: #065F46;       /* 深绿 */
  border: 2px solid #10B981;
  color: #D1FAE5;
}

/* 进行中 */
.node-in-progress {
  background: #1E3A5F;       /* 深蓝 */
  border: 2px solid #3B82F6;
  animation: pulse 2s infinite;
}

/* 可以开始 */
.node-ready {
  background: transparent;
  border: 2px solid #9CA3AF;
  color: #D1D5DB;
}

/* 被锁定 */
.node-locked {
  background: #1F2937;
  border: 2px dashed #4B5563;
  color: #6B7280;
  opacity: 0.5;
}

/* 需要重做 */
.node-needs-redo {
  background: #78350F;       /* 深橙 */
  border: 2px solid #F59E0B;
  color: #FEF3C7;
}

14.4 交互设计

点击任何节点 → 展开该阶段的详细视图:
  - 已完成: 显示结果预览 + "重新执行"按钮
  - 进行中: 显示进度条 + 预计剩余时间
  - 可以开始: 显示"开始"按钮 + 前置条件清单
  - 被锁定: 显示依赖关系 + 哪些前置还没完成
  - 需要重做: 显示原因(哪个上游节点被修改了)+ "重新执行"

并行分支之间画水平连线,表示可以同时进行。
串行依赖画箭头 →,表示必须按顺序。

鼠标悬停在依赖箭头上 → 高亮显示完整依赖链。

14.5 实时更新

当 ComfyUI 任务完成时:
  1. WebSocket 推送状态变更
  2. 流程图对应节点动画变为 ✅
  3. 下游被锁定的节点自动解锁(如果所有依赖已满足)
  4. 通知用户"SEG08 生成完成,SEG09 现在可以开始"

14.6 迷你版(时间线上方常驻)

┌──────────────────────────────────────────────────────────┐
│ 👤✅ → 👗✅ → 📖✅ → ┬ 🎬✅ → 🎥 11/12✅ → 🔊✅ → 📤✅ │
│                       ├ 🎵✅                              │
│                       └ 🗣✅                              │
└──────────────────────────────────────────────────────────┘

点击任何图标 → 跳转到对应阶段的详细视图。

15角色声音身份(Voice Identity)

15.1 角色 = 视觉 + 声音

Character Sheet 解决视觉一致性,但角色还需要声音身份。在 Phase 0 创建角色时,视觉和声音同步完成。

角色创建向导:
  Step 1: 视觉 — Character Sheet(从头到鞋)
  Step 2: 声音 — Voice Identity(音色/语速/情感)  ← 新增!
  Step 3: 人物设定(性格/背景/台词风格)

15.2 声音设定数据结构

characters:
  vera:
    voice:
      identity:
        tone: "低沉、冷静、有控制力"
        pace: "偏慢,每句之间有停顿"
        accent: "标准美式英语,略带欧洲质感"
        emotional_range: "冰冷蔑视 → 克制威严 → 罕见柔软"
        signature: "句尾微微下沉,像在宣判"

      reference_audio:
        zh: "voices/vera/vera-voice-zh-ref.mp3"
        en: "voices/vera/vera-voice-en-ref.mp3"
        ru: "voices/vera/vera-voice-ru-ref.mp3"

      tts_config:
        primary_engine: "IndexTTS-2"
        fallback_engine: "CosyVoice"
        settings:
          speed: 0.85
          temperature: 0.7

      locked_samples:
        - file: "voices/vera/vera-index-en-v2.mp3"
          text: "I don't explain myself."
          status: "approved"
        - file: "voices/vera/vera-index-zh-v2.mp3"
          text: "我不解释。"
          status: "approved"

15.3 声音创建流程

新角色 → 声音设计向导:

方式 A: 从声音库选择
  → 预设声音模板(冷酷女性/温柔旁白/沧桑男性/...)
  → 试听 → 确认

方式 B: 描述生成
  → 用户输入: "低沉冷静的女性声音,像在宣判"
  → 系统用 Qwen-TTS VoiceDesign 生成候选
  → 用户试听 A/B/C → 选择最佳
  → 用选中的声音生成参考音频(一段 5-10 秒的标准朗读)

方式 C: 上传参考
  → 用户上传一段真人录音
  → 系统提取声纹特征
  → IndexTTS-2 锁定声音

所有方式最终输出:
  → 参考音频文件(zh + en)
  → TTS 引擎配置
  → 2-3 个已锁定的样本(通过审听)

15.4 Web UI — 声音设计面板

┌──────────────────────────────────────┐
│  🔊 角色声音 — Vera                  │
│                                      │
│  ┌─ 声音身份 ─────────────────────┐ │
│  │ 音色: 低沉、冷静、有控制力       │ │
│  │ 语速: 偏慢                      │ │
│  │ 特征: 句尾微微下沉              │ │
│  │ [编辑]                          │ │
│  └──────────────────────────────────┘ │
│                                      │
│  ┌─ 参考音频 ─────────────────────┐ │
│  │ EN: vera-voice-en-ref.mp3  [▶️] │ │
│  │ ZH: vera-voice-zh-ref.mp3  [▶️] │ │
│  │ [上传新参考] [AI 生成]          │ │
│  └──────────────────────────────────┘ │
│                                      │
│  ┌─ 试听锁定样本 ─────────────────┐ │
│  │ "I chose this name..." [▶️] ✅  │ │
│  │ "我不解释。"          [▶️] ✅  │ │
│  │ [+ 生成新样本]                  │ │
│  └──────────────────────────────────┘ │
│                                      │
│  ┌─ 快速生成 ─────────────────────┐ │
│  │ 输入台词: [________________]    │ │
│  │ 语言: [▼ English]              │ │
│  │ [🔊 生成试听]                   │ │
│  └──────────────────────────────────┘ │
└──────────────────────────────────────┘

15.5 在项目中使用

当段落需要台词时:

SEG09 → 需要台词 → 选择角色声音 → 输入文本 → 一键 TTS
  → 生成音频 → 试听 → 确认 → 自动传入 InfiniteTalk

声音参考在角色级别维护,不在项目级别 — 同一个 Vera 的声音在所有项目中一致。

16旁白声音系统(Narrator Voice)

16.1 旁白 vs 角色声音

角色声音 = 角色说台词(InfiniteTalk 驱动口型)
旁白声音 = 画外音,不需要口型同步,独立于任何角色

一个项目可以有:

16.2 旁白配置

project:
  narrator:
    voice_id: "the-order"          # 从声音库选择
    settings:
      language: "en"
      speed: 0.9
      tone: "沉稳、有距离感、全知视角"
    reference_audio:
      en: "voices/narrators/the-order-en-ref.mp3"
      zh: "voices/narrators/the-order-zh-ref.mp3"

16.3 声音库(全局共享)

voice_library:
  # 角色声音
  character_voices:
    - id: "vera"
      name: "Vera — The Sovereign"
      type: "character"
      samples: ["voices/vera/sample-en.mp3", "voices/vera/sample-zh.mp3"]

    - id: "sasha"
      name: "Sasha — The Risen"
      type: "character"

  # 旁白声音
  narrator_voices:
    - id: "the-order"
      name: "The Order (全知旁白)"
      type: "narrator"
      tone: "沉稳权威,像纪录片旁白"

    - id: "noir-narrator"
      name: "Film Noir Narrator"
      type: "narrator"
      tone: "低沉沙哑,像老派侦探独白"

    - id: "custom"
      name: "[+ 创建新旁白声音]"
      type: "create_new"

16.4 项目向导中的声音选择

Step 1: 角色 (Character Sheet + Voice) ← 已有
Step 2: 旁白声音                        ← 新增
  ● 从声音库选择
    [▼ The Order (全知旁白)    ] [▶️ 试听]
    [▼ Film Noir Narrator      ] [▶️ 试听]
  ○ 创建新旁白
    描述: [低沉神秘的女性旁白_______]
    [🔊 AI 生成候选]
  ○ 不使用旁白

Step 3: 故事方向 → ...

17补充需求汇总

17.1 导出 & 发布

export:
  formats:
    - type: "tiktok"
      resolution: [1080, 1920]     # 上采样
      fps: 30
      max_duration: 60
      watermark: "velvet-logo.png"
      subtitles: true              # 烧入中文字幕

    - type: "instagram_reels"
      resolution: [1080, 1920]
      fps: 30
      max_duration: 90

    - type: "youtube_shorts"
      resolution: [1080, 1920]
      fps: 30

    - type: "master"
      resolution: [576, 1024]      # 原始分辨率
      fps: 32
      no_watermark: true

  publish:
    targets:
      - platform: "velvet_site"
        url: "https://velvet.dev.suchka.me"
        auto_deploy: true
      - platform: "tiktok"
        auto_publish: false

17.2 字幕系统

subtitles:
  seg09:
    text_en: "I chose this name. Not to be loved. To be remembered."
    text_zh: "这个名字,是我自己选的。不是为了被爱,是为了被记住。"
    start: 26.6
    end: 31.7
    style:
      font: "Cinzel"
      size: 24
      color: "#DCD4C8"
      position: "bottom_center"
      background: "rgba(0,0,0,0.5)"

17.3 项目模板

templates:
  - id: "brand_film_30s"
    name: "品牌短片 (30秒)"
    segments: 8
    structure:
      - {type: "title_card", duration: 2}
      - {type: "hook_shot", duration: 3}
      - {type: "flashback_marker", duration: 1.5}
      - {type: "scene", duration: 5, count: 3}
      - {type: "speech", duration: 5}
      - {type: "exit", duration: 5}
      - {type: "end_card", duration: 2.5}

  - id: "character_intro_15s"
    name: "角色介绍 (15秒)"
    segments: 4

  - id: "product_showcase_20s"
    name: "产品展示 (20秒)"
    segments: 6

17.4 协作 & 评论(未来)

# 未来扩展:多人协作
collaboration:
  comments:
    - segment: SEG08
      user: "jixian"
      time: "2026-03-26T16:24:00"
      text: "推镜头再慢一点,结尾停顿更久"
      resolved: true

  review_requests:
    - from: "kai"
      to: "jixian"
      segments: [SEG08, SEG09]
      message: "SEG08→09 衔接重做了,请看一下"

17.5 版本历史 & 回滚

# 项目级别的版本历史
project_versions:
  - version: "v7b"
    timestamp: "2026-03-26T19:44:00"
    changes: ["SEG11 重做", "音效音量调整"]
    exportable: true

  - version: "v6"
    timestamp: "2026-03-26T17:50:00"
    changes: ["加入 MMAudio 环境音效"]
    exportable: true

  # 可以回滚到任何历史版本
  # 每个版本保存完整的 project.yaml 快照

17.6 统计 & 成本追踪

stats:
  total_generations: 47           # 今天 EP01 跑了 47 次
  total_gpu_hours: 3.2
  total_api_calls: 23             # Gemini 九宫格
  estimated_cost:
    gpu_local: "$0"               # 自有硬件
    gemini_api: "$2.30"
    replicate: "$0"
    total: "$2.30"

  per_segment_stats:
    SEG11:
      generations: 12             # 重做最多的段
      reason: "角色一致性问题"

18技术文档目录总结

章节标题状态
1系统概述
2项目工程文件 (YAML)
3Web 管理界面功能
4技术架构
5向导式工作流
6审查流程(人类审查)
7Character Sheet 系统
8完整服装要求
9完整创作流程(角色到成片)
10并行任务 & 依赖关系
11时间线编辑器
12多项目管理
13计算资源配置
14项目流程地图
15角色声音身份
16旁白声音系统
17补充需求(导出/字幕/模板/协作/版本/统计)
18目录总结
19AI 驱动架构
20前端渲染规范

19AI 驱动架构(核心设计哲学)

19.1 核心理念

CineCog Studio 不是一个传统的自动化工具。它是一个为 AI Agent 提供结构化上下文的界面。

传统模式:
  UI → 固定代码逻辑 → ComfyUI API → 输出
  (每种场景都要写代码)

CineCog 模式:
  UI → 收集/组织信息 → AI Agent(结构化上下文)→ 决策 + 执行 → 输出
  (AI 根据上下文自主决定怎么做)

19.2 系统角色分工

UI 的职责(收集信息,不做决策):
  - 管理项目/角色/服装/声音的数据
  - 展示生成结果、版本对比
  - 收集用户的审查意见和修改要求
  - 展示进度和依赖关系
  - 提供结构化的表单输入

AI Agent 的职责(理解意图,做决策):
  - 读取项目 YAML(结构化上下文)
  - 理解用户的自然语言修改意见
  - 决定用 FMLF 还是 I2V 还是 InfiniteTalk
  - 决定 prompt 怎么写
  - 决定参数怎么调
  - 决定 Split Reference 用不用、用哪张
  - 处理异常(OOM → 加 block_swap,闪白 → 降 mid_strength)
  - 调用 ComfyUI API 执行
  - 评估结果质量

系统(后端)的职责(执行和存储):
  - YAML 读写
  - 文件管理(视频/图片/音频)
  - ffmpeg 混音/拼接(AI 给出参数,系统执行)
  - ComfyUI API 代理
  - WebSocket 状态推送

19.3 上下文组装

当用户在 UI 上操作时,系统自动组装完整上下文给 AI:

# AI 收到的上下文(自动从项目 YAML + UI 状态组装)
context:
  project: "EP01"
  current_segment: "SEG11"

  # 角色信息
  character:
    sheet: "vera-character-sheet.jpg"
    costume: "Long-sleeved black velvet..."
    voice: "vera-voice-en-ref.mp3"

  # 当前段落状态
  segment:
    type: "i2v"
    keyframe: "seg11-heels-start.jpg"
    split_reference: "vera-back-ref.jpg"
    versions: [{v:1, status:"rejected", note:"露背"}, ...]
    current_prompt: "CAMERA: crane up..."

  # 用户的修改要求(自然语言)
  user_request: "推镜头再慢一点,结尾停顿更久"

  # 可用资源
  gpus: [{id:"gpu-local-1", status:"idle"}]

  # 历史经验(从 LEARNINGS 自动注入)
  relevant_learnings:
    - "有动作的镜头最低 4 秒"
    - "Split Reference: start_image ≠ clip_vision"
    - "InfiniteTalk 音频 ≥ 3 秒"

19.4 AI 决策示例

用户: "推镜头再慢一点"
  ↓
AI 分析上下文:
  - 当前 SEG11 是 105 帧 (6.5秒)
  - "慢一点" → 增加帧数到 129 (8秒)
  - prompt 里加 "very slow, gradual"
  - seed 保持不变(用户没说换)
  ↓
AI 生成 ComfyUI workflow JSON
  ↓
提交到空闲 GPU
  ↓
结果回传 → UI 显示新版本

用户: "这个视频的衣服不对"
  ↓
AI 分析:
  - 检查关键帧 vs costume spec
  - 发现关键帧里是短袖,spec 要求长袖
  - 决定:需要重新生成九宫格,不是换 seed
  ↓
AI: "关键帧里的衣服就是错的,需要重新生成九宫格。
     我会在 prompt 里强调 long-sleeved。"
  ↓
重新生成九宫格 → 裁切 → 审查

19.5 不需要写死的逻辑

传统方式(写死代码)CineCog 方式(AI 决策)
if method=="fmlf": use_fmlf()AI 根据场景特征自己选方法
if flash_detected: lower_mid_strength()AI 分析问题原因,决定修哪个参数
prompt = template.format(costume=spec)AI 根据关键帧内容和修改意见写 prompt
if seg09: wait_for_seg08()AI 理解依赖关系,自动调度
frames = duration * 16 + 8AI 根据动作复杂度决定帧数

19.6 技术实现

┌─────────────────────────────────────────┐
│           CineCog Studio Web            │
│    (收集信息 + 展示结果 + 用户交互)      │
└────────────────┬────────────────────────┘
                 │ REST API + WebSocket
┌────────────────┴────────────────────────┐
│         CineCog Backend                  │
│  ┌──────┐ ┌────────┐ ┌──────┐          │
│  │YAML  │ │Context │ │File  │          │
│  │Store │ │Builder │ │Mgr   │          │
│  └──────┘ └───┬────┘ └──────┘          │
│               │ 组装上下文               │
│         ┌─────┴──────┐                   │
│         │ AI Agent   │ ← OpenClaw / LLM  │
│         │ (决策引擎)  │                   │
│         └─────┬──────┘                   │
│               │ 执行指令                  │
│  ┌──────┐ ┌───┴────┐ ┌──────┐          │
│  │ComfyUI│ │ffmpeg │ │TTS   │          │
│  │Client │ │Mixer  │ │Client│          │
│  └──────┘ └────────┘ └──────┘          │
└─────────────────────────────────────────┘

19.7 好处

  1. 灵活性极高 — 新场景不需要写新代码,AI 自动适应
  2. 自然语言交互 — 用户说"慢一点"就行,不需要知道改哪个参数
  3. 经验积累 — AI 从 LEARNINGS 中学习,越用越好
  4. 异常处理 — AI 自己诊断问题(OOM/闪白/色差)并修复
  5. 可解释性 — AI 可以告诉用户"我为什么做这个决定"

20前端渲染规范

20.1 ASCII 图表必须使用等宽字体

所有 ASCII 艺术、时间线布局、流程图、代码块必须用等宽字体渲染:

pre, code, .ascii-diagram, .timeline-ascii, .pipeline-map {
  font-family: 'JetBrains Mono', 'Fira Code', 'Source Code Pro', 'Consolas', monospace;
  line-height: 1.4;
  letter-spacing: 0;
}

否则中文字符(占 2 个等宽位)和英文字符(占 1 个等宽位)对不齐,表格和框线全部错位。

20.2 但实际 UI 不应该用 ASCII 图表

技术文档里的 ASCII 图表是为了表达设计意图。实际 UI 应该用:

ASCII 图表只用于文档和终端输出。