Nodes/Nova Audio Player/Nova ACE Dataset Builder ๐Ÿงฑ
ComfyUI Node

Nova ACE Dataset Builder ๐Ÿงฑ

Your ACE-Step LoRA starts with a caption nobody wrote

By NovaFemmeยทCreated 20 days agoยทUpdated 2 days agoยท 0
Nova ACE Dataset Builder ๐Ÿงฑ
  • files
  • dataset_json
  • dataset
  • sample_count
  • console
โ—„dataset_json_pathโ–บ
โ—„trigger_wordโ–บ
โ—„tag_positionprependโ–บ
โ—„prompt_sourcecaptionโ–บ
โ—„caption_tagscomment, description, titleโ–บ
โ—„lyrics_tagslyrics, unsyncedlyricsโ–บ
โ—„write_sidecarsfalseโ–บ

ACE-Step is the one open music model people train LoRAs on, and the part that trips everyone is not the trainer - it's the paper round before it. ACE-Step's preprocessor doesn't read tags off your FLACs. It reads a dataset JSON, and something has to write that JSON.

That something is Nova ACE Dataset Builder ๐Ÿงฑ. It's the second node in the pack's training chain: Nova Batch Load Audio points at a folder, the Builder turns that batch into a dataset, the review node checks it, and Preprocess encodes it into tensors. If you've been reading ACE-Step's README wondering where the "dataset builder" tab went in ComfyUI, this is the answer.

What it actually does

It walks each file in the batch, reads the tags the loader already probed, and writes one record per track into the JSON file you name. For each sample it decides three things: the caption the model trains against, the trigger word that goes with it, and whether the track counts as instrumental.

The caption comes from your tags, not from the filename - which is the whole point. caption_tags defaults to comment, description, title and they're tried in order; the first one with actual content wins. lyrics_tags defaults to lyrics, unsyncedlyrics, and an empty result marks the sample instrumental. That word matters more than it sounds: a vocal track trained as an instrumental teaches your trigger that the style has no singing in it. It's the single most common way a music LoRA comes out subtly wrong.

trigger_word is written to every sample as ACE-Step's custom_tag, and tag_position decides where it sits relative to the caption - prepend, append, or replace, which trains on the trigger alone. Pick a token nobody types. crazygecko beats guitar, same as it does on the image side.

prompt_source chooses what the model actually trains against: caption for the tag text, or genre to train against the genre tag instead. Useful when your tags are messy but your genres are consistent.

The inputs that matter

  • files - the NOVA_FILES batch from Nova Batch Load Audio. Nothing else produces this type.
  • dataset_json_path - where the JSON lands. Parent folders get created, so don't pre-create anything.
  • trigger_word and tag_position - the two you'll fiddle with.
  • write_sidecars - off by default. Turn it on and you also get {stem}.lyrics.txt and {stem}.json beside each audio file, which is the layout ACE-Step's own Gradio UI expects. Only reach for it if you also work in that UI; it adds files to your masters folder.

Outputs: dataset_json (the path - wire it into Nova ACE Preprocess), dataset (the same thing in memory for Nova ACE Dataset Review), sample_count, and console for Nova Console.

Install

ComfyUI Manager โ†’ search Nova Audio Player, install, restart. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/NovaFemme/ComfyUI-NovaAudioPlayer.git

Everything lands under โ–ถ๏ธ Nova Audio. This node itself needs nothing extra - it reads tags and writes JSON. The heavy lifting (a separate ACE-Step 1.5 checkout, ~21 GB of checkpoints) belongs to Preprocess and the Trainer, and the pack deliberately downloads none of it.

Before you queue Preprocess

Wire console into a Nova Console and read the two lines the Builder prints:

instrumental     : 0
without a caption: 0

For vocal music both should be zero. If instrumental equals your track count, your lyrics tags aren't where the node is looking - fix the files, don't train around it. Same for captions: a track with no caption falls back to its filename, and the filename is a terrible prompt.

One tuning note worth internalising from the image side of this hobby: dataset curation beats every knob downstream. Six to twelve well-tagged tracks will beat thirty sloppy ones, no matter what the trainer is set to.

Categoryโ–ถ๏ธ Nova Audio/๐ŸŽ“ LoRA Training

Inputs (8)

NameTypeDefaultDescription
filesNOVA_FILESBatch from Nova Batch Load Audio.
dataset_json_pathSTRINGWhere to write the dataset JSON. Parent folders are created.
trigger_wordSTRINGThe LoRA trigger, written to every sample as custom_tag. Use a rare token you can type at inference.
tag_positionCOMBOprependWhere ACE-Step puts the trigger relative to the caption. 'replace' trains on the trigger alone.
prompt_sourceCOMBOcaptionWhich text ACE-Step trains against, written as prompt_override.
caption_tagsSTRINGcomment, description, titleTags to try, in order, for the caption. First non-empty wins.
lyrics_tagsSTRINGlyrics, unsyncedlyricsTags to try, in order, for lyrics. Empty means instrumental.
write_sidecarsBOOLEANfalseAlso write {stem}.lyrics.txt and {stem}.json beside each audio file, the layout ACE-Step's Gradio UI expects.

Outputs (4)

NameTypeDescription
dataset_jsonSTRINGPath of the dataset JSON written โ€” feed this to Nova ACE Preprocess.
datasetNOVA_ACE_DATASETThe same dataset in memory, for Nova ACE Dataset Review.
sample_countINTHow many samples were written.
consoleSTRINGRun log โ€” wire into Nova Console.