This commit is contained in:
2026-06-30 15:02:20 +08:00
commit 3948b5a48a
306 changed files with 77275 additions and 0 deletions
@@ -0,0 +1,136 @@
# 分镜图生成质量提升计划
**目标:** 解决分镜图生成时出现宫格布局、角色外貌不一致、背景不一致等问题,并规划后续质量提升路径。
**技术栈:** Node.js (Express), better-sqlite3, Vue 3, Element Plus, Gemini / NanoBanana 图片 API
---
## 已完成(2026-03-14
### 问题一:场景四视图生成后不显示
**原因:** `imageClient.createAndGenerateImage` 是为角色图片设计的函数,缺少 `scene_id` 参数支持,导致:
- 图片存储路径 hardcode 为 `characters/`(应为 `scenes/`
- `image_generations` 表不写入 `scene_id`
- 生成完成后不回写 `scenes` 表的 `image_url` / `local_path`
**修复:**
- `imageClient.js``createAndGenerateImage` 新增 `scene_id` 参数,动态判断存储目录(`scenes` / `characters` / `images`),生成完成后回写 `scenes`
- `sceneService.js`:调用时传入 `scene_id: sceneId`
---
### 问题二:分镜图生成结果仍为宫格布局
**原因:** 传入的场景/角色参考图是 2×2 四视图合图,图片 AI 看到宫格参考图后会模仿其布局格式输出宫格图,且提示词中没有明确的"单张输出"约束。
**修复:**
- `imageService.js`:单张分镜生成时,在 Step 2.5 记录参考图映射,通过 Gemini parts 结构传递说明
- `imageClient.js`:重构 Gemini 多模态输入结构为正确顺序:
```
[总说明文字] → [参考1说明] → [参考图1] → [参考2说明] → [参考图2] → [生成指令+主提示词]
```
而非原来的"prompt 在前,图片附后"的错误顺序
---
### 问题三:角色外貌不一致(参考图格式干扰)
**原因:** 作为参考图传入的是 2×2 四视图合图(含头像/正面/侧面/背面 4 格),图片 AI 难以从合图中准确提取角色外貌,且四格合图的视觉格式会干扰输出布局。
**修复:**
- `imageService.js``splitQuadGridToImages`):INSERT 时增加 `character_id` 字段,让角色拆分面板可按 ID 查询
- `imageService.js`(Step 2 参考图解析):优先查询拆分后的单张面板作为参考:
- 场景:`quad_panel_0`(左上格 = 建立远景,最能代表环境)
- 角色:`quad_panel_1`(右上格 = 正面全身图,最能代表角色外貌)
- 无拆分面板时 fallback 到四视图合图
- 角色最多取 3 个(避免超出模型参考图限制),Gemini 参考图上限从 3 改为 4(场景1 + 角色3)
---
### 问题四:参考图标签与实际传图数量不对齐
**原因:** 当角色有 `extra_images` 且无主图时,`extra_images` 仍会被推入 refs 但无对应主标签,导致后续角色编号错乱;`refLabels` 数量可能超过 Gemini 实际接收的图片数,让模型产生困惑。
**修复:**
- `extra_images` 推入逻辑移入 `if (primaryRef)` 块内,确保无主图时不产生孤立的 extra 标签
- `refLabels.slice(0, refs.length)` 强制对齐条数
- Gemini parts 构建时,按实际传入图片数裁剪标签
---
## 待完成(优先级排序)
### P1:分镜 prompt 二次优化
**背景:** 当前分镜描述(由文本 AI 生成的首帧/关键帧/尾帧提示词)是针对"分镜内容描述"设计的,直接发给图片 AI 效果打折。
**方案:** 在 `imageService.js` Step 3 之前增加一个文本 AI 优化步骤:
- 输入:原始分镜提示词 + 风格 + 宽高比 + 参考资产名称列表
- 输出:针对图片生成模型优化的提示词(增强细节描述、统一风格词汇、加入参考资产名称映射)
- 模型:使用轻量文本模型(如 deepseek-v3),成本低
- 缓存:优化后的 prompt 回写 `image_generations.prompt`,同一分镜重新生成时可复用
**预期收益:** 图片细节更丰富,风格更一致,角色名称与参考图映射更清晰
---
### P2:批量宫格生成(同一分镜多帧)
**背景:** 当前每一帧独立调用图片 API,导致同一分镜的首帧/关键帧/尾帧在风格、光线、色调上可能不一致。
**方案:** 复用现有 `quad_grid` / `nine_grid` 基础设施:
- 在分镜图生成时,将同一分镜的多帧组合为宫格提示词,一次生成宫格图
- 生成完成后调用 `splitQuadGridToImages` 自动拆分为独立帧
- API 调用次数从 N 次降为 1 次
**预期收益:** 同一分镜内视觉一致性大幅提升,API 成本降低
---
### P3:参考图智能过滤
**背景:** 当前把分镜绑定的所有角色/场景参考图都传入,部分角色/场景可能在当前帧中根本未出现,增加无效噪声。
**方案:** 在 Step 2 解析参考图后,调用文本 AI 判断:
- 输入:分镜描述 + 候选资产列表(名称 + 简介)
- 输出:与本帧内容直接相关的资产列表
- 只传相关资产的参考图
**预期收益:** 减少无关参考图干扰,提高角色/场景还原度
---
### P4:参考图压缩
**背景:** 传参考图前无压缩处理,可能触发 API 请求大小限制。
**方案:** 在 `callGeminiImageApi` 中对参考图 buffer 做压缩:
- 单张目标:≤ 3MBJPEG quality 递减压缩)
- 总大小:≤ 10MB(按大小降序优先压缩大图)
- 使用 `sharp` 处理(项目已依赖)
---
### P5:多 Agent 大纲生成
**背景:** 当前大纲/剧本生成为单次 AI 调用,无法做到自动审核、迭代修改。
**方案:** 基于 Vercel AI SDK 的 Tool Use,实现三 Agent 协作:
- **故事师**:分析输入主题,生成故事线(存 `storylines` 表)
- **大纲师**:根据故事线生成各集大纲(存 `outlines` 表)
- **导演**:审核大纲与故事线一致性,提出修改建议并执行
工具调用链:`主Agent → 故事师 → saveStoryline → 大纲师 → saveOutline → 导演 → updateOutline`
---
### P6:分镜自动生成 AgentshotAgent
**背景:** 当前分镜需要用户手动拆分,或依赖单次 AI 调用,缺少自动化流程。
**方案:**
- **segmentAgent**:从剧本中自动拆分场景片段(含情绪、动作描述)
- **shotAgent**:根据片段生成分镜提示词(含景别、角度、运镜、角色、对话)
- 前端通过 WebSocket 接收流式进度更新