Nodes/JK AceStep Nodes/AceStepPostProcess
ComfyUI Node

AceStepPostProcess

Cleaning Up ACE-Step Vocals After the Fact

By jeankassio·Created 9 months ago·Updated 9 months ago· 32
AceStepPostProcess
  • audio
  • breath_audio
  • audio
de_esser_strength0.12
spectral_smoothing0.08
breath_mix0.00

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.

CategoryJK AceStep Nodes/PostProcess

Inputs (5)

NameTypeDefaultDescription
audioAUDIO
de_esser_strengthoptFLOAT0.120–0.6
spectral_smoothingoptFLOAT0.080–0.5
breath_mixoptFLOAT0.000–0.2
breath_audiooptAUDIO

Outputs (1)

NameTypeDescription
audioAUDIO