FL AceStep Auto-Label Samples
The node that writes captions, BPM, key and genre for every song
- dataset
- model
- vae
- llm
- dataset
- labeled_count
- status
This is the showpiece - the node that makes this pack more than a glorified trainer. FL AceStep Auto-Label Samples takes a scanned dataset and hands it back with a caption, genre tags, BPM, key/scale, time signature and (optionally) lyrics for every sample, all generated by a local LLM. It's the music-world equivalent of auto-captioning an image dataset with a vision model, and it's the reason you can dump a folder of songs into ComfyUI and train a style LoRA without writing a single tag by hand.
It's the same idea the community has been doing on the image side for years - putting a language model in the graph as a worker tool - just pointed at audio. And it's genuinely what this pack is known for: people who use it describe dumping tracks in and letting "the training do the rest."
How it works
For each sample the node does four things:
- Runs the audio through the ACE-Step VAE to get latents.
- Quantizes those latents into discrete audio code tokens via the DiT tokenizer - strings like
<|audio_code_123|>. - Feeds the code string to the 5Hz LLM (from
FL AceStep LLM Loader) using ACE-Step's "understand the audio semantics" instruction. - Parses the returned
<think>YAML block intocaption,bpm,keyscale,timesignature,genreandlanguage, with any lyrics pulled from after the closing tag.
The audio gets limited to 30 seconds for the listening pass, which is plenty for the model to get tempo, key and vibe.
The inputs that matter
Required: dataset (from Scan Directory), model (MODEL - the ACE-Step checkpoint, purple), vae (VAE - red), llm (ACESTEP_LLM - from the LLM Loader).
The four optional toggles:
- skip_metas - caption only; skip BPM/key/time signature. Faster, and honestly the right call if you don't care whether the key is right.
- only_unlabeled - process only samples that don't have a caption yet. Gold for re-runs after you hand-fix a few.
- format_lyrics - run the LLM over your own
.txtlyrics instead of listening to the audio. - transcribe_lyrics - attempt to transcribe vocals from the audio itself. Temper expectations: ACE-Step's vocals are its weak suit, so the transcriptions inherit that weakness.
Outputs
- dataset - the same dataset object, now with
labeledsamples populated. - labeled_count (INT) - how many samples got tagged.
- status (STRING) - summary, including an error count if any samples failed.
Installing it
Same pack-level install as the rest of this set:
cd ComfyUI/custom_nodes
git clone https://github.com/filliptm/ComfyUI-FL-AceStep-Training.git
cd ComfyUI-FL-AceStep-Training
pip install -r requirements.txt
Restart ComfyUI, or use ComfyUI Manager and search "FL AceStep". You'll also need the ACE-Step 1.5 checkpoint loadable through ComfyUI's built-in Load Checkpoint node - this pack relies on ComfyUI's native ACE-Step support for the MODEL/VAE/CLIP trio rather than shipping its own model loader.
Where people get burned
- It checks the model. Feed it anything that isn't an ACE-Step checkpoint and it returns "Model is not an ACE-Step model" and labels nothing. The
MODELinput has to come from an ACE-Step checkpoint. - It's the slowest step before training. Every sample gets encoded to codes and pushed through an LLM. Do a couple of files first, eyeball the captions, then run the full set. Nobody wants to discover bad captions at epoch 90.
- The vocal honesty gap. Instrumental description is genuinely good; vocals and lyrics are where the output gets flaky. If you're training instrumental style (the common case), this doesn't matter much.
- Labeling isn't mandatory. This is the fun path, but the pack fully works if your captions come from a
metadata.csvand your lyrics from.txtfiles. Auto-labeling is a convenience, not a requirement.
One tip carried over from image-side training: treat these captions as a starting draft, not gospel. A 30-second listen and an LLM will get you 90% of the way; the last 10% is you saying "no, it's not 'dreamy synthwave', it's 'night drive synthwave'". The only_unlabeled toggle makes that audit loop cheap.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| dataset | ACESTEP_DATASET | — | |
| model | MODEL | — | |
| vae | VAE | — | |
| llm | ACESTEP_LLM | — | |
| skip_metasopt | BOOLEAN | false | — |
| only_unlabeledopt | BOOLEAN | false | — |
| format_lyricsopt | BOOLEAN | false | — |
| transcribe_lyricsopt | BOOLEAN | false | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| dataset | ACESTEP_DATASET | — |
| labeled_count | INT | — |
| status | STRING | — |