跳到主要内容
文章
AI Products4 分钟阅读

AI Comic Studio 开发日志:把角色一致性从 40% 提到 78%

跨页角色一致性是 AI 漫画最难的一环。这篇记录我试过的三种方案,为什么前两种失败,以及结构化角色卡为什么有效。

一句话结论

一致性问题的解法是减少自由度,不是增加描述。

本文目录 · 6

起点是一个很具体的问题:把一篇两万字的短篇做成漫画,人工分镜要花多久?

我找了一位做条漫的朋友实测,答案是两周

目标:把这一步压到一天以内。

第一个版本:一次性生成整页#

最直觉的做法是把整页描述丢给模型,一次生成四格。

text
请生成一页四格漫画:主角在雨夜的便利店门口,看到一张纸条...

结果:一格崩,全页崩

具体表现是:

  • 四格画风不统一(有时写实有时卡通)
  • 主角在第 1 格和第 3 格看起来像两个人
  • 格子之间的阅读顺序混乱

可用率大概 15%。每次重生成都要重跑整页,一次 40 秒。

结论:整页生成的失败代价太高,而且失败原因无法定位。

第二个版本:逐格生成 + 详细描述#

改成先出分镜脚本,再逐格生成。角色描述写得非常详细:

text
主角:25 岁亚洲女性,黑色及肩直发,齐刘海,
      深蓝色风衣,内搭白色高领毛衣,
      左手腕戴银色手表,表情冷静但眼神疲惫

可用率提到 40%。仍然不够。

问题出在:同一段描述,模型每次的关注点不同。

有时候它画对了风衣但忘了手表,有时候记住了刘海但把头发画长了。 描述越长,模型越会「选择性执行」——它不会均匀对待每一个细节。

更麻烦的是,改一处描述会连带影响其他部分。 我想让手表更明显,结果整体风格偏向了写实。

结论:自然语言描述的自由度太高,模型在里面随意取舍。

第三个版本:结构化角色卡(可用率 78%)#

转折点是把「一段描述」拆成「一组枚举字段」。

ts
type CharacterCard = {
  // 最容易漂移的维度单独抽出来,做成枚举
  hairStyle: "bob" | "long-straight" | "ponytail" | "short-crop";
  hairColor: string; // 固定为色板中的名字,不接受自由文本
  eyeColor: string;
  outfit: string;
  accessories: string[]; // 数组,逐个渲染,不会被吞掉
 
  // 情绪和姿态每格变化,属于场景层,不属于角色层
  scene: {
    emotion: string;
    pose: string;
    framing: "wide" | "medium" | "close";
  };
};

关键改动有三个:

1. 把最容易漂移的维度枚举化

发型从自由文本变成 4 个选项。模型不再需要「理解」发型描述, 只需要选中一个。自由度下降,一致性上升。

2. 角色层与场景层分离

第一版把情绪也写在角色描述里,导致每次换表情都会影响长相。

分离之后,角色卡是跨页不变的,场景层每格单独传:

ts
function buildPrompt(card: CharacterCard, scene: Scene) {
  return [
    // 角色层:完全固定,跨页复用同一个对象
    `Character: ${card.hairStyle}, ${card.hairColor} hair, ` +
      `${card.eyeColor} eyes, wearing ${card.outfit}`,
    `Accessories: ${card.accessories.join(", ")}`,
    // 场景层:每格变化
    `Scene: ${scene.emotion} expression, ${scene.pose}, ${scene.framing} shot`,
    `Style: consistent line art, muted palette`,
  ].join("\n");
}

3. 出图后做一次相似度校验

每次生成后,用视觉模型比对与角色参考图的相似度, 低于阈值直接重生成,不进入人工审核环节。

ts
const score = await compareToReference(image, card.referenceImage);
if (score < 0.72) {
  // 直接重生成,不浪费人工审核时间
  return regenerate(card, scene, { emphasize: lowScoreDimensions(score) });
}

emphasize 会针对得分最低的维度,在 prompt 里提高该字段的权重。

结果#

方案可用率单格耗时失败代价
整页生成15%40s整页重跑
逐格 + 详细描述40%12s单格重跑
逐格 + 结构化角色卡78%9s单格重跑

78% 意味着平均每 5 格要重画 1 格。加上人工挑选和微调, 两万字短篇的分镜 + 出图从两周压到 一天半

没到「一天以内」,但已经进入可用范围。

为什么结构化有效#

回头看,三个版本的本质区别是自由度

  • 版本一:模型决定分镜结构 + 画风 + 角色 + 每格内容 → 自由度最高
  • 版本二:模型决定画风 + 角色细节 + 每格内容 → 自由度中等
  • 版本三:模型只决定「从给定选项里选哪个」 → 自由度最低

每一步都是把决策权从模型手里拿走,交给代码或人工

一致性问题的解法是减少自由度,不是增加描述。 描述越长,模型的选择空间越大,漂移越严重。

这和我在 数字员工项目 里 学到的原则是同一条:能用确定逻辑表达的,不要交给概率系统。

还没解决的#

  • 跨页镜头语言仍然生硬。 景别的切换缺少视线引导,读起来像幻灯片而不是漫画。
  • 批量出图成本没有实时预估。 一个 40 页的短篇要花多少钱,现在只能跑完才知道。
  • 对白排版是纯手动的。 气泡位置、断句、阅读顺序都靠人工摆。

下一个版本先做对白排版自动化——那是纯确定性问题,比镜头语言好解决。


项目状态与完整日志在 AI Comic Studio 项目页