DeskMate

角色包格式

用来分享角色的 .deskmate 文件:里面有什么、刻意不放什么,以及导入时如何决定留下什么。

角色包是分享一个角色用的单个文件:人设、让它成为它自己的那部分配置、对声线的描述,以及(在允许分享形象时)形象。角色包在控制台的角色页导出和导入,也可以把角色包拖到控制台或角色窗口上。

角色包是一个普通的 zip,扩展名为 .deskmate。参考实现是 src/core/characters/pack.ts。

my-character.deskmate
├── manifest.json
├── character.json
├── persona.md
└── avatar/                 (only when the avatar is included)
    ├── avatar.json
    └── mio.vrm

zip 读取器接受 stored 和 deflate 两种条目,不支持 zip64;指向压缩包之外的路径会被拒绝。

manifest.json

{
  "format": "deskmate.character",
  "version": 1,
  "avatar": "included"
}
字段取值
format永远是 "deskmate.character"。别的值就不是角色包。
version整数。比应用能理解的更新的角色包会被拒绝。
avatar"none"、"builtin"(引用内置形象,没有文件)或 "included"(带 avatar/ 文件夹)。

character.json

只读下面这些字段,其他的会被忽略。

{
  "name": "Mio",
  "language": "en",
  "affect": {
    "baseline": { "valence": 0.1, "arousal": -0.2 },
    "halfLifeMinutes": 10
  },
  "urge": {
    "minGapMinutes": 20,
    "quietAfterTalkSeconds": 90,
    "chatAfterSilenceMinutes": 25
  },
  "voice": {
    "vendor": "elevenlabs",
    "model": "<model id>",
    "voice": "<voice id>",
    "cloned": false,
    "rate": 1,
    "pitch": 0,
    "volume": 1
  }
}
  • name(字符串)和 language(字符串,如 "en"、"zh"、"ja")必填。
  • affect.baseline 是情绪静息时回落到的位置,两个数都在 [-1, 1]。halfLifeMinutes 是情绪回到它的速度。
  • urge 设定角色多久会不请自来地开口。只能是数字。
  • voice 可选,下面会说明。rate、pitch 和 volume 是可选的数字。

声线

角色包里的声线按厂商描述,而不是按导出者自己的模型服务。角色包里从不带服务 id 或 API Key。

字段含义
vendorcosyvoice、elevenlabs、minimax、volcengine、fish 之一。
model厂商的模型 id。
voice厂商的声线 id。
cloned声线是导出者在自己的账号里克隆出来的,只有在那个账号里才能发声时为 true。

cloned 在导出时通过查询厂商的声线列表来决定:系统声线不算克隆;对无法判断的厂商,或查询失败时,这个声线按克隆处理。

导入时,只有声线不是克隆的,并且导入者有同一厂商的模型服务,才会用这个声线。否则新角色没有声线,只显示字幕,并告诉导入者原因。rate、pitch 和 volume 只在声线保留时才保留。

persona.md

角色的人设,Markdown 格式。它会成为角色给模型的指令。对陌生人的角色包要相应地小心:在创建任何东西之前,应用会展示人设,并警告它将成为角色的指令,用户确认后才创建角色。拖到角色窗口上的角色包同样如此。

avatar/

只有当 manifest.avatar 是 "included" 时才有。它是角色的 avatar/ 文件夹:模型和它的 avatar.json(格式)。

形象是否放进去,在导出时决定:

形象结果
内置形象不放;manifest.avatar 是 "builtin"。
允许再分发的 VRM放进去。
条款禁止再分发的 VRM无论用户怎么说,都不会放,并告诉导出者原因。
许可证为 Other 的 VRM 0.x条款在作者的链接后面,程序读不了。会请导出者确认自己有权分享,确认了才放。
Live2D会请导出者确认自己有权分享,确认了才放。

对 VRM,条款每次导出时都从 .vrm 文件本身读取。avatar.json 里的 meta 只是缓存,从不采信。

Cubism Core 永远不会进入角色包。 即使角色包里带了,导入也会把它丢掉。

角色包从不包含什么

没有 API Key、服务 id、记忆、对话历史,也没有情绪状态。有测试会在输出里搜索 Key 和记忆内容。

导入

  • 导入总是新建一个角色,从不修改已有的角色。名字被占用时,会加上 (2)、 (3)……
  • 角色包里没有形象 → 用内置形象。Live2D 形象即使导入者还没有 Cubism Core 也会装上,并提示他导入 Core;一旦导入,角色就会显示它,不用再导入第二次。
  • manifest.version 比应用支持的更高的角色包会被拒绝。

手工制作

把上面的文件打成 zip,manifest.json 放在根目录,把结果改名为 .deskmate。没有形象的角色,只需要 manifest.json("avatar": "none")、character.json 和 persona.md。

zip my-character.deskmate manifest.json character.json persona.md

最后更新于