微信表情包生成大师
目标
把一句描述、若干关键词或一张参考角色图,转化为风格统一、可预览、可下载、可投稿的微信表情包。默认输出 240×240 PNG,并生成自动编号文件、单张预览、批量预览、清单、使用说明和 ZIP;开启投稿模式时额外输出全套投稿素材包(主图/缩略图/封面/图标/横幅 + 后台填单材料);动图需求走 GIF 门禁与压缩链路。
只处理原创、已授权或用户有权使用的角色与素材。遇到公众人物肖像、品牌角色、商标或明显受版权保护的 IP 时,先确认授权范围;无法确认时改为原创泛化角色。
何时触发
触发示例:
- “熊猫 打工,做 8 个可爱微信表情。”
- “生成一套 emoji 风格的开心、无语、生气、感谢表情。”
- “把这张宠物照片做成 16 张透明底表情包。”
- “把这些 PNG 改成 240×240、500KB 以内并打成 zip。”
- “帮我做一套能直接投稿微信表情开放平台的专辑,要有动图。”
静态 PNG 是默认目标;用户明确要求动态 GIF 时,按"动态链路"一节执行。
输入参数
按下列参数解析自然语言;除 description 外均可使用默认值。关键决策项(风格、动效方向、数量、授权确认)必须向用户复述确认;工程参数(尺寸、体积、前缀)直接用默认值,不追问。
| 参数 | 类型 | 默认值 | 规则 |
|---|---|---|---|
description |
string | 必填 | 角色、对象或关键词,如“熊猫 打工” |
character |
string | 从描述提取 | 角色主体及稳定外观特征 |
style |
enum | cute |
cute、emoji、hand_drawn、chibi_3d、minimal、meme |
emotion / emotions |
string / string[] | 常用聊天情绪集 | 开心、委屈、无语、生气、感谢等 |
theme |
string | 日常聊天 |
打工、学习、节日、社群、宠物等 |
scenes |
string[] | 自动扩展 | 工位、通勤、会议、摸鱼等 |
captions |
string[] | 空 | 每张建议不超过 4 个汉字;默认后期叠字 |
count |
integer | 8 |
1~24;投稿专辑建议 8~24 |
background |
enum | transparent |
transparent 或 white;透明用强措辞白底 + 本地抠图兜底 |
text_mode |
enum | overlay |
overlay 后期叠字、none 无文字、model 模型直接生成文字(中文易乱码) |
layout |
enum | single |
single 每图一角色;grid 宫格约束(无缝画布 + 70% 占比 + 15% 边距) |
motion |
string | 空 | 动效方向 key,见 templates/motion-directions.json(swing/heart/bounce/zoom/hands/spin/shake/starry/rocket/breathe) |
prompt_family |
enum | auto |
natural/conversational/sd/domestic;同批次锁定一族禁混用 |
target_size |
integer | 240 |
微信平台模式固定 240;聊天模式允许 64~240 |
max_kb |
integer | 500 |
专辑主图上限;单品投稿改 100 |
reference_image |
path | 空 | 可选角色参考图;重复用于所有生成项 |
prefix |
string | sticker |
输出文件名前缀 |
album_assets |
boolean | true |
同时生成封面图与聊天面板图标 |
wechat_export |
boolean | false |
输出全套投稿素材包 wechat_export/(主图/缩略图/封面/图标/横幅/填单材料) |
参数细节与边界见 references/parameters.md。
执行流程
第 1 步:理解需求并规范化
提取角色、外观锚点、主题、情绪、动作、场景、道具、风格、数量、背景、文字和动效方向。关键项缺失或模糊时,按 references/selection-guide.md 的 6 维评分推荐方向并让用户确认;工程项直接用默认值。
生成 request.json。参考 templates/request-example.json,保持键名稳定。把用户的原始描述完整保存在 description,把推导后的结构化字段写入其他键。
用户没有明确角色/文案时:先走 references/selection-guide.md 选题策划(人设 + 8 类文案桶 + 6 维评分,均分 <3.5 换方向),确认后再进入生成。
第 2 步:建立角色锚点与表情清单
创建一段对所有图片完全相同的 character_anchor(借鉴 IP 锁思想:每张提示词逐字复用,不得改写),至少包含:
- 角色物种或身份;
- 头身比例、脸型、五官;
- 主色、辅色、服饰;
- 两到三个不可变化的识别特征;
- 不允许改变的要素。
按数量创建表情清单。优先覆盖聊天高频语义(参考 8 类文案桶:基础回复/情绪反应/社交动作/拒绝边界/关系亲密/打工受难/群聊围观/人设专属梗),避免动作和含义词重复。默认顺序为:开心、收到、感谢、加油、无语、委屈、生气、晚安;数量更大时从 templates/emotion-library.json 继续扩展。
第 3 步:构造提示词计划
执行:
python scripts/build_prompts.py --request request.json --out-dir prompt-plan
读取 prompt-plan/prompt-plan.json。每张图使用六段式提示词:
- 角色锚点(逐字复用);
- 情绪与动作(+ 动效提示);
- 主题场景与道具;
- 风格模板;
- 构图、留白、背景和输出约束(宫格模式自动切换为无缝画布 + 70% 占比 + 15% 安全边距约束);
- 负面约束(含禁棋盘格、禁投影)。
内置防坑机制(详见 references/pitfalls.md):
- 白底强措辞:模型普遍忽略 transparent 参数,prompt 统一要求 STRICTLY SOLID FLAT PURE WHITE #FFFFFF,后处理统一抠图;
- 同批次锁定一族提示词(prompt_family),跨族混用会造成画风漂移;
- 关键识别特征重复两次(措辞不同),替代 SD 权重语法达到同等锚定力。
默认使用 text_mode=overlay,要求生图阶段不要生成任何文字,并在底部保留约 24% 安全区,再由规范化脚本叠加中文,降低乱码概率。详细结构见 references/prompt-design.md。
第 4 步:逐张生成源图
调用当前环境可用的图像生成能力,按 prompt-plan.json 逐张生成正方形源图。建议先生成 1024×1024 或更高分辨率,再统一缩放。
执行一致性规则:
- 每张都复用完全相同的角色锚点、风格模板和参考图;
- 只改变情绪、动作、场景和道具;
- 保持单一主体、居中构图、轮廓清晰、表情夸张;
- 保留四周安全边距,避免肢体贴边;
- 并行生成时每条 prompt 前加唯一序号前缀,避免输出文件名时间戳碰撞;
- 将源图依次保存为
source-01.png、source-02.png等。
生成后先快速检查角色一致性、重复画面、文字乱码、额外肢体、裁切和背景污染;失败项只重生成对应序号(强化负面词:no badge, no stamp, no watermark, no AI label)。
第 5 步:抠图、规范化、编号与预览
安装依赖:
python -m pip install -r scripts/requirements.txt
源图为白底时先抠图(模型几乎不会直接输出透明 PNG):
python scripts/remove_white_bg.py --input-dir generated --output-dir generated-clean
执行规范化:
python scripts/prepare_stickers.py \
--input-dir generated-clean \
--output-dir delivery \
--profile wechat-platform \
--background transparent \
--captions prompt-plan/captions.json \
--prefix sticker \
--album-assets \
--wechat-export \
--set-name "表情包名称" --set-description "一句话介绍" --copyright-info "版权"
脚本完成以下工作:
- 自动旋转并转换为 RGBA;
- 等比缩放、居中补边为正方形;
- 输出 240×240 PNG;
- 在需要时叠加短文字;
- 压缩并在必要时降色,控制在 500KB 以内;
- 自动编号为
sticker_001.png、sticker_002.png; - 生成
preview_single.png和preview_grid.png; - 可选生成
cover.png与chat_icon.png; --wechat-export输出投稿素材包:wechat_export/main/(240×240)、thumb/(120×120)、cover.png、icon.png(50×50)、banner.png(750×400)与upload_info.txt(名称/介绍/版权,可直接粘贴微信后台),并逐文件体积体检;- 生成
manifest.json(含delivery_grade交付等级)、README_使用说明.md和 ZIP。
第 6 步:质量门禁与浏览器验收
python scripts/quality_gate.py --dir delivery --profile wechat-platform --require-alpha
python scripts/verify_stickers.py --dir delivery --count 8
quality_gate.py三维门禁(fail-closed,借鉴动态表情包工厂四维门禁的轻量裁剪):- 规格维:尺寸、体积、格式、张数(1 或 8–24)、编号连续性;
- 透明底维:必须有真实 α 通道(封面/图标场景强制);
- 动效维(GIF):总时长 ≥1800ms、峰值帧停留 ≥250ms、尾帧 ≥150ms、帧数 ≥6、帧差 ≥0.012。
- 输出
delivery_grade:draft / candidate / submission-ready(三维全过)。无证据一律 BLOCKED。 verify_stickers.py浏览器截图验收(PIL 读回 GIF 不可信):找到 Chrome/Edge 时用真实渲染引擎截图;无浏览器时降级 PIL 拼图并明确警告需人工目检。目检清单:每格有主体、无黑底、透明可见、角色一致、动效可辨识。
动态 GIF 体积超标时用压缩降级链(先减色再减帧,保留透明索引与节奏):
python scripts/compress_gif.py --input raw.gif --output compressed.gif --max-kb 100
第 7 步:交付
交付以下文件:
delivery/<包名>.zip:完整下载包;delivery/preview_single.png:首张单图预览;delivery/preview_grid.png:整套批量预览;delivery/README_使用说明.md:直接使用与投稿说明;delivery/manifest.json:尺寸、体积、哈希、透明度与交付等级清单;delivery/wechat_export/:投稿素材包(启用时),其中upload_info.txt可直接粘贴微信后台。
只有 quality_gate PASS(submission-ready)后才能宣称"可投稿";否则如实说明 BLOCKED 项与修复建议。 在回复中说明:生成数量、风格、背景模式、尺寸、文件上限、门禁结果、未通过或降级处理的项目。不要把"已生成"建立在仅写出提示词的基础上。
动态链路(用户要求动图时)
- 第 1–3 步同上,request.json 增加
"motion": "方向key"(10 个方向见templates/motion-directions.json:疯狂摇摆/爱心系列/弹跳挤压/怼脸放大/大手互动/旋转翻滚/崩溃抖动/星夜可爱/火箭起飞/温柔陪伴); - 逐帧生成或合成帧序列(宿主能力允许时用图像模型重绘关键帧;否则用 Pillow 变换合成);
- 用帧序列组 GIF:总时长 ≥1800ms、峰值帧停留 ≥250ms、loop=0、disposal=2;
compress_gif.py压到 ≤100KB(先减色 128→64→…→16,不够再隔帧删减,删帧后等比放大单帧 duration 保住总时长);quality_gate.py三维全过后交付。
禁止用"循环播放多次"凑时长。动效质感优先用模型重绘,贴纸变换合成是降级路线。
输出目录
delivery/
├── stickers/
│ ├── sticker_001.png
│ ├── sticker_002.png
│ └── ...
├── cover.png
├── chat_icon.png
├── preview_single.png
├── preview_grid.png
├── manifest.json
├── README_使用说明.md
├── wechat-stickers.zip
└── wechat_export/ # --wechat-export 时生成
├── main/01.png … # 240×240 主图
├── thumb/01.png … # 120×120 缩略图
├── cover.png # 240×240 封面 ≤80KB
├── icon.png # 50×50 图标 ≤30KB
├── banner.png # 750×400 横幅 ≤80KB
└── upload_info.txt # 后台填单材料,可直接粘贴
错误处理
把技术报错翻译成用户能执行的修复建议(模板:发生了什么 → 影响范围 → 下一步动作),坏文件进 manual-review 队列不中断批次:
- 图像生成能力不可用:只输出
prompt-plan.json和可复制提示词,明确标注“尚未生成图片”。 - 模型返回不透明图:跑
remove_white_bg.py抠图;抠图后仍无 α 时改用白底交付并如实说明。 - 模型画出棋盘格/水印/徽章:重生成该序号,负面词加 checkerboard / no AI label / no stamp。
- 参考图无权使用:停止复刻,改为原创泛化形象。
- 角色一致性差:缩短可变描述,强化锚点,使用同一参考图,逐张重试。
- 中文乱码:切换到
text_mode=overlay,指定可用中文字体。 - 文件过大:静态 PNG 用 prepare_stickers 内建量化链;GIF 用
compress_gif.py(先减色再减帧)。 - GIF 节奏过快:加帧或延长峰值帧停留,禁止循环凑时长。
- 透明背景失败:先抠图或改用白底,禁止把不透明图片误报为透明。
- 数量不足:仅补生成缺少的序号,不覆盖已通过的图片。
- 门禁 BLOCKED:逐条读错误码,按
references/pitfalls.md对应条目修复后重跑。
使用示例
文本关键词
输入:“熊猫 打工,emoji 风格,8 张,透明底,要开心、摸鱼、收到、加班。”
解析:
{
"description": "熊猫 打工",
"character": "圆脸黑白熊猫,2.5头身,豆豆眼,短圆耳,佩戴浅蓝色工牌",
"style": "emoji",
"theme": "职场打工",
"emotions": ["开心", "摸鱼", "收到", "加班"],
"count": 8,
"background": "transparent",
"text_mode": "overlay"
}
投稿素材包 + 动图
输入:“把这套表情做成能直接投稿的专辑,来一个弹跳动图。”
在 request.json 增加后按动态链路执行:
{
"motion": "bounce",
"count": 16,
"wechat_export": true
}
已有图片规范化
输入:“把这个目录中的图片统一成微信表情规格,白底,文件名从 panda_001 开始并打包。”
执行:
python scripts/prepare_stickers.py \
--input-dir ./raw \
--output-dir ./delivery \
--profile wechat-platform \
--background white \
--prefix panda
参考资源
- 读取
references/research-findings.md了解同类 Skill 与可借鉴点。 - 读取
references/prompt-design.md了解提示词六段式和风格适配。 - 读取
references/wechat-spec.md了解微信官方规格、规则冲突记录与动态节奏基线。 - 读取
references/parameters.md了解完整参数表。 - 读取
references/pitfalls.md了解 18 条真实踩坑与修复方案(改代码前必读)。 - 读取
references/selection-guide.md了解选题策划、6 维评分与 8 类文案桶。 - 使用
templates/style-presets.json加载风格模板。 - 使用
templates/emotion-library.json扩展情绪与场景。 - 使用
templates/motion-directions.json加载 10 个动效方向与节奏阈值。