Nodes/ComfyUI-SCAIL-AudioReactive/SCAIL AIST Beat Dance
ComfyUI Node

SCAIL AIST Beat Dance

Real professional dance mocap that actually reacts to your track

By ckinpdx·Created 9 months ago·Updated 8 months ago· 17
SCAIL AIST Beat Dance
  • library
  • beat_info
  • audio_features
  • reference_pose
  • pose_sequence
sync_dancerstrue
genre_breaktrue
genre_poptrue
genre_locktrue
genre_waackfalse
genre_krumpfalse
genre_housefalse
genre_street_jazzfalse
genre_ballet_jazzfalse
genre_la_hip_hopfalse
genre_middle_hip_hopfalse
transition_frames6
chunks_per_beat1
energy_sensitivity1.00
seed0

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 - an AIST_LIBRARY from SCAILAISTLibraryLoader (that's the ~220MB chunked download, first run only)
  • beat_info - from SCAILBeatDetector, so it knows where the beats land
  • audio_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 - true means 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 mix
  • transition_frames and seed - 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.

CategorySCAIL-AudioReactive/AIST

Inputs (19)

NameTypeDefaultDescription
libraryAIST_LIBRARYAIST chunk library from loader
beat_infoSCAIL_BEAT_INFOBeat detection from SCAILBeatDetector
audio_featuresSCAIL_AUDIO_FEATURESAudio features for energy mapping
sync_dancersBOOLEANtrueAll dancers do same moves (True) or independent (False)
genre_breakBOOLEANtrueInclude breakdance moves
genre_popBOOLEANtrueInclude popping moves
genre_lockBOOLEANtrueInclude locking moves
genre_waackBOOLEANfalseInclude waacking moves
genre_krumpBOOLEANfalseInclude krumping moves
genre_houseBOOLEANfalseInclude house moves
genre_street_jazzBOOLEANfalseInclude street jazz moves
genre_ballet_jazzBOOLEANfalseInclude ballet jazz moves
genre_la_hip_hopBOOLEANfalseInclude LA hip hop moves
genre_middle_hip_hopBOOLEANfalseInclude middle hip hop moves
transition_framesINT61–30Frames to blend between chunks
chunks_per_beatINT11–4Chain consecutive chunks together (1=0.5s, 2=1s, 3=1.5s, 4=2s per beat)
energy_sensitivityFLOAT1.000–3How strongly audio energy affects chunk selection
seedINT00–4294967295Random seed for chunk selection
reference_poseoptSCAIL_POSEStarting pose from DWPose to blend from

Outputs (1)

NameTypeDescription
pose_sequenceSCAIL_POSE_SEQUENCE