π΅ ACE-Step 1.5XL Text Encode
Where ACE-Step music actually gets its instructions
- clip
- conditioning
- tags
- lyrics
This is the node at the heart of the whole pack. Text Encode takes your tags, lyrics, and every musical setting - BPM, time signature, key, language - and turns them into the conditioning that tells ACE-Step 1.5 XL what song to make. Everything upstream (Prompt + Lyrics, TTS-like prompt) exists to feed this node clean data; everything downstream (the KSampler, reference and edit nodes) consumes its output. It's the audio equivalent of a CLIP Text Encode, with a surprising amount of machinery underneath.
The reason it's a separate node at all: ComfyUI has a native TextEncodeAceStepAudio1.5, but the community has repeatedly griped that the built-in audio nodes lag the ACE-Step team's own UI. This node wraps the same mechanism with the full parameter surface exposed, so you're not fighting a hidden subset.
How it works
Under the hood it calls clip.tokenize(tags, lyrics=..., seed=..., bpm=..., duration=..., timesignature=..., language=..., keyscale=..., generate_audio_codes=..., cfg_scale=..., temperature=..., top_p=..., top_k=..., min_p=...) and then encode_from_tokens_scheduled(). Two things make this different from an image text encoder. First, the "clip" here is a Qwen LLM (qwen_0.6b_ace15 or the 4B variant) - the text side is a language model, not a CLIP. Second, when generate_audio_codes is on, the encoder doesn't just embed your words: it generates audio codes from them, using sampling parameters (temperature, top_p, top_k, min_p) that look like an LLM sampler because that's exactly what they are. You're not just describing the song; you're prompting a tiny composer.
The inputs that matter
- clip - the Qwen ACE-Step text encoder from a CLIP Loader. Pick the size your VRAM allows.
- tags - comma-separated style ("romantic, moonlight, night city, love balladβ¦"). The default is a working song prompt.
- lyrics - the song text with
[verse]/[chorus]markers. Empty it for pure instrumentals. - duration - must match the latent you feed the sampler. This is the #1 mismatch bug in this pack.
- generate_audio_codes - on for fresh generation; turn it off when a reference voice should dominate, per the pack README.
- bpm, timesignature, language, keyscale - the musical frame, self-explanatory and worth using.
- cfg_scale, temperature, top_p, top_k, min_p - the encoder's internal sampling dials. Defaults are sane; most people never touch them.
Outputs: conditioning (into KSampler), plus tags and lyrics echoed back so you can see exactly what got encoded.
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, qwen_0.6b_ace15.safetensors (or 4B), and ace_1.5_vae.safetensors. XL is the 4B-decoder tier - 12GB+ VRAM, not the potato-GPU promise of plain 1.5.
Gotchas
Duration mismatches are the classic failure - set the encoder's duration from your latent node's seconds output and the class of bugs disappears. And remember what the community reports about ACE-Step in general: instrumental and ambient output is genuinely compelling, but lyrics and vocals stay the weak suit no matter how the conditioning is tuned. The encoder can only work with what the model is good at. If your generation comes out repetitive or the vocals garble, drop temperature and lean on cfg_scale before you blame the pack.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| clip | CLIP | β | |
| tags | STRING | romantic, moonlight, night city, love ballad, dreamy, sentimental, tender vocals, soft piano, gentle guitar, warm pads, slow tempo, atmospheric, intimate, emotional, cinematic | β |
| lyrics | STRING | [verse] Silver moonlight on your face Turns this crowded world to lace Every shadow softens down When your hand is what I've found [chorus] Stay with me beneath the moon Let it paint our love in blue Hold me close, don't let it end In this light we start again | β |
| seed | INT | 00β18446744073709550000 | β |
| bpm | INT | 12010β300 | β |
| duration | FLOAT | 120.00β2000 | β |
| timesignature | COMBO | 4 | 4 options: 2, 3, 4, 6 |
| language | COMBO | en | 23 options: en, ja, zh, es, de, fr, +17 |
| keyscale | COMBO | E minor | 34 options: C major, C# major, Db major, D major, D# major, Eb major, +28 |
| generate_audio_codes | BOOLEAN | true | β |
| cfg_scale | FLOAT | 2.00β100 | β |
| temperature | FLOAT | 0.850β2 | β |
| top_p | FLOAT | 0.900β1 | β |
| top_k | INT | 00β100 | β |
| min_p | FLOAT | 0.0000β1 | β |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| conditioning | CONDITIONING | β |
| tags | STRING | β |
| lyrics | STRING | β |