π΅ ACE-Step 1.5XL Reference Audio
Make ACE-Step sing with someone else's voice
- conditioning
- reference_audio
- vae
- conditioning
- reference_latent
- negative_conditioning
ACE-Step's vocals are its weak point, but there's a workaround the model was built for: give it a voice to imitate. Reference Audio takes a clip of someone singing or speaking, encodes it, and attaches the timbre to your conditioning - so the song you generate comes out in that voice's direction. It's the closest thing ACE-Step has to voice cloning, and it's what turns the TTS-like prompt node from a gimmick into a voice-guided narration pipeline.
The canonical use is the pack's reference workflow: build positive conditioning with Text Encode, run it through this node, connect conditioning to the KSampler's positive and negative_conditioning to its negative, and keep generate_audio_codes off on the text encoder so the reference voice actually steers the result. Done right, you get the target voice steering timbre while ACE-Step still reinterprets timing and melody - looser than TTS, more useful for singing.
How it works
This node is a convenience wrapper over its sibling, Reference Latent: it encodes your reference_audio with the ACE 1.5 VAE first (resampling if needed), then applies the reference logic. That logic does three things:
- Builds a negative_conditioning by zeroing out your conditioning and stripping the reference payload - the safe way to get a negative, because a naive
ConditioningZeroOutcan keep the reference latents attached and quietly weaken the voice reference. The README calls this out specifically. - Crops the reference clip to
reference_start_secondsthroughreference_start_seconds + reference_max_seconds(0 means "whole clip"). - Blends the reference latent toward silence by
reference_strength, then stamps it into the conditioning asreference_audio_timbre_latents.
The inputs that matter
- conditioning - your positive conditioning from Text Encode.
- reference_audio - the voice sample, 10β30 seconds of clean vocals beats a full mix.
- reference_strength - 0 to 1, how hard the reference voice pushes. Start at 1, dial back if the voice swamps the composition.
- reference_start_seconds / reference_max_seconds - crop the sample without editing the file.
Outputs: conditioning (positive, to KSampler), reference_latent (the encoded, strength-blended sample), and negative_conditioning (to the KSampler negative).
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, a Qwen ACE CLIP, ace_1.5_vae.safetensors). XL tier means ~12GB+ VRAM.
Gotchas
The two documented traps are both about what you don't do: don't run ConditioningZeroOut after this node for the negative (use the provided negative_conditioning), and keep generate_audio_codes disabled when the reference should dominate - if it's on, the encoder's own lyric-to-code generation fights the reference. And set expectations: this steers timbre, it doesn't clone a voice perfectly. The community's verdict on ACE-Step vocals is "promising, not polished," so treat the reference as a strong nudge, not a guarantee.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| conditioning | CONDITIONING | β | |
| reference_audio | AUDIO | β | |
| vae | VAE | β | |
| reference_strength | FLOAT | 1.000β1 | β |
| reference_start_seconds | FLOAT | 0.000β10000 | β |
| reference_max_seconds | FLOAT | 0.000β10000 | β |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| conditioning | CONDITIONING | β |
| reference_latent | LATENT | β |
| negative_conditioning | CONDITIONING | β |