Nodes/AnimoFlow/SOMA → SMPL (AnimoFlow)
ComfyUI Node

SOMA → SMPL (AnimoFlow)

The AnimoFlow node you'll probably skip (and when you won't)

By AnimoFlow·Created 2 months ago·Updated about a month ago· 1
SOMA → SMPL (AnimoFlow)
  • soma_raw_b64
  • npz_b64

Let's get the take out front: this is the one AnimoFlow node you will most likely never wire into a workflow - and the reason it exists is exactly why you might someday need it.

The full name is SOMA → SMPL (AnimoFlow), and its single job is to take the raw pose tensors that the Kimodo model generates and convert them into the 22-joint layout AnimoFlow's IK and rigging stages expect. SOMA is the 77-joint skeleton NVIDIA's Kimodo text-to-motion model was trained on; "SMPL" here just means the older 22-joint ordering that HumanML3D-style pipelines use. Type a person walks forward into AnimoFlow's Kimodo node, tell it to hand back raw tensors instead of a finished BVH, and this node turns that blob into something the rest of the graph can digest.

But here's the catch, and the README plus the node's own docstring both admit it: this is a lightweight debug/branch option. The production Kimodo path never touches it. Set Kimodo's output to BVH (22-joint rig) - the default - and the motion comes out as a rig-ready BVH that goes straight into AnimoFlow_Rig, with no SOMA, no IK, no this node. The shipped text_kimodo workflow does exactly that. So when a downloaded workflow contains this node, ask whether the author deliberately chose the raw-tensors route or just left it dangling. Most of the time the answer is "dangling," and you can delete it and use the BVH path.

How it works

Mechanically it's refreshingly simple, and it's one of the few AnimoFlow nodes that runs entirely in your ComfyUI venv - no Docker container, no HTTP call, just numpy and torch, both of which ComfyUI already ships. It decodes the base64 SOMA NPZ blob, runs forward kinematics on the 77-joint SOMA skeleton (the same FK math Kimodo itself uses), adds the root position, then picks out 22 joints through a fixed index map matching the HumanML3D/MDM ordering.

One naming trap worth flagging: "SMPL" doesn't mean the SMPL body model is involved. No SMPL parameters, no mesh regressor - the node is moving 3D positions around. The 22-joint ordering historically came from SMPL's skeleton, so the name stuck, and that's about all it shares.

The inputs and outputs that matter

Exactly one input and one output, which is a relief in an ecosystem of forty-port nodes.

  • soma_raw_b64 (type ANIMOFLOW_SOMA) - the raw SOMA tensor NPZ, straight out of AnimoFlow_Kimodo. This port only carries data if you set that node's output dropdown to SOMA raw; the default BVH outputs won't connect here.
  • Output npz_b64 (type ANIMOFLOW_NPZ) - the converted 22-joint positions in the same NPZ format MDM and MoMask emit, so it plugs cleanly into AnimoFlow_IKAnimoFlow_Rig.

First call takes 10–15 seconds while the converter lazily initializes (it grabs CUDA if you've got it, CPU otherwise).

How to install it

Same as the rest of the pack: ComfyUI Manager, search "AnimoFlow", or

cd ComfyUI/custom_nodes
git clone https://github.com/AnimoFlow/comfyui-animoflow.git

restart ComfyUI, drag a workflow JSON onto the canvas. The real install weight is the model backend, and it's worth knowing the whole shape before you commit:

cd comfyui-animoflow
./install.sh doctor
./install.sh weights
./install.sh up --gpu

That --gpu matters. Kimodo is the pack's only GPU-only model - the community consensus lands around ~17GB VRAM, most of it the text encoder - and it's the only model this node can feed on. First container build runs 15–25 minutes, and Kimodo wants an HF_TOKEN in .env for its weight download.

When it goes wrong

The node's own error message is the honest one: "received no data - make sure AnimoFlow_Kimodo output is set to 'SOMA raw' and the Kimodo container is running." Two failure modes cover almost everything:

  • Kimodo's output dropdown isn't on SOMA raw, so the port is empty or won't even wire.
  • The Kimodo container is down or weightless. ./install.sh status tells you whether weights are actually loaded, and docker compose logs kimodo is where the real reason hides. On a CPU-only machine, stop right there - Kimodo won't start without a GPU.

And the meta-fix, repeated because it's genuinely the answer: if your goal is a rigged character from a text prompt, switch Kimodo to BVH (22-joint rig) and remove this node. That's not a workaround; that's the intended path. This node is the alternative route for people who specifically want the raw-tensor → IK loop - keep it in mind for that, forget it otherwise.

CategoryAnimoFlow/Motion

Inputs (1)

NameTypeDefaultDescription
soma_raw_b64ANIMOFLOW_SOMA

Outputs (1)

NameTypeDescription
npz_b64ANIMOFLOW_NPZ