Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01As1S7fpDqEDnZxcGbSSoUW
felt-t2a-studio
Offline authoring tool for Felt's animation library: type a prompt, preview
the generated motion, and promote the ones worth keeping into
felt-character-assets's curated animations/library/.
Confirmed working end to end 2026-09-21.
Workflow
- Generate - fast (~1-2s): sends the prompt to a persistent T2M-GPT inference server on the Nitro5 laptop, shows a raw skeleton preview (22 joints, no mesh yet - there's no VRM/character at this stage).
- Convert to VRMA - slow (~2 min, mostly SMPLify's optimization on the laptop): runs the same generated motion (not a fresh sample - see below) through SMPLify -> Blender BVH->FBX -> Unity Humanoid retarget -> VRMA, then previews it on the real Felt avatar via three-vrm.
- Yes/No - Yes reveals a tag field; No discards and you try another prompt.
- Promote - copies the approved
.vrmaintofelt-character-assets/felt-godot-overlay/animations/library/<tag>/, named from the prompt. Folder nesting in the tag is the tag structure (e.g.reaction/weather/sun) - same convention the hand-curated clips already use, no manifest file.
Why generate and convert use the same cached motion, not two samples
T2M-GPT's generation is stochastic. If "convert" just re-ran generation from
scratch, you could approve motion A in the fast preview and get a different
motion B in the final VRMA. The laptop's inference_server.py caches the
raw generated pose (keyed by request_id) from /generate, and /convert
reuses that exact cached pose for SMPLify - so what you approve is what you
get.
VRAM lifecycle
Opening this app starts inference_server.py on clockmost-nitro5 (loads
CLIP/VQVAE/transformer into GPU memory - the laptop's 6GB is shared with
Ollama/ComfyUI, hand-swapped, never auto-restarted). Closing the app kills
that process, freeing the VRAM. If the server's already running from a
previous session, the app detects that via /health and doesn't double-start it.
Requirements
- SSH access to
clockmost-nitro5with~/felt-t2a-spikeset up (see that repo - T2M-GPT +inference_server.py+ the SMPLify/smpl2bvh bridge). - Blender (tested with 5.2) and Unity 2022.3.62f3, both already required by
AnimToVrmaConverter/Generate-Animation.ps1, which this project shells out to for the local (non-laptop) half of the conversion pipeline. uv sync, thenuv run felt-t2a-studio.
Not yet built
- No progress bar / cancel for the ~2-minute conversion, just a static message.
- No history of past generations within a session - closing the app loses anything not yet promoted.
- Per-stage timing isn't surfaced in the UI (it's logged by
Generate-Animation.ps1itself, appended toAnimToVrmaConverter/sample_output/pipeline_timings.jsonl).