W/01Writing

How I approached sibilant detection

·~6 min read
detectiondynamicsde-essing

A de-esser has one job: find the harsh “s” sounds in a vocal and turn them down without touching anything else. Most of the attention goes to the second half, the gain reduction. In my experience the first half decides everything. If detection fires in the wrong spots, you're just attenuating the wrong moments, very precisely.

This is how I approached the detection problem during de-esser research for NoiseWorks. I'm keeping it at the concept level, the tuning values and implementation details stay with the client. The thinking carries over to pretty much any detector though: compressors, gates, transient tools.

Detection first, processing later

First decision: refuse to work on both halves at once. I built the dumbest processor I could, plain wideband gain reduction, and put all the work into the detector. When the only thing that changes is detection, you can actually hear whether it fires in the right places. Tune both at once and every artifact has two possible causes. You learn nothing.

Why the obvious approach fails

The obvious idea: sibilants are bright, so watch the energy in the high band and trigger when it crosses a threshold. It works on exactly one file. The one you tuned it on.

The problem is dynamics. A whispered “s” never reaches an absolute threshold and sails through untouched. A loud, projected phrase pushes normal vocal content over the threshold and the de-esser starts chewing on words that were never sibilant. You can chase this with the threshold knob all day. You're only picking which failure you prefer.

dBtfixed thresholdquiet ess: never crossesloud vowels: cross anywayess bandvoice body
fig. 01One fixed threshold, two failures: the quiet ess stays under it, the loud vowels go over it. The ratio between ess band and voice body catches both cases.
An absolute threshold answers “is the top end loud?” Wrong question. The right one: is the top end loud relative to this voice, right now?

Compare two signals, not one

The fix is to stop measuring one thing and start comparing two. Run two envelope followers. One on the broadband signal, the body of the voice. One on the isolated sibilance band. Trigger on the ratio between them. A sibilant is a moment where the high band is a lot hotter than the voice as a whole, and that's true for a whisper and for a shout. One setting covers the whole dynamic range.

Picking the band matters more than it looks. “Somewhere up high” isn't good enough. Too wide and vocal harmonics leak into the sidechain and cause false triggers. Too narrow and you miss half the esses. I spent real time here, including soloing the sidechains of de-essers producers already trust, just to hear which frequencies those tools actually listen to. Reverse-engineering by ear is underrated.

The crossover trap

To process only the ess band you have to split the signal, and there's a pitfall that doesn't announce itself: standard Butterworth crossovers aren't transparent when you sum the bands back together. Phase shift between the branches causes partial cancellation and amplitude bumps around the crossover point. Your bypass isn't a bypass anymore, even with zero gain reduction.

The fix is old news in loudspeaker design: a fourth-order Linkwitz-Riley crossover. Both bands sum back to flat with coherent phase. If you've ever A/B'd a split-band plugin and felt it changed the sound with all processing off, this is usually why.

0 dB+3−3100 Hz1 kHz10 kHzLR4 sum (flat)Butterworth sum
fig. 02Summed response after splitting and recombining. Butterworth leaves a bump and a dip around the crossover. LR4 sums back to flat.

Lookahead

A sibilant onset is fast, a transient of a few milliseconds. A causal detector can only react after the fact, so the sharpest and most annoying part of the “s” is already through before the gain reduction lands.

The standard pattern: delay the audio path by a few milliseconds and run detection on the undelayed signal. The detector sees the future, the reduction lands on the onset instead of trailing it. Lookahead isn't cheating. It's paying a little latency to undo causality.

inputmissed onsetgain reductionwith lookaheadwithout
fig. 03Without lookahead the gain reduction starts after the onset and the sharpest part gets through. With lookahead it lands exactly on it.

Envelopes decide if it sounds like a tool or a bug

Even with perfect detection, hard-switched gain reduction sounds bad. Abrupt attack reads as zipper noise, abrupt release as an unnatural letting-go. Two things helped. A soft knee, so reduction fades in as the ratio approaches the trigger point instead of snapping on. And a shaped release, fast at first so the next syllable's transient survives, then easing out to avoid clicks. Linear ramps are the first thing you try and the first thing you throw away.

Testing: subtract, don't stare

The most useful test cost nothing. Render the processed file, subtract it from the original, listen to the difference. The delta is exactly what the algorithm removed. If detection is right, you hear a file of isolated esses. If it's wrong, you hear consonants, breaths, chunks of vowels. You know within seconds, no spectrogram needed.

originalprocesseddelta = original − processedonly esses should remain
fig. 04The delta-null test. Subtract the processed file from the original and listen to what the algorithm took out. A clean detector leaves a file of isolated esses.

The other half of testing is the material. One clean studio vocal proves nothing. Whispered takes, shouted takes, dull voices, bright voices, plosives, harmonically rich sustained notes. Edge cases are where a detector shows its real character. My rule: fully understand one problematic recording before scaling up to a whole test set.

Where this ends up

Nothing in here is exotic on its own. Relative thresholds, proper crossovers, lookahead, shaped envelopes, delta testing. The work is in noticing that you need all of it at the same time, and in having a test setup that calls you out when you don't.

If you'd rather hear this than read it: there's a small split-band de-esser running live in the Lab section of this site. A Web Audio toy next to a production plug-in, but the detection ideas are the same.

Written by Robin Busse. Based on de-esser research for NoiseWorks. Implementation details and tuning values are left out on purpose.