CoProducer Measure a mix
A condenser microphone behind a pop filter on black marble with a wisp of breath drifting through, a glowing gold waveform beside it with a small dimmed magenta swell between two phrases

Vocals · 22 October 2026 · 7 min

Loud breaths in your vocal? Turn them down before the compressor, don’t cut them

NoDAW Labs · Lacquer Vol. 06

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.

  1. Split around each breath. Cut just before it starts and just after it ends, leaving the first consonant of the word alone.
  2. 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.
  3. 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.
  4. 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?

Genre notes

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.

A free one-pager

The checklist we run before every release.

Loudness, true peak, mono, tails, export settings and the metadata basics, on one page. Leave your email and it opens straight away, or read it here first. No email needed for that.