AirSpark/PRD.md
seaislee1209 acbd2e30ad Initial commit: Air Spark project
- 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>
2026-05-14 16:08:49 +08:00

13 KiB
Raw Permalink Blame History

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 4Keyshot 格图)+ Stage 5segments.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: trueduration: 片段时长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/16s429 按响应头等待,超限后人工介入
         断点续跑:跳过已 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.json
  • segmentation-skill:剧本切分,输出 segments.json含语义化参考图声明

Skill 改造重点

  • 现有 Skill 输出的是人类可读 Markdown自动化需要输出程序可解析的 JSON
  • 改造原则:只改输出格式,不改提示词逻辑和规则
  • @图x 占位符改为语义声明type + id由后端查表解析为实际文件路径

项目类型 → Skill 包

内容类型 自动加载
原创动画 screenplay + storyboard + segmentation
自定义 手动勾选

10. 技术选型

选型 备注
前端 Next.js 14 (App Router) SSRTypeScript生态成熟
后端 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 PillowPIL 本地执行,零成本,精确
文件存储 本地文件系统 → S3/OSS 初期本地,后期迁移

11. 不做的事MVP 范围外)

  • 片头片尾 / 主题曲管理(单独规划)
  • 视频转场特效
  • 多租户 / 账号体系(先单团队使用)
  • 计费功能
  • 移动端

12. 待确认

  1. Banana Pro API:具体服务商和接口文档(影响 Stage 3/4 实现);各类图片的"小提示词"后缀模板,用户接入 API 后逐个提供
  2. Claude API 代理:具体用哪家(设计为可配置,不阻塞开发)
  3. 视频比例项目创建时设定16:9 / 9:16 / 21:9影响宫格生成尺寸
  4. Seedance 并发限制:火山引擎 Ark 的并发配额,影响 Stage 6 Celery Worker 并发数设置