
Vocals · 22 October 2026 · 7 min
Loud breaths in your vocal? Turn them down before the compressor, don’t cut them
Breaths get loud because compression and limiting turn down the singing but not the quieter breath, then make-up gain lifts everything. Lower each breath with clip gain before the compressor, usually by 4 to 10 dB, instead of deleting it. A vocal with no breaths sounds chopped and robotic; a vocal with breaths sitting well under the words sounds human and still clean.
The raw vocal sounded fine. Then you put a compressor on it, pushed it into the beat, and now every line starts with a gasp that’s almost as loud as the first word. After mastering it’s worse. The obvious fix is to cut every breath out, and that’s usually where the vocal stops sounding like a person.
Breaths aren’t the problem. The gap between the breath and the singing is, and your chain is what’s closing it.
Why compression brings breaths up
A compressor only turns down what goes over its threshold. The singing is loud, so it gets pulled down. The breath is quieter, often under the threshold, so it doesn’t. Then you add make-up gain to bring the singing back to where it was, and that gain lifts the breath too. Here’s the arithmetic for a simple 4:1 compressor:
$ python3 comp_math.py -12 -24 -24 4
in : sung -12.0 breath -24.0 gap 12.0 dB
out: sung -12.0 breath -15.0 gap 3.0 dB (threshold -24.0, 4.0:1, make-up +9.0 dB)
Going in, the breath sat 12 dB under the singing. Coming out, it’s 3 dB under. Same take, same breath, it just lost most of the space around it. Breaths that start further down still lose half their gap:
$ python3 comp_math.py -12 -30 -24 4
in : sung -12.0 breath -30.0 gap 18.0 dB
out: sung -12.0 breath -21.0 gap 9.0 dB (threshold -24.0, 4.0:1, make-up +9.0 dB)
A mastering limiter does the same thing again on the whole mix. That’s why breaths you never noticed in the session show up on the master, the same way esses get louder after mastering.
Turn them down first, with clip gain
The fix is to set the breath level before the compressor sees it. Clip gain (also called region or item gain) changes the audio before any plugin, so the compressor works on a vocal where the breaths are already in their place.
- Split around each breath. Cut just before it starts and just after it ends, leaving the first consonant of the word alone.
- Lower it, don’t mute it. Start with 6 dB down and adjust by ear. Some breaths are part of the phrasing and only need 3 or 4. A big gasp before a loud chorus might want 10 or more.
- Fade the edges. A few milliseconds of fade on each split keeps the gain change from clicking. We measured why in clicks at edit points.
- Then compress. Now the compressor and make-up gain bring everything up together and the breath stays where you put it.
On a long session you can let a script find the breaths first. This one looks for stretches that are quieter than the singing, well above silence, and mostly high-frequency noise, and tells you how much clip gain puts each one 18 dB under the sung level:
#!/usr/bin/env python3
"""List likely breaths in a mono or stereo vocal WAV and how much clip gain brings each to a target level.
A breath here = a stretch of 10 ms frames that is quieter than the singing but well above silence, with
most of its energy above 1.5 kHz. Usage: python3 find_breaths.py vocal.wav [target_dB_below_vocal]"""
import sys, wave, numpy as np
def load(path):
with wave.open(path) as w:
sr, ch, sw = w.getframerate(), w.getnchannels(), w.getsampwidth()
x = np.frombuffer(w.readframes(w.getnframes()), {2: "<i2", 4: "<i4"}[sw]).astype(float)
return x.reshape(-1, ch).mean(axis=1) / (2 ** (8 * sw - 1)), sr
x, sr = load(sys.argv[1]); below = float(sys.argv[2]) if len(sys.argv) > 2 else 18
hop = sr // 100; frames = x[: len(x) // hop * hop].reshape(-1, hop)
rms = 20 * np.log10(np.sqrt((frames ** 2).mean(axis=1)) + 1e-12)
spec = np.abs(np.fft.rfft(frames * np.hanning(hop), axis=1)) ** 2
hi = spec[:, np.fft.rfftfreq(hop, 1 / sr) >= 1500].sum(axis=1) / (spec.sum(axis=1) + 1e-20)
voice = np.percentile(rms[rms > -60], 90) # loud sung level
is_breath = (rms < voice - 6) & (rms > voice - 45) & (hi > 0.7)
print(f"sung level ≈ {voice:.1f} dBFS (10 ms RMS); target for breaths: {voice - below:.1f} dBFS")
i, n = 0, 0
while i < len(is_breath):
if is_breath[i]:
j = i
while j < len(is_breath) and is_breath[j]: j += 1
if j - i >= 8: # at least 80 ms
lvl = 10 * np.log10(np.mean(10 ** (rms[i:j] / 10)))
n += 1
print(f"breath {n}: {i/100:6.2f}-{j/100:6.2f} s {lvl:6.1f} dBFS clip gain {min(0, voice - below - lvl):+5.1f} dB")
i = j
else: i += 1
Run on a test vocal with three sung phrases and a breath before each one:
$ python3 find_breaths.py vocal.wav
sung level ≈ -11.5 dBFS (10 ms RMS); target for breaths: -29.5 dBFS
breath 1: 0.30- 0.65 s -24.0 dBFS clip gain -5.5 dB
breath 2: 2.73- 3.08 s -24.0 dBFS clip gain -5.5 dB
breath 3: 5.16- 5.51 s -24.0 dBFS clip gain -5.5 dB
Treat the list as a map, not a verdict. Thresholds that fit one singer and mic won’t fit every take, and a soft sung word or a breathy note can look like a breath. You still listen to every one.
Why not just cut them, or gate them?
- Cutting leaves holes. Room tone and headphone bleed disappear and come back on every line. Hard silence between phrases sounds edited, especially on a quiet song.
- Breaths carry the timing. The inhale tells the listener the next line is coming. Remove it and phrases start out of nowhere, which is a big part of the robotic, over-tuned feel.
- Gates chatter. A gate set to catch breaths also chops soft word endings and the start of quiet consonants, and it opens and closes on reverb tails.
- De-breath plugins help, carefully. They’re quick on long takes, but they tend to work by reducing, not removing. Set them to turn breaths down a few dB and check the soft passages.
Genre notes
- Pop and R&B. Heavy compression and stacked vocals make breaths add up fast. Lower them on the lead, and on doubles and harmonies cut them or bring them way down, since five breaths at once sounds like wind.
- Rap. Breaths before a fast verse are part of the energy. Keep them, just under the words. Ad-lib tracks usually don’t need their own breaths at all.
- Acoustic, folk and jazz. Lighter compression means breaths stay lower on their own. Touch only the ones that jump out, and leave the rest of the performance alone.
- Podcasts and voiceover. The same rule applies. Cut-out breaths are the first thing listeners notice as over-edited speech.
The same goes for an acapella you pulled from a finished song. Separation keeps the breaths along with the voice, so if you’re pulling a vocal with StemSplit for a remix, set the breaths on the stem first, then build your chain on top. More on that workflow in sampling from separated stems.
- Should you remove breaths from vocals?
- Usually no. Deleting every breath makes a vocal sound chopped and robotic. Lower them with clip gain, often 4 to 10 dB, so they sit well under the words.
- Why are breaths so loud after compression?
- A compressor turns down the loud singing but not the quieter breath, then make-up gain lifts both. In a 4:1 example with a −24 dB threshold, a breath 12 dB under the singing ends up only 3 dB under.
- Should I edit breaths before or after compression?
- Before. Clip gain works before any plugin, so the compressor reacts to a vocal where the breaths are already at the right level.
- How much should I turn down a breath?
- Start around 6 dB and adjust by ear. Breaths that are part of the phrasing may only need 3 or 4 dB; a large gasp before a loud section can take 10 dB or more.