Nodes/ComfyUI-ACEStep/🎡 ACE-Step 1.5XL Extend Latent
ComfyUI Node

🎡 ACE-Step 1.5XL Extend Latent

Extend a track when you already have it in latent form

By starsFridayΒ·Created 4 months agoΒ·Updated 4 months agoΒ· 4
🎡 ACE-Step 1.5XL Extend Latent
  • latent
  • latent
  • seconds
  • summary
β—„left_extend_seconds0.00β–Ί
β—„right_extend_seconds10.00β–Ί
β—„existing_mask_modeoverwriteβ–Ί

Extend Latent is the plumbing-friendly twin of Extend Audio. Same job - pad a track with newly generated audio before or after the existing material, leaving the original untouched - but instead of taking an AUDIO clip and a VAE, it takes a latent that's already been encoded. If your source is coming from an Empty Latent Audio, an earlier generation, or a cached encode, this is the node you want.

The immediate win is speed and repeatability. The encode step in Extend Audio runs every time; here you encode once (or reuse a latent you already have) and then extend as many times as you like, adjusting left/right seconds without re-encoding the source. It also exposes a control the audio version doesn't: existing_mask_mode, for deciding what happens to any mask that's already on the latent.

How it works

It concatenates ACE silence latents (from ComfyUI's own get_silence_latent, so the padding matches what the model thinks silence sounds like) around your source latent, then builds a noise_mask marking the new regions. The existing content keeps its latent values - so the sampler's job is to generate only the padded regions, guided by the conditioning, with the old audio acting as context. Because it works on a latent directly, it can chain: extend, generate, extend again, and the mask logic keeps accumulating correctly if you tell it to.

The inputs and outputs

  • latent - an ACE-Step LATENT (64 channels, "type": "audio"), e.g. from Audio to Latent.
  • left_extend_seconds / right_extend_seconds - how much to add (defaults 0 / 10).
  • existing_mask_mode - overwrite (default) replaces any prior mask; add unions the new region into it; subtract clears it. Reach for add when you're chaining multiple extensions or edits on one latent.

Outputs: latent (extended, into KSampler), seconds (new total - feed to Text Encode's duration), and summary (the source/left/right/output timing breakdown). Note there's no source_latent here, unlike the audio version - the input latent is the source, and it's unchanged.

Install

ComfyUI Manager ("ComfyUI-ACEStep") or:

cd ComfyUI/custom_nodes
git clone https://github.com/starsFriday/ComfyUI-ACEStep.git

then restart. No pip deps of its own; models come from the ACE-Step 1.5 repo (acestep_v1.5_xl_turbo_bf16.safetensors, a Qwen ACE CLIP, ace_1.5_vae.safetensors). This is the XL tier - ~12GB+ VRAM, not the sub-4GB promise of plain 1.5.

Gotchas

The 64-channel validation will bite you if you feed it a latent from the wrong source - that error message is the pack telling you the latent isn't ACE-Step audio. And the same duration rule as its audio sibling: set the text encoder's duration from the returned seconds, or the extended region won't line up with the conditioning. One more: if you extend a latent that was already generated-and-decoded, you're extending at latent quality - the mask preserves the old region, but the seam quality depends on the sampler's denoise, so budget a bit of fiddling there.

Categoryaudio/ACE-Step 1.5 XL

Inputs (4)

NameTypeDefaultDescription
latentLATENTβ€”
left_extend_secondsFLOAT0.000–10000β€”
right_extend_secondsFLOAT10.000–10000β€”
existing_mask_modeCOMBOoverwrite3 options: overwrite, add, subtract

Outputs (3)

NameTypeDescription
latentLATENTβ€”
secondsFLOATβ€”
summarySTRINGβ€”