Files
localMiniDrama/docs/plans/2026-03-14-storyboard-image-quality.md
2026-06-30 15:07:31 +08:00

137 lines
6.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 分镜图生成质量提升计划
**目标:** 解决分镜图生成时出现宫格布局、角色外貌不一致、背景不一致等问题,并规划后续质量提升路径。
**技术栈:** 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 接收流式进度更新