Nodes/ComfyUI-SCAIL-AudioReactive/SCAIL Audio Features
ComfyUI Node

SCAIL Audio Features

Turn audio into per-frame energy bands the choreographer can actually use

By ckinpdx·Created 9 months ago·Updated 8 months ago· 17
SCAIL Audio Features
  • audio
  • audio_features
frame_count81
fps24
bass_range20-250
mid_range250-2000
treble_range2000-8000
smoothing0.30

The whole point of this pack is that the dance reacts to the music, not just to a beat count. SCAILAudioFeatureExtractor is the node that makes that possible: it chews your audio into per-frame features - RMS, bass, mid, treble, and onset strength - that the choreography nodes read to decide how hard to move. Bass drives the bounce, treble drives the arm jitter, energy drives which moves get picked. Without it, SCAILBeatDrivenPose and SCAILAISTBeatDance have nothing to modulate with.

How it works

Under the hood it's honest DSP rather than a model. It takes the audio waveform, slices it into frames at your fps, and for each frame computes RMS (overall loudness) plus an FFT band-passed into the three ranges:

  • bass_range (default 20-250 Hz) - the low end that drives body motion
  • mid_range (default 250-2000 Hz) - vocals and melody territory
  • treble_range (default 2000-8000 Hz) - hi-hats, cymbals, detail

Each band is normalized to 0–1 across the clip, onsets are derived from positive RMS changes (the "something just hit" signal), and smoothing (0–1, default 0.3) applies an exponential moving average so the values ease instead of stuttering. Higher smoothing = calmer but less reactive; the default is a decent middle.

The inputs that matter

  • audio - an AUDIO input from ComfyUI's LoadAudio, VideoHelperSuite's VHS_LoadAudioUpload, or similar. The node handles the standard {waveform, sample_rate} dict.
  • frame_count and fps - make these match your target video exactly. The node slices the audio into frame_count frames at fps, and downstream nodes time everything off that. The default of 81 frames is a nod to Wan's native clip length; if your video is 125 frames at 16fps, set it to 125/16, not 81/24.

The frame_count/fps mismatch is the single most common way people get desynced dance, and it's the first thing to check when the skeleton isn't hitting the beat.

Output

One output, audio_features (type SCAIL_AUDIO_FEATURES), holding rms, bass, mid, treble, onsets, plus frame count and fps. It wires into SCAILBeatDrivenPose, SCAILAISTBeatDance, and SCAILAISTFullSequence (where it's used for length timing). You usually run it in parallel with SCAILBeatDetector - the detector finds when beats happen, this node measures how hard each moment hits.

Installing

Standard pack install: clone ckinpdx/ComfyUI-SCAIL-AudioReactive into ComfyUI/custom_nodes, then pip install -r requirements.txt (taichi, numpy, torch, librosa), and restart. Or use ComfyUI Manager and search the pack title. No model downloads, no keys, no API - everything is computed locally in a few seconds, which makes this the node you can freely re-run while tuning.

CategorySCAIL-AudioReactive

Inputs (7)

NameTypeDefaultDescription
audioAUDIOAudio input from LoadAudio or other audio node
frame_countINT811–10000Number of output frames. Should match your video length.
fpsINT241–120Frames per second. Match your target video FPS.
bass_rangeSTRING20-250Bass frequency range in Hz (low-high). Drives body motion.
mid_rangeSTRING250-2000Mid frequency range in Hz. Vocals/melody typically here.
treble_rangeSTRING2000-8000Treble frequency range in Hz. Hi-hats, cymbals, detail.
smoothingFLOAT0.300–1Temporal smoothing. Higher = less jittery but less reactive.

Outputs (1)

NameTypeDescription
audio_featuresSCAIL_AUDIO_FEATURES