CineCog Studio — 技术文档
01系统概述
CineCog Studio 是一个自部署的 Web 管理系统,专为 AI 视频内容生产设计。管理从剧本到成片的完整生产流程,包括关键帧、多版本视频、音频混音、审查流程。
1.1 核心问题(来自 EP01 生产经验)
- 关键帧一致性难以控制(Gemini 不遵守 costume spec)
- 多版本素材管理靠文件名和记忆
- 重做某一段后需要手动重新拼接整片
- 音频混音参数(时间点、音量、淡入淡出)每次手写 ffmpeg
- 没有系统化的审查流程
1.2 设计目标
- 项目工程文件 (YAML) — 单一来源记录所有生产参数
- 版本管理 — 每段保留多个版本,可切换/对比
- 一键重编译 — 修改任意段落后自动重新拼接完整视频
- 审查 Gate — 关键帧视觉审查集成到流程
- ComfyUI 集成 — 从界面直接触发视频生成
- 音频混音器 — 可视化管理 BGM/旁白/音效/台词的时间轴
02项目工程文件格式 (YAML)
2.1 为什么选 YAML
- 人类可读可手动编辑
- 支持注释(记录决策原因)
- 支持多行字符串(长 prompt)
- API 交互时自动序列化为 JSON
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 项目概览页
- 时间线可视化(每段缩略图 + 时长条)
- 总时长、段落数、完成状态
- 一键播放完整成片
- 一键重编译(修改后重新 concat + mix)
3.2 段落详情页
- 关键帧查看(九宫格 + 选中的 panel 标记)
- 版本列表(缩略图 + 播放 + 状态标签)
- A/B 版本对比播放
- 生成参数展示(seed, frames, prompt)
- 审查 checklist(每项 pass/fail)
- "重新生成"按钮 → 调用 ComfyUI API
3.3 Costume Spec 管理
- 编辑服装描述
- 查看哪些段落引用此 spec
- 修改后高亮受影响的段落
3.4 音频混音器
- 时间轴视图:BGM / 旁白 / 台词 / 音效 / Foley
- 拖拽调整时间点
- 音量滑块
- Duck 区域可视化
- 实时预览混音效果
3.5 角色管理
- 参考图集管理(5 slots + angle refs)
- Split Reference 配置
- 一键生成 collage
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 技术栈
- Frontend: Next.js 14 + Tailwind CSS + shadcn/ui
- Backend: Python FastAPI
- Storage: 文件系统 + YAML 项目文件(不需要数据库)
- Video: ffmpeg(concat / mix / trim / interpolate)
- AI: ComfyUI API(视频生成 / 音效生成)
- Deploy: Docker on gpu-local, 域名 studio.dev.suchka.me
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"
}
}
优势:
- Gemini/Nano Banana Pro 对 JSON 的服从度 > 自然语言
- 结构化 = 可自动生成、可程序化修改
- 每个字段可以在 Web 界面做成表单输入
- 不同段落只需修改 pose/expression/camera 字段
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 核心原则
- 人类审查 > AI 审查 — AI 审查漏检率高(EP01 实测多次漏掉发型/露背/丝袜问题)
- 小图即可 — 九宫格裁切的 ~512×917 小图足够人眼判断,不需要上采样
- 合格/不合格都标注 — 方便回溯和重新选帧
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 审查的关系
- AI 审查不再作为 gate(不阻止流程)
- AI 审查可选辅助:用户可以点"AI 预检"按钮,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 使用方式
- 方式 A: 单张 Character Sheet 作为唯一参考图(替代 5 slots)
- 方式 B: Character Sheet + 正面大图(2 张输入)
- 方式 C: 保持 5 slots 但更系统化
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 集成
- 角色管理页面:查看/编辑 Character Sheet
- 拖拽调整 slot 里的图片
- 一键从素材库自动生成
- 临时角色:用户上传照片 → AI 生成多角度 → 自动拼 Sheet
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 驱动口型)
旁白声音 = 画外音,不需要口型同步,独立于任何角色
一个项目可以有:
- 0-N 个角色声音(跟角色绑定)
- 0-1 个旁白声音(跟项目绑定)
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) | ✅ |
| 3 | Web 管理界面功能 | ✅ |
| 4 | 技术架构 | ✅ |
| 5 | 向导式工作流 | ✅ |
| 6 | 审查流程(人类审查) | ✅ |
| 7 | Character Sheet 系统 | ✅ |
| 8 | 完整服装要求 | ✅ |
| 9 | 完整创作流程(角色到成片) | ✅ |
| 10 | 并行任务 & 依赖关系 | ✅ |
| 11 | 时间线编辑器 | ✅ |
| 12 | 多项目管理 | ✅ |
| 13 | 计算资源配置 | ✅ |
| 14 | 项目流程地图 | ✅ |
| 15 | 角色声音身份 | ✅ |
| 16 | 旁白声音系统 | ✅ |
| 17 | 补充需求(导出/字幕/模板/协作/版本/统计) | ✅ |
| 18 | 目录总结 | ✅ |
| 19 | AI 驱动架构 | ✅ |
| 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 + 8 | AI 根据动作复杂度决定帧数 |
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 好处
- 灵活性极高 — 新场景不需要写新代码,AI 自动适应
- 自然语言交互 — 用户说"慢一点"就行,不需要知道改哪个参数
- 经验积累 — AI 从 LEARNINGS 中学习,越用越好
- 异常处理 — AI 自己诊断问题(OOM/闪白/色差)并修复
- 可解释性 — 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 应该用:
- Canvas / SVG 绘制时间线
- CSS Grid / Flexbox 做段落卡片布局
- D3.js 或 React Flow 做流程地图 DAG
- Wavesurfer.js 做音频波形可视化
ASCII 图表只用于文档和终端输出。