AceMusic Repaint
The bridge is bad — regenerate just that section, keep the rest
- model
- audio
- audio
AceMusic Repaint is the surgical tool in the pack. The Generator makes you a full song; Repaint lets you say "everything's fine except the 12 seconds from 0:40 to 0:52 - redo that part." Instead of regenerating the whole track and praying the good verse comes back, you pick a time range and ACE-Step re-paints just that slice, blending it back into the untouched audio around it. For anyone who's ever gotten a near-perfect generation with one terrible chorus, this is the node you've been missing.
Inputs:
- model - from the Model Loader.
- audio - the track to fix. A core
AUDIOtype, so a Generator output or audio from a HeartMuLa workflow both work. - start_time / end_time - the section to replace, in seconds (0–240, 0.1 steps).
end_timegets clamped to the audio's actual length if you overshoot, and the node will refuse (with a clear error) if start ≥ end. - caption - optional guidance for what the replacement should sound like. Leave blank and it re-generates with the model's default interpretation; fill it in to steer the section ("softer bridge, piano only").
- retake_variance - 0 to 1, default 0.5. How different the new section is allowed to be from the original material. Lower = keep it conservative, higher = let it wander.
- inference_steps and seed - the usual quality and reproducibility knobs.
One output: audio, the full-length track with the section replaced.
How it works
Repaint maps directly onto ACE-Step's repaint task. The source gets written to a temp WAV, its duration measured, and the pipeline is called with repaint_start and repaint_end marking your range. New content is generated into that window while the surrounding audio is preserved as context - that's why the blend back in feels continuous rather than like a cut-and-paste splice. One honest caveat from reading the source: the node passes int(start_time) and int(end_time) to the pipeline, so sub-second precision isn't really preserved - think of these as whole-second ranges and you won't be surprised.
Installing it
Via ComfyUI Manager, search "ComfyUI-AceMusic", or:
cd ComfyUI/custom_nodes
git clone https://github.com/hiroki-abe-58/ComfyUI-AceMusic.git
cd ComfyUI-AceMusic
pip install -r requirements.txt
pip install git+https://github.com/ace-step/ACE-Step.git
Standard pack install; the ACE-Step engine install is the step people skip, and its strict == pins are what actually break. If pip errors on exact-version torchaudio/matplotlib lines, clone ACE-Step, relax them to >=, install editable, or install deps by hand and --no-deps the rest.
Common issues
- "start_time must be less than end_time" - swap the values; the node errors out cleanly here rather than silently doing nothing, which is the good kind of failure.
- The repaired section sounds noticeably separate from the rest - lower
retake_varianceso the new material stays closer to the original's character. - Nothing visibly changes - confirm the range actually covers a real part of the song and that
end_timeisn't being clamped to something tiny. Also double-check you're previewing the Repaint output, not the input. - Whole song regenerated instead of a section - that's actually AceMusic Retake (variations over the full range); if you're seeing that here, the range probably spans the entire duration.
Repaint is the difference between "this track is almost there" and "this track is done." Wire your Generator into it, fix the one bad part, and save yourself a hundred regenerations.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| model | ACEMUSIC_MODEL | — | |
| audio | AUDIO | — | |
| start_time | FLOAT | 0.00–240 | — |
| end_time | FLOAT | 10.00.1–240 | — |
| captionopt | STRING | — | |
| retake_varianceopt | FLOAT | 0.500–1 | — |
| inference_stepsopt | INT | 271–100 | — |
| seedopt | INT | -1-1–2147483647 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |