角色包格式
用来分享角色的 .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。
| 字段 | 含义 |
|---|---|
vendor | cosyvoice、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 最后更新于