我过去几个月一直在构建一个人工智能故事/角色扮演应用,其中一件我非常想要的是让屏幕上的角色能够对正在发生的事情做出反应。不同的表情、背景在你移动到其他地方时会变化,甚至可以在场景中出现多个角色。

基本上类似于视觉小说,但你可以输入任何内容,故事会继续进行。

我想分享一下我是如何设置它的。单独的组件都很简单,但让一切都跟随剧情进展花费了一些功夫。

首先,你需要一张角色的基础头像。然后使用图像编辑模型在该头像作为参考,生成表情变体。比如开心、愤怒、悲伤、尴尬、惊讶等。你希望表情在保持衣着、构图和角色一致的前提下变化,否则切换表情会像切换人一样。我发现 GPT 的图像模型在这方面表现很好。我使用 Sunburst,Flare 也效果不错。

然后将这些图像通过背景去除处理。我使用 InSPyReNet,你可以自行运行并放在 API 后面。托管的背景去除 API 也能完成同样的工作。无论如何,你需要为每个表情得到带有透明背景的图像。

如果设备性能允许,本地运行背景去除值得尝试。这样可以避免每张图片的 API 收费以及上传/下载的往返。速度取决于模型和硬件,所以在假设更快之前,最好在你实际支持的设备上进行测试。

场景背景是单独的图片。应用会把角色的剪裁层叠在当前场景对应的背景之上。你需要提前准备并保存这些资产,这样在游戏过程中更换表情只需切换显示的图像。

接下来,你需要一种机制来决定展示哪些图像。

这就是决策模型的作用。我尝试过几种,Jev 整体表现最好,尽管我发现 OpenAI 的决策模型在某些具体任务上也很有用。Jev 由 TypeSafe 开发,它读取文本,回答特定问题时提供选项、评分或是非二元概率,而不是生成完整的回复。

当叙述者写完一个场景后,我会把段落以及相关的角色、场景和可用表情提供给 Jev,然后提出聚焦的问题:谁在说话、谁在场景中、文本实际展示的表情是什么。移动会记录在保存的游戏状态中,背景随之跟随该场景。

因此,一个基本版本的流程如下:

  • 图像模型生成头像和表情变体
  • 背景去除将它们转为透明剪裁
  • 单独的图片提供场景背景
  • 叙述者模型撰写场景
  • Jev 帮助解释谁在场景中、他们展示的表情以及场景所在地点
  • 你的代码根据这些选择显示对应的资产

你不必使用相同的模型。返回结构化答案的其他模型也可以负责解释。Jev 是我用于这类 narrow questions 的选择。

一个我必须注意的问题是,角色的感受与其展示的形象之间的区别。“这个角色在感受什么情绪?”并不是选择头像的正确提问。一个人可能在微笑掩饰愤怒。把愤怒的脸显示出来会暴露他们本应隐藏的情绪。

背景同理。有人提到庭院,并不意味着所有人都移动到了那里。

剪裁也需要注意。头发和衣物边缘在暗室中可能看起来很好,但在天空背景下会出现明显的轮廓。最好在多个不同背景下检查同一角色的效果。

对我最大的收获是,只要表情能正确跟随场景,就可以利用可重复的艺术资源。你不必为每条回复生成全新图像。即使是小幅度的面部变化,也能让情节更有冲击力。

如果你想看看我正在做的项目,这款应用叫 Otherworld。它可在 网页 和 iOS App Store 上使用。如果你也在尝试类似的设置,我很乐意进一步交流!