FL YuE2 · Audio Adapter Trainer
The node that stops and makes you listen
- assets
- dataset
- config
- YUE2_AUDIO_ADAPTER
Training nodes are usually black boxes: queue it, wait, hope the loss curve meant something. FL YuE2 · Audio Adapter Trainer is unusual in that it renders a step-0 baseline before any training happens, then a playable sample at every checkpoint - source, target, baseline and checkpoint in one carousel with a seek bar, same seed and same held-out recording each time. You are meant to judge with your ears, not from the loss chart. The author says so outright in the docs: lower flow loss doesn't prove the transformation sounds good.
That matters more here than in image LoRAs, because this packs into a category the community has been honest about: local music generation's weak spot isn't instrumentals, it's control. ACE-Step gets you a plausible track; getting your effect, your mix, your timbre is the unsolved part.
What it's doing under the hood
This is the terminal node of the paired-adapter path (Paired Audio Dataset → Prepare Audio Pairs → Audio Adapter Trainer → Audio to Audio → Preview Audio), and it's marked as an output node, so it's the thing you queue. It hands the actual work to a worker subprocess that owns its GPU allocation and exits between training and preview phases - which is why cancelling mid-preview doesn't nuke your whole run.
action=train needs three wires up: assets (from Training Models), dataset (prepared pairs), config (from Audio Adapter Config). The optional inputs are lazy, so the node only pulls them when the action calls for them. With previews on, it starts a run, renders the baseline, trains to a checkpoint, renders again, and keeps going - pausing at each checkpoint so you can actually hear whether step 100 was better than step 400. It is not a fixed-length job.
Output is YUE2_AUDIO_ADAPTER, a portable package. It lands in models/loras/YuE2_audio/<output_name>/step-000100/ next to a manifest.json listing relative weight filenames and hashes; head.safetensors, acoustic.safetensors and - in conditioned mode - conditioning.safetensors sit beside it. Copy the whole folder. A single weight file is useless.
The inputs that matter
action is train or use_saved. use_saved is the "I already trained this, just give me a package to run" path - it skips preparation entirely and returns the checkpoint you point it at, which is handy for inference-only graphs.
output_name is your run name, and paired runs behave differently from the AR LoRA trainer: for audio adapters, an existing run is not overwritten. You either pick a new name or you set resume to the literal string resume.pt to continue. That's a safety rail, and it's the one that keeps a second evening's training from eating the first.
selected_step picks which checkpoint the node returns - 0 means the latest trained checkpoint, not the baseline. validation_index chooses which held-out pair you're auditioning, and preview_seconds, sampling_steps and preview_seed control how the comparisons get rendered. Keep the seed fixed; that's the point of a comparison. condition_scale belongs to conditioned adapters: 1 is the training baseline, 0 removes the source latent signal, and anything in between blends and costs you two decoder passes.
Install
ComfyUI Manager → search ComfyUI-FL-YuE2, or the manual route:
cd ComfyUI/custom_nodes
git clone https://github.com/filliptm/ComfyUI-FL-YuE2.git
cd ComfyUI-FL-YuE2
python -m pip install -r requirements.txt
python -m pip install -r requirements-training.txt
Then queue Training Models once with download_missing enabled so the MERT asset, tokenizer head, regularizer pack and starting acoustic companion land in your model folders. example_workflows/audio_adapter_training.json is the working graph to copy. Needs a BF16-capable NVIDIA card and a current ComfyUI.
Where people get burned
Reusing a run name. output_name collides and the node tells you, rather than quietly starting over. Change the name or resume.
Editing your audio after preparing. Preparation records hashes, so a touched WAV or a moved file fails loudly with "audio changed; prepare the pairs again". Resume is no different - it re-verifies the dataset, config and base assets, so an inconsistency shows up at the start of a run instead of a hundred steps in.
Running out of VRAM. The author's short-window acoustic test peaked around 7.2 GiB and joint was 7.8 GiB, but that's an 8-second-window smoke test on a 96 GB card - longer windows and bigger rank climb from there. Cut preview_seconds, cut window_frames, close other GPU work. Adding system RAM won't save you; the transfer penalty makes offload a last resort, not a plan. Also worth knowing before you start: the MERT/token compression genuinely does discard detail, so some transformations will never be clean. This is a generative source-conditioned adapter, not a sample-exact audio effect.
Cancelling mid-preview and assuming it's lost. The most recent saved checkpoint survives, and resuming re-renders the preview before continuing. Unsaved updates between checkpoints are the part you lose.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| action | COMBO | Train a new/resumed adapter, or use an existing package without preparation. | |
| output_name | STRING | my_audio_adapter | Run name. Use a new name for a new experiment; existing paired runs require explicit resume. |
| resume | STRING | Enter resume.pt to continue this run, including after a cancelled preview. | |
| selected_step | INT | 00–100000 | 0 selects the latest trained checkpoint, not the baseline. |
| render_previews | BOOLEAN | true | Render held-out source-to-target previews before training and at checkpoints. |
| preview_seconds | INT | 81–360 | Maximum held-out sample duration. |
| preview_seed | INT | 420–4294967295 | Fixed noise seed for baseline and checkpoints. |
| sampling_steps | INT | 324–100 | Acoustic synthesis steps for previews. |
| validation_index | INT | 00–100000 | Held-out pair to play. Index follows dataset order; changing it regenerates comparisons. |
| assetsopt | YUE2_TRAINING_ASSETS | — | |
| datasetopt | YUE2_PREPARED_AUDIO_PAIRS | — | |
| configopt | YUE2_AUDIO_TRAIN_CONFIG | — | |
| condition_scaleopt | FLOAT | 1.00–5 | Conditioned adapters: 1 uses source conditioning directly; 0 removes the source latent signal. Other values use two decoder passes for guidance. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| YUE2_AUDIO_ADAPTER | YUE2_AUDIO_ADAPTER | — |