FL AceStep Scan Audio Directory
Where every ACE-Step training run actually starts
- dataset
- sample_count
- status
This is the boring node that makes or breaks a training run, and nobody reads about it until it breaks. FL AceStep Scan Audio Directory walks a folder - recursively - looking for .wav, .mp3, .flac, .ogg, .opus and .m4a files, reads each one's duration, and builds the ACESTEP_DATASET that every later step in this pack consumes. It doesn't train, it doesn't label, it doesn't encode. It just finds your audio and hands it onward. If it finds nothing, nothing else runs: a status of "No audio files found" is the most common way a fresh ACE-Step workflow silently dies.
How it works
For every audio file it computes the duration (via soundfile, with a torchaudio fallback), then looks for two kinds of sidecar data:
- A
.txtfile next to the audio with the same name - its contents become the sample's lyrics. - A
key_bpm.csvormetadata.csvin the same folder, matched by filename, for BPM, key and caption columns.
That means a hand-curated folder - captions in a CSV, lyrics in .txt files - flows through this node with no LLM involved at all. The Auto-Label node is the automated path; this is the "I already know what I have" path, and it's a good one.
The inputs that matter
- directory - the path to your audio folder. Use an absolute path; relative paths are how people point it at nothing and stare at an empty dataset.
- all_instrumental (default
True) - flags every sample as instrumental, which forces lyrics to[Instrumental]. Most ACE-Step style training is instrumental, so leaving it on is usually right. If your set has vocals, turn it off and drop.txtlyric files next to the songs. - custom_tag - a LoRA activation tag like
my_style. This is the token you'll prompt with after training, same idea as a trigger word on an image LoRA. It gets prepended to every caption. - tag_position -
prepend(default),append, orreplace. Controls where the tag lands relative to the caption text.replaceis a fun one: it swaps the entire caption for the tag, which is how you train a purely tag-driven LoRA.
Outputs
- dataset (
ACESTEP_DATASET) - the object every subsequent node takes as itsdatasetinput. - sample_count (INT) - how many files it found.
- status (STRING) - the human-readable summary.
Installing it
The node ships inside the pack, so install the pack once:
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"). Dependencies include soundfile and torchaudio, both pulled in by pip install -r.
Where people get burned
- It only reads. It never copies, moves or renames anything. Organize your folder before you point it somewhere, or you'll be re-scanning.
- CSV matching is by exact filename.
02. Destiny.wavand02. Destiny.WAVwon't match the same CSV row. Keep the case consistent. all_instrumentaloverwrites lyrics. If you set it toTrue, samples get marked instrumental and their.txtlyrics effectively don't count - the raw text is kept, but the sample is treated as instrumental. On a mixed vocal/instrumental set, that's the trap.- One scan, one snapshot. The dataset is built at scan time. Add files after scanning and you'll re-run the node. Cheap, but easy to forget.
It's not glamorous, but get this node happy and the rest of the pipeline is downhill. A good rule from the pack's own example workflow: tidy folder, absolute path, all_instrumental on, one custom_tag, and let the label node do the rest.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| directory | STRING | — | |
| all_instrumental | BOOLEAN | true | — |
| custom_tagopt | STRING | — | |
| tag_positionopt | COMBO | prepend | 3 options: prepend, append, replace |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| dataset | ACESTEP_DATASET | — |
| sample_count | INT | — |
| status | STRING | — |