Stoatworks Labs

VoiceLevel

A fader that only ever turns the mic down

Betav0.1.0Plugin & ModuleRust / nih-plug
VoiceLevel — A fader that only ever turns the mic down
The standalone build levelling synthesised speech: the talker measures −14.6 dBFS against a −20 dBFS target, so the fader has come down 6.4 dB. The white line across the meters is the target; the yellow tick on the input meter is the talker's level with the pauses left out, which is what the fader is steered by.

What it does

A leveller on a speech mic has one job on a stage: when the presenter leans in and gets loud, bring them back down before the room complains. A compressor does that syllable by syllable and changes the sound of the voice. An automatic gain control does it in both directions, and will happily lift the gain during a pause until the system feeds back. VoiceLevel does what a good operator does with a hand on the fader instead, and nothing else.

Unity gain is the ceiling. There's no path in the plugin that can add gain, whatever the settings, so a quiet talker is left alone and a pause can't creep the channel up towards feedback. The attenuation moves like a fader rather than a compressor: it slews towards the target at a rate in decibels per second, so a loud talker is brought down over a second or two and the sound of the voice is untouched. When the mic drops below a hold threshold the fader freezes where it is, because a pause is no reason to bring a hot mic back up. And the audio path is a single multiply per sample with no look-ahead, so it adds nothing to the delay through the desk. The only lag is in the fader's movement, which is where you want it.

Two detectors run on a 100 Hz high-passed copy of the input, so plosives and handling noise don't pull the fader down. A fast RMS decides whether anyone's talking, and a slow one only integrates while they are, so the fader is steered by the level of the speech rather than the speech and the silences together. Learn uses the same measurement at the soundcheck (five seconds of speech, pauses left out) and parks the fader at the attenuation that puts that talker on target for the rest of the show.

  • Attenuation only: 0 dB is the ceiling, and the tests assert the output never exceeds the input sample for sample
  • Zero latency: no look-ahead, no internal buffering, reported latency 0 — safe to monitor through
  • Target level, with the fader pulled down at a dB/s Speed and eased back up at a slower Recovery, stopping at unity
  • Hold below: under a threshold you set the fader does not move, so pauses hold rather than recover
  • Range caps how far the fader can ever go, in every mode
  • Learn: measure five seconds of speech with the pauses left out, then park the fader in Fixed mode — from the editor or from the Mode parameter alone
  • Fixed mode with a draggable fader, doubling as a bypass at 0 dB
  • Meters that show the target as a line, the talker's speech level as a tick, and the fader as what is being taken off
  • Stereo-linked: the louder channel steers and both get the same gain
  • VST3 and CLAP for Windows, macOS and Linux, plus a standalone app that runs on an audio device for trying it on a real mic

Where it stands

Released at v0.1.0, whose macOS builds are signed and notarised by Apple. It's a beta. Fifteen unit tests pin the leveller down: it never boosts, sample for sample; it pulls a hot signal to target at the configured dB/s; it recovers more slowly and stops at unity; it holds through silence; Learn measures speech with the pauses left out and commits when you leave Learn; plus stereo linking, rumble rejection and a zero-latency impulse. The VST3 passes pluginval at strictness 10 with a reported latency of 0, and the standalone has been run live on synthesised speech through a loopback device, where the pull-down and the hold through silence were watched as they happened. It hasn't been used on a real mic at a real event yet, and it's met few hosts. The CLAP build passes clap-validator apart from four state-load checks that fail in the same way on nih-plug's own example plugin.

Watch it running

VoiceLevel video thumbnail

Nothing loads from YouTube until you press play.Watch it there instead