AceStepPostProcess
Cleaning Up ACE-Step Vocals After the Fact
- audio
- breath_audio
- audio
ACE-Step vocals come out of the box with a specific, recognizable flaw: a metallic sizzle concentrated in the upper frequencies, especially on female vocals. The pack's sampler fights this during generation with anti_autotune_strength and frequency_damping - but those knobs only work on the latent. If you're decoding through a third-party VAE/vocoder, or you want to fix an audio file you already have, that's what this node is for: a lightweight post-process pass that runs on the final waveform.
What it actually does
It's a three-effect chain, all computed in the frequency domain via STFT:
- de_esser_strength (default 0.12, 0–0.6) - the star of the show. It attenuates everything above 6 kHz, proportionally to the value. That's exactly the band where the metallic/vocoder-sizzle lives. This is the README's suggested quick fix for harsh vocals.
- spectral_smoothing (default 0.08, 0–0.5) - applies a small smoothing kernel across frequency bins, blending each bin with its neighbors to soften spectral harshness.
- breath_mix (default 0.0, 0–0.2) with a breath_audio input - the humanization trick. Feed it a short recording of actual breathing/room tone and it mixes a small amount into the first channel of your audio. Subtle, but it's the difference between a sterile vocal and one that sounds like a person was in the room.
One AUDIO input in, one audio out. Wire it after your VAE decode / vocoder output and before your playback or save node.
The mechanism, honestly
For each channel it computes an STFT, applies the de-esser mask and smoothing to the magnitude spectrum, keeps the original phase, and reconstructs with an inverse STFT. It's the audio equivalent of a quick EQ and spectral-softening pass - not a mastering suite, not a de-esser plugin. It renormalizes at the end so you don't get clipped garbage.
When to reach for it
The pack's README positions it as the quick fix when a render comes out metallic: de-ess the 6–10 kHz band, smooth, add a touch of breath. It's also genuinely useful if you're using a third-party vocoder (the README's "high-quality VAE/vocoder" advice) and want a safety net. It is not the tool for fixing a fundamentally bad render - if the audio has word-cutting, stuttering, or heavy artifacts, go back to the sampler (the README's jkass_quality + 80–120 steps + anti-autotune advice) rather than papering over it here.
Install
Pack standard: ComfyUI Manager (search "JK AceStep Nodes") or
cd ComfyUI/custom_nodes
git clone https://github.com/jeankassio/JK-AceStep-Nodes.git
restart. No extra dependencies beyond the pack's (torch, numpy, tqdm, librosa); the STFT work is pure torch.
Gotchas
Keep breath_mix low - anything past ~0.1 starts to sound like someone is breathing into the mic the whole song, which is a different kind of wrong. And note the node assumes a 44.1 kHz sample rate if the audio dict doesn't carry one; if your pipeline runs at a different rate, the 6 kHz de-ess cutoff shifts accordingly. It's a blunt tool applied with one knob, and for a quick de-ess fix that's exactly what you want.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | — | |
| de_esser_strengthopt | FLOAT | 0.120–0.6 | — |
| spectral_smoothingopt | FLOAT | 0.080–0.5 | — |
| breath_mixopt | FLOAT | 0.000–0.2 | — |
| breath_audioopt | AUDIO | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |