π΅ ACE-Step 1.5XL Repaint Audio
Regenerate just the part of the song you hate
- audio
- vae
- latent
- source_latent
- seconds
- summary
Every generation has that one section - the bridge that goes nowhere, the chord change that sounds wrong at 0:45. Repaint Audio is audio inpainting: you give it a start and end time, it masks that region of the latent, and the KSampler regenerates just that slice while everything outside stays untouched. Same idea as image inpainting, applied along the time axis.
It's the node for "fix the arrangement, keep the song." The workflow is simple: Load Audio β Repaint Audio β latent into KSampler, set your text encoder to the full duration, and let the sampler fill in the masked window. Because only the masked range is regenerated, the parts you like come back identical - which is the entire point. The pack's README pairs this with adjusting KSampler denoise together with the mask settings, and that's the honest recipe: the mask says where, the denoise says how hard.
How it works
After encoding your audio with the ACE 1.5 VAE, it converts start_seconds/end_seconds to latent frames (25 frames per second), writes a noise_mask over that range, and attaches it to the latent. The sampler then regenerates the masked frames while the unmasked frames act as fixed context. mask_value controls how strongly the region is treated as "to redraw": 1.0 means full regeneration, lower values let the sampler compromise between the old content and the new. The mask logic itself lives in the Repaint Latent node, which this wraps - the audio version just adds the encode step and exposes a simpler interface.
The inputs and outputs
- audio - your source clip.
- vae - the ACE 1.5 VAE.
- start_seconds / end_seconds - the masked window. Set
end_secondsto 0 to repaint to the very end of the clip. - mask_value - 0 to 1, how strongly the region gets redrawn (default 1).
Outputs: latent (masked latent β KSampler), source_latent (the unchanged encode, for comparison), seconds (the clip length), and summary (shows the exact masked range and mask value - read it once to confirm your numbers became the frames you expected).
Install
ComfyUI Manager ("ComfyUI-ACEStep") or:
cd ComfyUI/custom_nodes
git clone https://github.com/starsFriday/ComfyUI-ACEStep.git
then restart. No pip deps; models from the ACE-Step 1.5 repo (acestep_v1.5_xl_turbo_bf16.safetensors, Qwen ACE CLIP, ace_1.5_vae.safetensors). XL tier: ~12GB+ VRAM.
Gotchas
The node raises an error if end_seconds is not greater than start_seconds (or 0), so a backwards range is caught immediately - that's the pack being helpful, not annoying. The real tuning is denoise: at full denoise the masked region is fully reimagined and can clash at the seams; lower denoise (with a lower mask_value) keeps it anchored but can undershoot the fix. Start at default, listen, and move denoise in steps of 0.1. And if you're repainting a vocal section, remember ACE-Step's vocals are its weak suit - you're regenerating within the model's limits, so a busy instrumental region will come out cleaner than a demanding vocal line.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | β | |
| vae | VAE | β | |
| start_seconds | FLOAT | 0.000β10000 | β |
| end_seconds | FLOAT | 0.000β10000 | β |
| mask_value | FLOAT | 1.000β1 | β |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| latent | LATENT | β |
| source_latent | LATENT | β |
| seconds | FLOAT | β |
| summary | STRING | β |