AceStep 1.5 SFT Generate Advanced
The KSampler-Advanced treatment, finally, for a music model
- model
- positive
- negative
- vae
- latent_or_audio
- task
- reference_audio
- model
- vae
- positive
- negative
- latent
- audio
If you've ever split a 50-step image generation across two KSampler Advanced nodes, you already understand this node. It's Generate with the noise and step-range controls exposed: add_noise, noise_seed, start_at_step, end_at_step, return_with_leftover_noise. Everything else - the sampler list including the bundled jkass_quality, the guidance controls, the outputs - behaves exactly as the regular Generate does.
It exists for two-stage sampling - run half the steps, inspect the latent, finish with different settings - and for pipelines that hand a latent from one stage to the next. What it is not is a "better" Generate: the author says it plainly, splitting stages "adds control, not a guaranteed quality gain."
What changes versus Generate
Under the hood it's a subclass that strips denoise (there's no single denoise value when you're slicing a schedule) and removes the task input entirely, so native Cover and Inpaint tasks must use regular Generate. It then calls the same sampler with a full denoise of 1.0, disable_noise from your add_noise choice, and force_full_denoise from return_with_leftover_noise. Your steps value still defines the whole schedule - start_at_step and end_at_step slice it rather than restart it. guidance_schedule and the LM-code handoff also read the full schedule, which is what stops a split run from redoing the guidance ramp in stage two.
The two-stage recipe
Same sampler, scheduler, shift and noise_seed in both nodes, steps=50:
| Stage | add_noise | start_at_step | end_at_step | return_with_leftover_noise |
|-------|-------------|-----------------|---------------|------------------------------|
| First | enable | 0 | 25 | enable |
| Final | disable | 25 | 50 | disable |
Connect the first node's latent output to the second node's latent_or_audio, and hang the VAE off the final stage only. An unfinished range - one that still ends above zero noise, or one that executes no steps at all - skips audio decoding even with a VAE plugged in, so a mid-pipeline decode just isn't a thing you should expect.
Outputs
model, vae, positive and negative pass through for chaining. latent is the raw diffusion result - the one you chain into the next stage. audio is decoded audio, and it only appears when a VAE is connected; without one the node prints a note to console and hands back nothing to wire.
The pack's own knobs, and why they're there
This node also carries the newer widgets the author added while chasing ACE-Step 1.5 SFT quality, and two of them are on by default for good reason.
timbre_cls_token=true restores a learned summary token that the timbre encoder in this ComfyUI core drops - it gets prepended before audio and RoPE positions, matching the official XL implementation. schedule_precision=float32 is the other: building the ace_step schedule in BF16 loses precision before it's converted, and CPU checks at shift=3 found 3, 13 and 35 repeated-sigma intervals for 50, 100 and 200 steps - points where the integrator simply doesn't advance. Float32 is the default now; model reproduces the old behaviour if you want to A/B it.
Then the experimental ones: guidance_rescale (0 by default; try 0.25 and 0.5 with identical seeds - it moves the guided velocity's standard deviation toward the conditional prediction's, at no extra model evaluations), apg_norm_rms (0 keeps the fixed L2 cap from apg_norm_threshold; positive values replace it with an RMS cap independent of duration - not an audio volume control), and guidance_mode=apg_denoised_joint, which projects clean predictions across channels and time together. The author is refreshingly blunt that musical improvement from these needs listening comparisons, not test suites.
Install
Manager search ComfyUI-AceStep_SFT, or:
cd ComfyUI/custom_nodes
git clone https://github.com/jeankassio/ComfyUI-AceStep_SFT.git
Install requirements into ComfyUI's Python (transformers>=4.52.0, torchaudio, librosa, soundfile, numpy, pyyaml), drop in the model files (acestep_v1.5_sft.safetensors or the merged SFT+Turbo build, the Qwen encoders, ace_1.5_vae.safetensors), then restart. You need a ComfyUI with native ACE-Step 1.5 support; the pack layers on the core's ACE modules.
Common issues
jkass_quality is missing, or you have two of them. It's bundled from the author's JK-AceStep-Nodes pack, and the local copy doesn't touch the global sampler registry - so you get exactly one entry whether or not JK is installed separately. If the sampler dropdown looks stale, restart; the pack appends new widgets after existing ones and saved workflows keep their old selections.
An old workflow won't run. ace_step_euler was removed - select jkass_quality and re-save. Values from dropped widgets (enable_normalization, velocity_ema_factor and friends) don't come back; output peak protection stays.
Console warns that your duration doesn't match the LM encoding. Keep TextEncode's and Generate's duration equal, or set Generate's to 0 to inherit.
The continuation doesn't sound like an unbroken run. Sometimes it won't. APG momentum, multistep solver history and SDE noise state may reset at the node boundary; deterministic standard_cfg with the Heun-based jkass_quality survives continuation best. Use stages when you need a decision point, not as a ritual.
Inputs (48)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | AceStep 1.5 diffusion model (from Load Diffusion Model or with LoRA applied). | |
| positive | CONDITIONING | Positive conditioning from AceStep 1.5 SFT TextEncode. | |
| negative | CONDITIONING | Negative conditioning from AceStep 1.5 SFT TextEncode. | |
| add_noise | COMBO | enable | Enable for the first stage; disable when continuing a partially sampled LATENT. |
| noise_seed | INT | 00–18446744073709550000 | — |
| steps | INT | 501–200 | Diffusion inference steps. |
| cfg | FLOAT | 7.01–20 | Classifier-free guidance scale. Use 7 for Base/SFT and 1 for Turbo checkpoints. |
| sampler_name | COMBO | jkass_quality | jkass_quality uses the bundled JK-AceStep-Nodes Heun sampler (ODE), with two model evaluations per step except the final zero-sigma step. |
| scheduler | COMBO | ace_step | ace_step uses Gradio's shifted linear timesteps and CFG timestep bounds. Other schedulers retain ComfyUI step-fraction intervals. |
| start_at_step | INT | 00–10000 | Start index in the full schedule. For continuation, match the previous stage's end_at_step. |
| end_at_step | INT | 100000–10000 | Stop index in the full schedule. Values at or above steps run through the final step. |
| return_with_leftover_noise | COMBO | disable | Enable to keep an unfinished LATENT for another stage; AUDIO decoding is skipped until finished. Disable to force the endpoint to zero noise. |
| duration | FLOAT | 60.00–600 | Duration in seconds. Set to 0 for auto from latent_or_audio. |
| infer_method | COMBO | ode | ode keeps the selected sampler. sde remaps supported ComfyUI Euler/Heun choices to SDE variants; jkass_quality remains ODE. |
| guidance_mode | COMBO | apg | apg follows ACE-Step velocity guidance. apg_denoised projects clean latents per channel; apg_denoised_joint projects channels and time together. ADG = Angle-based Dynamic Guidance. standard_cfg = normal CFG. |
| vaeopt | VAE | VAE for decoding latents to audio. Audio output requires this. | |
| latent_or_audioopt | AUDIO,LATENT | Source audio or LATENT. To continue an unfinished stage, connect its LATENT and disable add_noise. | |
| batch_sizeopt | INT | 11–16 | Number of audios to generate in parallel. Native task context is repeated for each variation. |
| latent_shiftopt | FLOAT | 0.00-0.2–0.2 | Additive shift on latents before VAE decode. |
| latent_rescaleopt | FLOAT | 1.000.5–1.5 | Multiplicative scale on latents before VAE decode. |
| fade_in_durationopt | FLOAT | 0.00–10 | — |
| fade_out_durationopt | FLOAT | 0.00–10 | — |
| use_tiled_vaeopt | BOOLEAN | true | Use context-padded chunks and discard boundary predictions for 1D audio VAE decoding, matching ACE-Step's overlap-discard policy. |
| unload_models_after_generateopt | BOOLEAN | false | Unload models from memory after generation. |
| voice_boostopt | FLOAT | 0.0-12–12 | Gain in dB for the entire mix before peak protection. Does not isolate or boost only the singer. |
| apg_etaopt | FLOAT | 0.00-10–10 | APG eta: parallel component retention. |
| apg_momentumopt | FLOAT | -0.75-1–1 | APG momentum buffer coefficient. |
| apg_norm_thresholdopt | FLOAT | 2.50–15 | APG update norm cap; 0 disables clipping. Velocity units for apg, clean-latent units for apg_denoised. Joint APG uses this value times sqrt(latent channels) as its aggregate cap (2.5 becomes 20 for 64 channels). |
| guidance_intervalopt | FLOAT | 1.00-1–1 | Guidance interval width. 1.0 matches the official full 0-1 guidance interval; -1 uses cfg_interval_start/end. |
| guidance_scheduleopt | COMBO | normal | normal keeps CFG constant; decay decreases from CFG to min_guidance_scale; ramp_up increases from min_guidance_scale to CFG. Ramps follow the active guidance interval. Applies to standard CFG, APG, ADG and split guidance, including jkass_quality. |
| min_guidance_scaleopt | FLOAT | 3.00–30 | Final CFG for decay, or initial CFG for ramp_up. Set to 1 for a fully conditional endpoint. Unused by normal. |
| guidance_scale_textopt | FLOAT | -1.0-1–30 | Split text guidance. Active when both text and lyric > 1.0. |
| guidance_scale_lyricopt | FLOAT | -1.0-1–30 | Split lyric guidance. Active when both text and lyric > 1.0. |
| omega_scaleopt | FLOAT | 0.00-8–8 | — |
| erg_scaleopt | FLOAT | 0.00-0.9–2 | — |
| cfg_interval_startopt | FLOAT | 0.000–1 | — |
| cfg_interval_endopt | FLOAT | 1.000–1 | — |
| shiftopt | FLOAT | 3.00.1–5 | Timestep schedule shift. ACEStep15 default is 3.0. |
| noise_sourceopt | COMBO | official | official draws noise on the model device in model dtype/BTC layout. comfy preserves ComfyUI CPU noise. Batch variations use seed + index. |
| timbre_cls_tokenopt | BOOLEAN | true | Use the trained timbre summary token omitted by this ComfyUI core. Disable only to compare with the previous generation behavior. |
| guidance_rescaleopt | FLOAT | 0.000–1 | Experimental velocity rescale after CFG/APG/ADG, during sampling. 0 preserves current behavior; compare 0.25 and 0.50 with the same seeds. No extra model evaluations. |
| schedule_precisionopt | COMBO | float32 | float32 avoids rounded or repeated ace_step timesteps with BF16 models. model reproduces the previous schedule precision. Does not change model or noise dtype; other schedulers retain their own precision. |
| apg_norm_rmsopt | FLOAT | 0.0000–1 | Optional APG update RMS cap in the selected prediction space, before projection and CFG. 0 keeps apg_norm_threshold. Positive values replace that fixed cap and keep the per-value budget independent of audio duration. For apg_denoised_joint, compare 0.05 and 0.075. Does not control audio volume; ignored by other guidance modes. |
| taskopt | ACESTEP_SFT_TASK | Cover/Remix or Inpaint/Repaint task. Connect the same task to TextEncode and every Advanced stage; continue its LATENT with add_noise disabled. | |
| reference_audioopt | AUDIO,LATENT | Optional singer/timbre reference for a new song. Keeps lyrics, duration and LM codes; with a task, overrides its reference. For Advanced continuation, connect it to every stage. | |
| reference_xl_attentionopt | BOOLEAN | true | Use the checkpoint's alternating sliding/full attention windows in the timbre encoder when a voice reference is available. Independent of timbre_cls_token; keeps LM codes, lyrics and sampling controls. Disable to compare with the previous reference behavior. |
| reference_guidance_scaleopt | FLOAT | 1.00–4 | Experimental independent reference-timbre guidance; 1 retains standard result; higher costs extra conditional prediction per sampling step. Can introduce artifacts. |
| reference_timbre_repeatsopt | INT | 11–8 | Experimental repetition of the complete reference-timbre tokens in cross-attention, without increasing embedding amplitude. 1 keeps the standard result. Only affects a direct reference_audio input; can alter the music or introduce artifacts and does not guarantee voice similarity. |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| vae | VAE | — |
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |
| latent | LATENT | — |
| audio | AUDIO | — |