SCAIL AIST Beat Dance
Real professional dance mocap that actually reacts to your track
- library
- beat_info
- audio_features
- reference_pose
- pose_sequence
Procedural dance (the SCAILBeatDrivenPose node) is great, but it's synthetic. If you want the pack to play actual motion capture of professional dancers, this is the node: SCAILAISTBeatDance grabs short chunks of real AIST++ dance recordings and fires them off in time with your music. It's the "reactive" half of the AIST options - beat-triggered, energy-aware, and happy to mix genres. The trade, and the author is upfront about it, is that chunk boundaries can feel a bit janky. You're trading smoothness for real motion and variety.
What it needs
This is not a standalone node. It wants three things wired in:
library- anAIST_LIBRARYfrom SCAILAISTLibraryLoader (that's the ~220MB chunked download, first run only)beat_info- from SCAILBeatDetector, so it knows where the beats landaudio_features- from SCAILAudioFeatureExtractor, so it knows how much energy each moment has
You can also feed an optional reference_pose (from DWPose or the Base Pose generator) to blend the first chunk in from your character's actual pose.
How it picks chunks
The AIST++ data was cut into roughly half-second chunks at velocity minimums - natural pauses in the movement - so each chunk is a self-contained move rather than an arbitrary slice. Each chunk is tagged low/mid/high energy, calculated per-genre (a high-energy krump chunk isn't judged against a low-energy house chunk; that's the smart part). On each beat the node picks a chunk that fits the energy, chains consecutive chunks together, and blends between them over transition_frames.
The inputs you'll actually touch:
sync_dancers-truemeans every character does the same move (for a solo this is moot; for a group it's the difference between a crew and chaos)- The
genre_*toggles - break, pop and lock default on; waack, krump, house, street_jazz, ballet_jazz, la_hip_hop and middle_hip_hop default off. Turn on only what fits your track chunks_per_beat- chain longer sequences per beat (1 = 0.5s, 2 = 1s, up to 4 = 2s)energy_sensitivity- how hard audio energy pulls chunk selection; crank it up for EDM, drop it for a track with a flat mixtransition_framesandseed- blend length and the random pick
Everything else (beats, energy, library) arrives by wire.
The output and where it goes
Single output, pose_sequence, straight into SCAILPoseRenderer, and from there the rendered skeleton frames feed your Wan video pose-control nodes (the pack's example workflows use WanVideoAddSCAILPoseEmbeds in ComfyUI-WanVideoWrapper with the SCAIL-preview model).
Installing and troubleshooting
Same pack, same install: clone into custom_nodes, pip install -r requirements.txt (taichi, numpy, torch, librosa), or grab it via ComfyUI Manager by searching the pack title. First run triggers the AIST chunk download from HuggingFace - give it a few minutes and watch the console for the progress bar.
Two things trip people up. First, if library shows nothing, you probably skipped the loader or the download failed partway - the loader retries, but a full re-clone of that folder is the blunt fix. Second, janky transitions are expected: chunks are cut at velocity minimums, not phrase boundaries. If it bothers you, raise transition_frames or switch to SCAILAISTFullSequence, which trades reactivity for buttery real choreography.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| library | AIST_LIBRARY | AIST chunk library from loader | |
| beat_info | SCAIL_BEAT_INFO | Beat detection from SCAILBeatDetector | |
| audio_features | SCAIL_AUDIO_FEATURES | Audio features for energy mapping | |
| sync_dancers | BOOLEAN | true | All dancers do same moves (True) or independent (False) |
| genre_break | BOOLEAN | true | Include breakdance moves |
| genre_pop | BOOLEAN | true | Include popping moves |
| genre_lock | BOOLEAN | true | Include locking moves |
| genre_waack | BOOLEAN | false | Include waacking moves |
| genre_krump | BOOLEAN | false | Include krumping moves |
| genre_house | BOOLEAN | false | Include house moves |
| genre_street_jazz | BOOLEAN | false | Include street jazz moves |
| genre_ballet_jazz | BOOLEAN | false | Include ballet jazz moves |
| genre_la_hip_hop | BOOLEAN | false | Include LA hip hop moves |
| genre_middle_hip_hop | BOOLEAN | false | Include middle hip hop moves |
| transition_frames | INT | 61–30 | Frames to blend between chunks |
| chunks_per_beat | INT | 11–4 | Chain consecutive chunks together (1=0.5s, 2=1s, 3=1.5s, 4=2s per beat) |
| energy_sensitivity | FLOAT | 1.000–3 | How strongly audio energy affects chunk selection |
| seed | INT | 00–4294967295 | Random seed for chunk selection |
| reference_poseopt | SCAIL_POSE | Starting pose from DWPose to blend from |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| pose_sequence | SCAIL_POSE_SEQUENCE | — |