Downloads · 30 days
23
29% of all-time downloads
ocmannazirbriet/skeleton-gif
skeleton-gif is a text-to-image model from ocmannazirbriet. Use it when you need an image from a text prompt. It is set up for skeleton-gif. The card lists the license as mit.
Deterministic text → skeleton-GIF generator. Any prompt produces a 512×512 looping GIF of a skeleton performing the requested action, with an emotion visible on its face + body posture, in an optional scene backdrop.
Downloads · 30 days
23
29% of all-time downloads
All-time downloads
80
Public
Repo size
—
Likes
1
Public
Click a slice to open those files.
.py220 KB · 96%
From the Hugging Face model README
Deterministic text → skeleton-GIF generator. Any prompt produces a 512×512 looping GIF of a skeleton performing the requested action, with an emotion visible on its face + body posture, in an optional scene backdrop.
Zero hallucination guarantee. No diffusion model is in the generation path. The only ML component is facebook/bart-large-mnli used strictly for zero-shot text classification into a closed label set (92 actions × 10 emotions × 78 scenes). Rendering is pure procedural PIL code — we draw every bone, every joint, every backdrop ourselves.
from skeleton_gif_model import SkeletonGif
model = SkeletonGif.from_pretrained("ocmannazirbriet/skeleton-gif") # or local dir
out = model("a sad man reading a book in a bedroom")
print(out.action, out.emotion, out.scene) # 'reading' 'sad' 'bedroom'
out.save("result.gif")
pip install -r requirements.txt
Dependencies: pillow, transformers, torch, huggingface_hub.
On first call the underlying facebook/bart-large-mnli is downloaded (~1.6 GB) and cached. Prompts that match built-in keyword rules skip the classifier entirely.
prompt ──(keyword match / BART zero-shot)──▶ (action, emotion, scene)
──(procedural PIL render, 24 frames)──▶ .gif
SkeletonGif.__call__ routes the prompt through a deterministic keyword matcher; if nothing unambiguous hits, it falls back to zero-shot classification over the closed label set. Confidence thresholds on each channel (action ≥ 0.35, emotion ≥ 0.55, scene ≥ 0.55) send low-confidence calls to safe defaults (standing_idle / neutral / none).action_X(t ∈ [0, 1)) -> {joint_id: (x, y)} computing joint positions at frame t. 15-joint OpenPose-style rig.The model returns a SkeletonGifOutput dataclass:
| field | type | description |
|---|---|---|
prompt | str | original input |
action | str | one of 92 closed-set labels |
emotion | str | one of 10 closed-set labels |
scene | str | one of 78 closed-set labels (or "none") |
gif_bytes | bytes | GIF payload — write directly or .save(path) |
See config.json for the full canonical label lists. A few highlights:
none).gif — PIL writes the bytes directly.(prompt, engine version) the output is bit-identical.If you use this in academic work, cite the closed-set-procedural-rendering approach:
@software{skeleton_gif,
title = {skeleton-gif: deterministic text-to-GIF with zero hallucination},
year = {2026},
url = {https://huggingface.co/ocmannazirbriet/skeleton-gif}
}
MIT.