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

6.2 KiB
Raw Blame History

分镜图生成质量提升计划

目标: 解决分镜图生成时出现宫格布局、角色外貌不一致、背景不一致等问题,并规划后续质量提升路径。

技术栈: 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.jscreateAndGenerateImage 新增 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.jssplitQuadGridToImages):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 接收流式进度更新