Skip to content

Latest commit

 

History

History
209 lines (148 loc) · 18.5 KB

avatar-reply-auto.md

File metadata and controls

209 lines (148 loc) · 18.5 KB

角色动图:图片文件夹生成与多角色配置

本文介绍新版的自动 JSON 生成、多角色切换和按群画质档位。手工网站操作(微调)另见网站制作说明。

0. 准备图片

使用自己的图片编辑 API,模型选择 gpt-image-2-5,大小 1024x1024。先制作正常图,再将这张正常图作为其他差分的参考图片,避免独立生成导致人物位置、比例、服饰变化。

文件命名 内容 必需
normal.png 睁眼、闭嘴 是
close.png 闭眼、闭嘴 是
open.png 睁眼、小幅张嘴 是
happy.png 开心的完整立绘 否
confused.png 困惑的完整立绘 否
angry.png 生气的完整立绘 否
shy.png 害羞的完整立绘 否
crying.png 哭泣的完整立绘 否

呆毛注: 推荐自己把图片ps改为透明背景 png

把图片命名好,放在同一个文件夹内备用

参考图片地址1

参考图片地址2

正常图提示词 normal.png

生成png透明通道的图,将背景设为透明。 将参考图片制作成用于群聊角色动图的基准立绘,输出 1254×1254 的单张图片。保留参考角色的身份、Q 版比例、脸型、发色、发型、帽子、发夹、服饰、配色和画风。角色睁开双眼,嘴巴自然闭合,表情亲切。使用透明背景,人物居中,头部和帽子完整可见,边缘留出空白,下方可保留半身裁切。确定人物位置、大小、姿势与头部倾角,后续差分都将沿用这张图。画面只包含一个角色,不添加文字、标志、边框或额外装饰。

闭眼图提示词 close.png

生成png透明通道的图,将背景设为透明。 这张参考图是已经确定的角色基准图。请制作同画布的闭眼差分,输出 1254×1254 单张图片。只把双眼改成自然闭合的眨眼状态,保持闭嘴。严格保持人物位置、比例、姿势、头部倾角、帽子、发夹、头发轮廓、服饰、光照、线条、配色和透明背景不变。不得重新构图、放大、缩小或移动角色,不改动其他部位,不添加文字。目标是与基准图切换时,除了眼睛之外其他像素区域尽可能一致。

张嘴图提示词 open.png

生成png透明通道的图,将背景设为透明。 这张参考图是已经确定的角色基准图。请制作说话差分,输出 1254×1254 单张图片。只将嘴巴改成自然说话时的小幅张嘴,画出合理的小口腔,双眼保持睁开。严格保持人物位置、比例、姿势、头部倾角、帽子、发夹、头发轮廓、服饰、光照、线条、配色和透明背景不变。不得重新构图、放大、缩小或移动角色,不改变脸型,不添加文字。目标是与基准图切换时,除了嘴巴之外其他像素区域尽可能一致。

开心图提示词(可选) happy.png

生成png透明通道的图,将背景设为透明。 以这张角色基准图制作开心表情的完整立绘,输出 1254×1254 单张图片。只修改面部表情,让眼睛和嘴巴呈现自然、可爱的开心笑容。严格保持人物位置、比例、姿势、头部倾角、脸型、帽子、发夹、头发轮廓、服饰、光照、线条、配色和透明背景不变。不得重新构图、移动角色或添加文字。此图会作为一张完整特色表情播放,而不是眼睛或嘴巴部件。

困惑图提示词(可选) confused.png

生成png透明通道的图,将背景设为透明。 以这张角色基准图制作轻微困惑表情的完整立绘,输出 1254×1254 单张图片。只修改眉眼和嘴巴,表现温和的疑惑感,不改变脸型和人物姿势。严格保持人物位置、比例、头部倾角、帽子、发夹、头发轮廓、服饰、光照、线条、配色和透明背景不变。不得重新构图、移动角色、添加问号或文字。此图会作为一张完整特色表情播放。

生气图提示词(可选) angry.png

生成png透明通道的图,将背景设为透明。 这张参考图是已经确定的角色基准图。请制作可爱、轻微生气的完整立绘差分,输出 1254×1254 单张图片。只修改面部:眉毛略向内收拢,眼神稍微不满,嘴巴自然抿起或呈小小的嘟嘴,保留角色原来的亲和感,不做夸张狰狞表情。严格保持人物位置、比例、姿势、头部倾角、脸型、帽子、发夹、头发轮廓、服饰、光照、线条、配色和透明背景不变。不得握拳、改变身体动作、重新构图、放大、缩小或移动角色;不添加怒气符号、火焰、烟雾、文字或额外道具。此图作为完整特色表情播放,不是五官部件。除指定面部区域外,其他区域应尽可能与基准图一致。

害羞图提示词(可选) shy.png

生成png透明通道的图,将背景设为透明。 这张参考图是已经确定的角色基准图。请制作温柔、可爱的害羞完整立绘差分,输出 1254×1254 单张图片。只修改面部:眉眼稍微柔和,目光略显羞涩,嘴巴为自然的小幅闭嘴微笑,脸颊增加轻柔的粉红晕染。保持原来双眼的颜色和结构,不改变脸型。严格保持人物位置、比例、姿势、头部倾角、帽子、发夹、头发轮廓、服饰、光照、线条、整体配色和透明背景不变。不得转头、低头、抬手遮脸、重新构图、放大、缩小或移动角色;不添加爱心、汗滴、文字或额外道具。此图作为完整特色表情播放,不是五官部件。除指定面部区域外,其他区域应尽可能与基准图一致。

哭泣图提示词(可选) crying.png

生成png透明通道的图,将背景设为透明。 这张参考图是已经确定的角色基准图。请制作委屈、轻声哭泣的完整立绘差分,输出 1254×1254 单张图片。只修改面部:眉毛略显委屈,双眼含泪,在眼角与脸颊添加少量自然的小泪珠,嘴巴微微下弯,保留可爱、柔和的角色气质。泪珠局限在面部区域,不画夸张的喷泉式眼泪,不改变眼睛颜色和脸型。严格保持人物位置、比例、姿势、头部倾角、帽子、发夹、头发轮廓、服饰、光照、线条、整体配色和透明背景不变。不得抬手擦泪、改变身体动作、重新构图、放大、缩小或移动角色;不添加雨滴背景、乌云、文字或额外道具。此图作为完整特色表情播放,不是五官部件。除指定面部区域外,其他区域应尽可能与基准图一致。

1. 图片文件夹生成与按群角色配置

更新插件后,在插件目录执行 pnpm install 安装依赖。资源根目录是 Yunzai 根目录下的 data/chatgpt/avatars,不是插件目录。

更简单的方式:放图片后刷新

每个角色一个文件夹,文件夹名就是锅巴下拉中显示的角色名,可使用中文:

data/chatgpt/avatars/
  呆毛/
    normal.png
    close.png
    open.png
    happy.png
    confused.png
    angry.png
    shy.png
    crying.png
  另一个角色/
    normal.webp
    close.webp
    open.webp

normal、close、open 三个基础文件名固定,分别表示正常、闭眼、张嘴;扩展名接受 png、jpg、jpeg、webp,大小写不敏感。其余非隐藏图片作为特色表情,最多 32 张。不要把预览截图、对齐对比图等无关图片留在此目录。同名的不同格式文件(例如 normal.png 和 normal.webp)会报冲突。

Bot 主人执行 #chatgpt刷新角色文件夹。插件扫描所有直接子目录,为各角色生成或更新 peraravatar-plus-config.json;不需要先去网站制作 JSON。

默认命名:happy/开心→开心并搭配 bounce;confused/困惑→困惑并搭配 wobble;angry/生气→生气并搭配 shake;shy/害羞→害羞并搭配 wobble;crying/哭泣→哭泣并搭配 none。其他文件以文件名为表情名称,默认 none。新表情 ID 根据源文件名生成,模型仍然只使用已加载的 ID,不直接访问文件。

若已有手工 JSON,刷新优先按 sourceFile 记录匹配原表情;首次处理网站文件时按表情名称的“开心”等前缀匹配。唯一匹配后保留原 ID、名称、动作、图片位移,以及整体呼吸/眨眼设置。新表情使用默认值,删除图片会从生成列表中移除该表情。无法唯一匹配时该角色刷新失败,不猜测覆盖;若首次手工名称完全改成其他词,建议先改回标准名称完成一次匹配,再修改名称。

发生变化时先备份原文件为 peraravatar-plus-config.json.<时间>-<编号>.bak,再原子替换 JSON;没有变化时不重新写入或增加备份。缺少基础图、图片损坏、命名冲突或超限,保留旧 JSON 并显示错误。其他有效角色继续刷新。备份由主人自行保管/清理。

只有 JSON、没有图片的文件夹按手工资源处理,不重建。完整图片模式下网站遗留的 buildMode:parts 字段不会阻止使用完整立绘,真正的顶层分层模式仍不支持。路径穿越和越界目录/图片链接被拒绝。

在锅巴为每群选择

执行刷新命令后,重新加载锅巴配置页面。在“角色动图群”表格中分别设置:

字段 用途/可选档位
Bot QQ、群号 对应机器人与目标群
自动附带角色动图 只在该 Bot+对应渠道开启;8888 行为私聊开关
角色文件夹 从已存在资源 JSON 的角色目录下拉选择
GIF 分辨率 512×512、768×768、1024×1024(全部为正方形)
GIF 时长 2、3、5 秒
GIF 帧率 10、15、20 FPS

「角色动图回复」分组里还有一个全局开关「特色表情渐变过渡」(默认开启,与「角色动图群」表格的按群字段相互独立):开启后,辅助模型选中特色表情时按下面「特色表情的播放时间线」播放;关闭后整段播放特色立绘(旧行为)。

同一个 Bot 在不同群可以使用不同角色和画质;多个 Bot 也可以共享同一角色。未设置时默认 512×512、3 秒、10 FPS;已保存的旧 512×640 档会自动按 512×512 使用。私聊需要预览、状态或自动附图时,手动添加一行:Bot QQ 填实际值、群号填 8888(保留值),该行决定私聊使用的角色与档位;打开该行开关后,私聊回复会自动附图(所有与该 Bot 私聊的用户)。没有 8888 行或未选角色时,私聊预览/状态会提示先到锅巴配置。

也可以将以下字段合并到插件现有 config/config.json,保留其他配置;手动修改群配置后重启 Yunzai,锅巴保存立即生效:

{
  "avatarReply": {
    "provider": "current",
    "groups": [
      {
        "botId": "123456789",
        "groupId": "987654321",
        "switchOn": true,
        "avatarId": "呆毛",
        "size": "1024x1024",
        "duration": 3,
        "fps": 10
      }
    ]
  }
}

默认没有授权群;私聊默认不附图,8888 行开关打开后所有私聊用户都会自动附图。开关不改变聊天黑白名单、冷却或模型权限。

主人指令 用途
#chatgpt刷新角色文件夹 按图片生成/更新 JSON,显示各角色的成功或失败结果
#chatgpt角色预览 群内使用本群选中的角色和档位;私聊不带名称时使用 8888 行
#chatgpt角色预览 呆毛 仅私聊可指定角色目录;档位取 8888 行,没有该行时用默认 512×512/3秒/10 FPS
#chatgpt角色状态 显示当前渠道(群或私聊 8888 行)的资源路径、档位、图片数量、特色表情、开关和读取错误
#chatgpt角色开启 在当前群/私聊开启(私聊操作 8888 行);仅 Bot 主人可用;要求对应渠道已在锅巴选择角色文件夹
#chatgpt角色关闭 在当前群/私聊关闭,取消尚未发送的旧任务;仅 Bot 主人可用

资源文件在使用时检查更新,无需为了替换图片重启。更新失败继续使用本进程中该角色上一次成功加载的资源;状态会显示错误。重启无法恢复只存在于内存中的旧版本,必须保留文件备份。切换角色或档位会取消旧的待发任务。

电影字幕叠加层

所有角色动图(自动附图、群聊/私聊、主人预览)统一采用画面内的单行电影字幕:白字、黑色描边和轻微阴影,直接覆盖在适当放大的角色立绘下部;不再使用旧气泡、箭头、底框或另留字幕区域。模型优先从完整回复中提炼最多两段自然短句,按顺序硬切换而非逐字出现;本地按标点断句和字符数兜底,切掉每段首尾的标点,长字串自动缩小字号或截短,不能自动折为两行。

字幕切换与特色表情渐变时间线互不干扰。角色输出三个档位均为正方形;旧 512×640 的历史设置读取时改为 512×512。若选择 768×768、3 秒、10 FPS,应在实际 QQ 客户端确认 GIF 仍能自动下载:改动字幕或角色大小会影响字节体积,插件自身的 8 MiB 上限不等于 QQ 的自动下载阈值。

特色表情的播放时间线

开启「特色表情渐变过渡」(默认开启)且辅助模型选中特色表情时,动图按三段播放:

阶段 行为
正常段(约前一半时长) 普通立绘,眨眼与说话动嘴照常;反应动作(抖动、跳动等)此时不出现
交叉溶解(约 0.35 秒) 从普通立绘逐渐混合到特色立绘,仍只播基础运动
特色段(不短于 1 秒,直至结束) 保持特色立绘,反应动作在过渡完成后以约 0.2 秒缓入开始;按原眨眼节奏短暂闪回普通「闭眼」帧;不再张嘴

2 秒档约为 0.65/0.35/1 秒,3 秒档约为 1.5/0.35/1.15 秒,5 秒档约为 2.5/0.35/2.15 秒。模型未选中特色表情时仍按普通三帧循环播放;关闭全局开关时整段播放特色立绘(旧行为)。

确认插件识别

  1. 放好图片后执行刷新命令,确认目标文件夹显示“已生成”“已更新并备份”或“未变化”。只复制散图不会立即生效,必须刷新。
  2. 在锅巴选定角色后发 #chatgpt角色状态,确认路径、特色表情名称和档位正确。
  3. 发 #chatgpt角色预览 检查基本眨眼、嘴型、布局与画质。透明背景是预期效果;预览不调用辅助模型,也不会选中特色表情,看不到渐变过渡;时长短于眨眼间隔时可能看不到眨眼(特色段的闭眼闪回同理)。
  4. 在启用的群或私聊中进行庆祝、疑问、抱怨、接受夸奖、安慰等对话。辅助模型按最终回复选择特色图,也可以不选,不保证每句话都触发指定表情。
  5. 生成的图片是否对齐、是否满足资源限制,以及真实提供商的选择效果,仍需用实际素材和群聊检查。

2. 输出与排障

输出为透明背景(GIF 只支持 1 位透明度,半透明边缘会被二值化);分辨率、时长、帧率按渠道配置,默认 512×512、3 秒、10 FPS。图片素材若是纯白背景,GIF 里也会是白色底,想要真正透明请使用透明背景 PNG。每轮最多一张 GIF。角色字幕最多 2 段,每段不超过 12 个可见字符(合计不超过 24),始终单行、按字数分配时间并保证每段至少 0.7 秒。辅助模型只能选择已存在的表情 ID 和支持的动作;调用失败时用正文首句本地断句、清除首尾标点并采用默认动作。GIF 生成或上传失败不撤销完整文字。

本地渲染不需要 GPU、浏览器、麦克风、摄像头或 FFmpeg。工作线程串行编码,最多三项等待任务,队列满时跳过附图,生成超时为 30 秒。文件超过 8 MiB 或生成超时会跳过附图,不自动降低选定档位,完整正文保留;高分辨率、长时长和高 FPS 会增加耗时与体积。发出前再次检查群授权及资源版本,发送后清理系统临时文件。GIF 编码使用 gifenc(全局透明调色板 + rgb565 最近色匹配,并按上一帧索引做滞回以抑制逐帧色斑闪烁);渐变仍可能有轻微色阶,QQ 客户端也可能压缩动图。

现象 处理
无法确定 Bot/找不到文件 用状态命令检查路径;私聊使用群号 8888 行(角色、档位与自动附图开关),其中 Bot QQ 必须等于 Bot 自身 QQ
提示“未选择角色文件夹” 群内先在锅巴为该 Bot+群选择角色文件夹;私聊先添加群号 8888 的行并选择角色
不支持模式/口型档过多 选择完整图片模式,只留一个口型档及一张开口图,移除部件特色表情
图片不是内嵌数据 替换网站样例为自己的图片,重新下载配置 JSON
特色表情超限 特色表情最多 32 种,同时检查 JSON 32 MiB、单图 6 MiB、累计 32 MiPixels 的资源限制
切换时角色抖动 检查差分对齐,在网站修正位置和大小,或重新编辑差分
首句电影字幕/没有动图 查看 [ChatGPT] 角色字幕/渲染/发送日志和状态命令,检查模型连接、队列及上传
特色表情没有渐变过渡 检查锅巴「特色表情渐变过渡」开关是否开启;辅助模型未选中特色表情时本就不进入特色段(正常现象);关闭开关时整段播放特色立绘
中文显示方块 安装系统中文字体;Debian/Ubuntu 可安装 fonts-noto-cjk,安装后重启 Yunzai
替换 JSON 后仍是旧角色 查看状态中的读取提示;修正文件后重新预览,首次失败不会创建假资源

开发验证说明

人工构造的栅格测试素材仅验证状态切换、解析、权限、任务取消和 GIF 编码,不代表 GPT Image 2 差分质量。

需要生成真实验证素材时,使用 misaka-gpt-image-agent 的 gpt-image-2 技能接口:调用注册的 generate_image/edit_image,按技能传入绝对 outputDir;差分使用 imagePaths 引用正常图,不传透明背景或 input_fidelity,不提交测试素材。若该接口未在验证会话中暴露,记录素材生成尚未验证,不能改用 Codex 内置生图或另写 API 客户端替代。

上线验收还需由 Bot 主人在实际适配器及 QQ 群中验证动图上传、显示和字体。Windows 本地测试不代表 Linux 服务器的中文字体与显示效果。