AI Comic Studio 开发日志:把角色一致性从 40% 提到 78%
跨页角色一致性是 AI 漫画最难的一环。这篇记录我试过的三种方案,为什么前两种失败,以及结构化角色卡为什么有效。
一句话结论
一致性问题的解法是减少自由度,不是增加描述。
起点是一个很具体的问题:把一篇两万字的短篇做成漫画,人工分镜要花多久?
我找了一位做条漫的朋友实测,答案是两周。
目标:把这一步压到一天以内。
第一个版本:一次性生成整页#
最直觉的做法是把整页描述丢给模型,一次生成四格。
请生成一页四格漫画:主角在雨夜的便利店门口,看到一张纸条...结果:一格崩,全页崩。
具体表现是:
- 四格画风不统一(有时写实有时卡通)
- 主角在第 1 格和第 3 格看起来像两个人
- 格子之间的阅读顺序混乱
可用率大概 15%。每次重生成都要重跑整页,一次 40 秒。
结论:整页生成的失败代价太高,而且失败原因无法定位。
第二个版本:逐格生成 + 详细描述#
改成先出分镜脚本,再逐格生成。角色描述写得非常详细:
主角:25 岁亚洲女性,黑色及肩直发,齐刘海,
深蓝色风衣,内搭白色高领毛衣,
左手腕戴银色手表,表情冷静但眼神疲惫可用率提到 40%。仍然不够。
问题出在:同一段描述,模型每次的关注点不同。
有时候它画对了风衣但忘了手表,有时候记住了刘海但把头发画长了。 描述越长,模型越会「选择性执行」——它不会均匀对待每一个细节。
更麻烦的是,改一处描述会连带影响其他部分。 我想让手表更明显,结果整体风格偏向了写实。
结论:自然语言描述的自由度太高,模型在里面随意取舍。
第三个版本:结构化角色卡(可用率 78%)#
转折点是把「一段描述」拆成「一组枚举字段」。
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. 角色层与场景层分离
第一版把情绪也写在角色描述里,导致每次换表情都会影响长相。
分离之后,角色卡是跨页不变的,场景层每格单独传:
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. 出图后做一次相似度校验
每次生成后,用视觉模型比对与角色参考图的相似度, 低于阈值直接重生成,不进入人工审核环节。
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 项目页。