- frontend/: Next.js 16 app (App Router, React 19, Tailwind v4) - skills/: project skills (seedance, automation, trae-agents, etc.) - Docs: PRD, UI-Design-System, DEV-LOG, seedance integration notes - skills-lock.json: skills version lock Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
13 KiB
13 KiB
Air Spark — PRD
v0.4 | 2026-03-04
1. 产品定位
AI 驱动的动画自动化生产平台。导演通过对话生成剧本,系统自动串联图片生成 → 视频生成 → 拼接,输出完整成片。
先供 Air Spark 内部使用,架构支持未来扩展为 SaaS。
2. 用户角色
| 角色 | 核心需求 |
|---|---|
| 导演 | 对话写剧本 → 一键触发流水线 → 审核成片 |
| 管理员 | 管理成员、API Key、Skill 配置 |
3. 内容层级
项目(Project) ← 一部动画 IP,建立时选内容类型 → 自动加载 Skill 包
├── 资产库(Asset Library) ← 角色/场景图,跨集跨阶段复用
└── 剧集(Episode) ← EP01, EP02 ...
├── 剧本(script.md)
├── 流水线状态
└── 各阶段输出文件
4. Agent + Skill 架构
核心设计原则:模型 + Skill = Agent
Skill 是系统提示词(System Prompt),定义 Agent 的行为规则和输出格式。 扩展内容类型 = 新增 Skill,不需要改代码。
screenplay-skill → 生成符合 Seedance 输入格式的剧本(△行即提示词)
storyboard-skill → 按场景生成 Keyshot 宫格图(空间位置锚点)
segmentation-skill → 按内容逻辑将剧本切分为 Seedance 片段(内容驱动,非机械按秒切)
两条并行线,都以剧本为输入,互不依赖:
剧本 → storyboard-skill → Keyshot 图(空间参考)
↘
剧本 → segmentation-skill → 片段提示词 → Seedance(提示词 + 参考图)
↗
剧本 → 参考图生成(Banana Pro)→ 人设图、场景图
5. 七阶段流水线
Stage 1 剧本对话
只加载 screenplay-skill
导演与 Claude 对话,生成符合 Seedance 格式的剧本
满意后点「确认剧本」→ 保存 script.md
↓ [手动确认]
Stage 2 资产 & 分镜规划(Claude · storyboard-skill)
读取 script.md → 输出:
· characters.json 角色列表 + 英文提示词 + 标记性特征
· scenes.json 场景列表 + 英文提示词 + 每场估算时长
· keyshots.json 每场景的 Keyshot 规划:
- 格数(4格/9格,按时长自动选)
- 每格的空间位置描述(英文)
- 宫格图生成提示词
时长估算规则(与 segmentation-skill 共用):
对白:3-4字/秒;普通动作:2-3秒;复杂动作:4-5秒
格数规则:
场景 ≤ 45秒 → 4宫格(2×2,每格~11秒)
场景 45秒-2分钟 → 9宫格(3×3,每格~8-13秒)
场景 > 2分钟 → 拆成两个9宫格(在自然剧情节点分割)
↓ [可选审核]
Stage 3 参考图生成(Banana Pro API · text2img)
每类图片生成规则:
人设图 × N(每角色两步生成):
Step 1:生成正面立绘(白色背景)→ character_{id}_front.jpg
Step 2:以正面立绘 + 固定三视图模板后缀为输入,生成三视图
→ 输出一张 16:9 图:包含正面胸像(左)+ 正面全身 + 侧面 + 背面
→ 最终存入资产库:character_{id}.jpg
小提示词后缀(固定模板,后续由用户提供):
"生成这个角色的三视图,包括:正面胸像(位于画布最左侧),正面视角、侧面视角、背面视角,浅灰色无缝背景,干净且简约"
场景图 × M(每场景1张,最佳角度,不含角色)
道具图 × K(重要道具,按需)
→ 存入资产库(命名与 characters.json / scenes.json 的 id 一一对应)
↓ [人工审核:动画前期必须确认人设]
Stage 4 Keyshot 宫格生成(Banana Pro API · text2img)
读取 keyshots.json:每个场景 → 1次 API 调用
输入:宫格提示词 + 该场景人设图 + 场景图(来自资产库)
生成尺寸:
4宫格 → 2560×1440(裁切后每格 1280×720)
9宫格 → 3840×2160(裁切后每格 1280×720)
PIL 精确裁切(本地,零成本):
→ keyshot_{scene_id}_{keyshot_index}_{cell_num}.jpg
Keyshot 映射:
每段 Seedance 片段按起始时码查找对应 Keyshot cell
cell_num = floor((seg_start - scene_start) / cell_duration) + 1
↓ [可选审核:快速扫一遍,确认空间位置无明显错误]
Stage 5 剧本切分(Claude · segmentation-skill)
读取 script.md → 按内容逻辑切分(非机械按秒):
依据:场景边界(必切)、镜头切换点、对话节奏、情绪节点
上限:每段 ≤ 15秒(Seedance 2.0 最大时长)
输出:segments.json
每段包含:
- 时码、时长、场景ID、出场角色ID
- Seedance 提示词文本(剧本原文,一字不改)
- 参考图列表(语义声明):
[{"type":"character","id":"char_001"},
{"type":"scene","id":"scene_002"},
{"type":"keyshot","scene_id":"scene_002","keyshot_index":1,"cell_num":3}]
不使用 prev_frame(上一段尾帧):
- prev_frame 依赖上一段视频已生成,强制串行,破坏并发
- Seedance 2.0 参生机制(人设图+场景图+keyshot+提示词)已保障角色一致性
- keyshot cell 图承担空间位置锚点,替代尾帧的连续性职责
- 不同场景之间本就是"硬切",不需要尾帧衔接
↓ [可选审核]
Stage 6 视频生成(Seedance 2.0 · 全并发)
前置条件:Stage 3(参考图)+ Stage 4(Keyshot 格图)+ Stage 5(segments.json)均完成
所有片段同时提交,无任何顺序依赖
Seedance API 请求结构(火山引擎 Ark):
content 数组(按顺序排列):
1. {type: "text", text: <完整提示词>}
2. {type: "image_url", image_url: {url: <图1>}, role: "reference_image"}
3. {type: "image_url", image_url: {url: <图2>}, role: "reference_image"}
...(最多 12 张,每张 role 均为 "reference_image")
其他参数:generate_audio: true,duration: 片段时长,ratio: 项目视频比例
提示词结构(后端自动拼装):
{script_text(剧本原文,一字不改)}
{渲染风格},[图1]是{角色名},[图2]是{场景名},[图3]是{keyshot位置},[图N]是{道具名},
你是一位专业的动画导演,自行安排分镜设计,切镜充满电影感,画面氛围也有电影感,不要有背景音乐,但要有音效。
(动作戏追加:动作戏可以有一点荷兰式倾斜镜头,动作戏的镜头具有视觉张力和空间感。)
注意:[图N] 序号与 content 数组中 image_url 的顺序严格对应,由后端拼装时自动编号
参考图拼装顺序(固定):角色人设图(按 character_ids 顺序)→ 场景图 → keyshot cell 图 → 道具图
任务队列(Celery + Redis):
- FastAPI 接受触发请求 → 推入 Redis 队列
- Celery Worker 消费队列 → POST 提交所有片段到 Seedance API
- 统一异步轮询所有 job_id → 下载完成的片段
- 任务状态持久化在 Redis,服务重启不丢失,支持断点续跑
错误处理:自动重试3次(指数退避 1s/4s/16s),429 按响应头等待,超限后人工介入
断点续跑:跳过已 completed 片段,只重跑 failed/pending
过渡期(API 未开放前):使用 Seedance 1.5 Pro API,仅 model_id 不同,逻辑一致
↓ [可选审核:单段重跑时可修改提示词]
Stage 7 剪辑审核 & 导出(时间轴 UI + FFmpeg)
可视化时间轴界面(类 Medeo / 剪映简化版):
· 底部时间轴:每个片段一个缩略图块,标注时长和场景名
· 拖拽排序:拖动片段调整顺序,自动更新 concat 序列
· 单片段预览:点击片段 → 中间预览区播放该片段
· 右键菜单:重新生成 / 编辑提示词后重跑 / 删除片段
· 「预览全片」:服务端 FFmpeg concat → 返回预览 MP4(数秒内完成)
· 「导出成片」:最终 FFmpeg concat -c copy → final-epXX.mp4
FFmpeg 拼接命令:
ffmpeg -f concat -safe 0 -i concat.txt -c copy final-ep01.mp4
无损拼接,保留 Seedance 原生音画同步
流水线模式(项目级设置):
全自动:每阶段自动通过(Stage 1、Stage 3 除外,两处必须人工确认)逐步审核:每阶段完成后等待导演批准自定义:每个 Stage 单独配置是否需要审核
6. 审核门
每阶段完成后,导演可以:
- 批准 → 继续下一阶段
- 重跑(原提示词) → 重新执行本阶段
- 编辑提示词后重跑 → 修改后重新生成
- Stage 3、4、6 支持单个资产/片段重跑,不用整阶段重来
7. 错误处理与断点续跑
每个原子任务(单次 API 调用)有独立状态:pending / running / completed / failed
- API 超时 / 5xx → 自动重试,最多3次(指数退避 1s / 4s / 16s)
- 429 限速 → 按响应头等待后重试
- 重试耗尽 → 标记
failed,审核门提示人工处理 - 断点续跑:查询当前 Stage 所有任务,跳过
completed,只重跑failed/pending - 任务状态持久化在 Redis,服务重启后状态不丢失
8. 资产库
- 存储:人设图、场景图、道具图、Keyshot 图
- 命名规范:
{asset_type}_{id}.jpg,与 JSON 中的 id 字段严格对应 - 跨集复用:同项目下新剧集自动引用已有资产,可手动替换单张
- 操作:查看 / 编辑提示词 / 重新生成
9. Skill 系统
架构原则:Skill = 系统提示词,定义 Agent 的行为和输出格式。扩展内容类型只需新增 Skill,不改代码。
现有已验证 Skill(输出格式改造为 JSON,逻辑不变):
screenplay-skill:剧本生成/优化,输出符合 Seedance △行格式的剧本storyboard-skill:场景/人设/Keyshot 提取,输出 characters.json / scenes.json / keyshots.jsonsegmentation-skill:剧本切分,输出 segments.json(含语义化参考图声明)
Skill 改造重点:
- 现有 Skill 输出的是人类可读 Markdown,自动化需要输出程序可解析的 JSON
- 改造原则:只改输出格式,不改提示词逻辑和规则
@图x占位符改为语义声明(type + id),由后端查表解析为实际文件路径
项目类型 → Skill 包:
| 内容类型 | 自动加载 |
|---|---|
| 原创动画 | screenplay + storyboard + segmentation |
| 自定义 | 手动勾选 |
10. 技术选型
| 层 | 选型 | 备注 |
|---|---|---|
| 前端 | Next.js 14 (App Router) | SSR,TypeScript,生态成熟 |
| 后端 | Python FastAPI | AI 生态(PIL/异步),Skill 调用 |
| 任务队列 | Celery + Redis | 管理 Stage 3/4/6 的并发 API 任务,状态持久化,断点续跑 |
| 数据库 | PostgreSQL | 流水线状态、资产元数据、Skill 配置 |
| 实时通信 | Server-Sent Events | 流水线进度推送 |
| AI | Claude API (Opus 4.6) | 可配置 base_url,支持第三方代理 |
| 图片生成 | Banana Pro 第三方 API | 适配器可替换,TBD 具体服务商 |
| 视频生成 | Seedance 2.0(火山引擎 Ark) | 参生模型,过渡期用 1.5 Pro,升级只改 model_id |
| 视频拼接 | FFmpeg concat -c copy | 无损,保留原生音画同步 |
| 图片裁切 | Python Pillow(PIL) | 本地执行,零成本,精确 |
| 文件存储 | 本地文件系统 → S3/OSS | 初期本地,后期迁移 |
11. 不做的事(MVP 范围外)
- 片头片尾 / 主题曲管理(单独规划)
- 视频转场特效
- 多租户 / 账号体系(先单团队使用)
- 计费功能
- 移动端
12. 待确认
- Banana Pro API:具体服务商和接口文档(影响 Stage 3/4 实现);各类图片的"小提示词"后缀模板,用户接入 API 后逐个提供
- Claude API 代理:具体用哪家(设计为可配置,不阻塞开发)
- 视频比例:项目创建时设定(16:9 / 9:16 / 21:9),影响宫格生成尺寸
- Seedance 并发限制:火山引擎 Ark 的并发配额,影响 Stage 6 Celery Worker 并发数设置