animated-sticker-studio
Turn a character image (mascot, OC, pet photo, 3D render, or just a text description) into a full pack of animated chat stickers — real keyframe animation plus motion, captions and effects — exported
SKILL.mdSKILL.md
GitHubAnimated Sticker Studio · 动态表情包工坊
Pipeline: plan → reference → atlases → cut → build → look → fix → deliver. Scripts live in scripts/ (Python 3 + Pillow; ffmpeg for Telegram/MP4). Run every script with --help before first use.
1. Plan (manifest.json)
Ask only what you cannot default. Defaults: 16 stickers, Simplified Chinese captions, generic GIF; add wechat if they mention 微信表情开放平台/上架, telegram/line/discord/slack/whatsapp if named. WeChat albums take any 8–24 stickers; LINE packs must be 8, 16 or 24.
Write manifest.json next to the work (format: references/manifest.md). Pick captions from references/phrases.md unless the user gave their own, and give every entry:
pose— what the body does, in English, concrete enough to draw (arms, props, expression). Two entries may never share the same pose with only new text.motion+icon+ optionalcaption_fx— chosen to match the line (table in phrases.md).- For the 4–8 stickers where the gesture IS the joke (挥手, 鼓掌, 打字, 干饭, 点赞, 哭, 打哈欠, 比心…) put them in a group with
"keys": 4and write fourkey_poses. These become real frame-by-frame animation. Single poses get procedural motion only.
Show the user the plan as a short table (编号 / 文案 / 动作) before spending on generation when the pack is ≥24 or the user seems picky; otherwise go.
2. Reference
- User image → copy into
ref/, setcharacter.reference. Writecharacter.anchors: one English sentence listing what must never change (shape, colours, markings, accessories). - 3D model → render a front/three-quarter view with the face visible, use that.
- Only a description →
gen_atlas.py manifest.json --provider hiapi --make-reference "<description>", show the result, get a yes. - Use only art the user owns or may adapt. Do not recreate a third party's character from memory.
3. Atlases
One sheet per group (≤16 cells). Either:
- Your own image tool (Codex
image_gen, etc.):gen_atlas.py manifest.json --print-prompts, generate each sheet with the reference attached, save as the printed path, then set the group'satlasandgrid. - Bundled providers:
gen_atlas.py manifest.json --provider hiapi|openai(keys only from env:HIAPI_API_KEY, orOPENAI_API_KEY+ optionalOPENAI_BASE_URL/OPENAI_IMAGE_MODEL). Skips groups that already have an atlas;--group Nredraws one. Never print or echo a key.
Open every sheet at full size. Reject and redraw (--group N) when the identity drifts, a cell is missing or doubled, limbs are clipped, or two poses are the same.
4. Cut
cut_atlas.py manifest.json — removes solid or fake-checkerboard backgrounds, finds each sprite by its pixels (not by a rigid grid), writes sprites/ and fills every entry's sprites list. Open each atlases/*.index.png and confirm number N shows the pose written for entry N. If the model swapped cells, fix by editing sprites paths in the manifest — never by renaming captions to fit wrong art.
5. Build
python3 scripts/build_pack.py manifest.json out --mp4 # platforms from manifest
python3 scripts/build_pack.py manifest.json out --only 3,7-9 # quick re-render of a few while iterating
Fonts are found automatically (PingFang/Hiragino/Noto CJK/YaHei); --font overrides. Each platform file is re-encoded until it fits that platform's byte limit; report.json records the setting used.
6. Look (required — you cannot watch a GIF, so look at these)
out/review/motion-XX.png: every sticker as 4 frames side by side on alternating white/dark rows. Check: the motion reads as the caption's emotion, keyframes don't jitter sideways, nothing clipped, no white halo on dark rows, captions legible, accents not covering the face.out/review/contact.png: whole pack at once — check variety and that no two look alike.- The build's JSON summary:
failing(per-platform spec failures) andpack_issues(near-duplicate poses, wrong pack size, stickers that barely move). Fix all of them or tell the user exactly which remain and why.
Fix loop: wrong motion/icon/caption → edit manifest, --only; bad art → redraw that group or cell; then rebuild everything once at the end.
7. Deliver
Give the user: the ZIP path, 预览.html (opens offline; light/dark/checker backgrounds and a chat mock-up), the MP4 if made, and a one-line pass/fail per platform from the summary. Mention platform limits that still need a human: WeChat needs a 750×400 banner and copyright paperwork, LINE/Telegram need account-side upload. Specs are in references/platforms.md; say they are as of 2026-11 and the platform console wins.
Keep the original reference and atlases out of the ZIP unless asked.