foundations
Linux mic setup: the input settings to fix before any denoiser
A recurring pattern in help threads: someone installs EasyEffects, hears something worse than before, and concludes that Linux noise suppression doesn't work. Almost every time, the suppressor is doing its job and something upstream of it is broken — a capture level pinned at 150%, an automatic gain control fighting the denoiser frame by frame, or a second suppressor nobody remembered enabling. This page is the thirty minutes that make the rest of the site work. It is entirely about operating-system settings; what microphone you own and where you put it is somebody else's subject.
1. Set the capture level properly
Linux lets you push microphone gain well past sensible, and desktop environments cheerfully offer 150%. Above 100% you are applying software amplification to a signal that already contains the room — the noise rises with your voice, and if the peaks exceed what the format can store, the clipping is permanent and no model can undo it.
~$ # see your sources and their volumes
~$ wpctl status
~$ # set the default source to a sane 85%
~$ wpctl set-volume @DEFAULT_AUDIO_SOURCE@ 0.85
~$ # make sure it isn't muted
~$ wpctl set-mute @DEFAULT_AUDIO_SOURCE@ 0
~$ # PulseAudio-era equivalent, works on both
~$ pactl set-source-volume @DEFAULT_SOURCE@ 85%Start at 85%, record yourself speaking at your normal volume, and look at the waveform or a level meter. You want peaks landing comfortably short of the top with obvious room to spare. Quiet-but-clean beats loud-and-clipped every single time, because gain can be added later and lost detail cannot.
There's a second gain stage people miss entirely: the hardware capture control, which lives below the desktop's slider. Run alsamixer, press F6 to pick your sound card, F4 to view capture controls, and check for a "Mic Boost" set to something enthusiastic. On many laptops that boost is the single largest contributor to a hissy input. Turning it down and raising the software level slightly is usually the better trade.
2. Turn off automatic gain control
AGC continuously adjusts your input level to keep your voice at a target loudness. During your pauses it finds nothing to amplify — so it amplifies the room. This produces the distinctive "noise swells whenever I stop talking" effect, and it actively fights any denoiser you install, because each is reacting to the other's output.
On a PipeWire desktop the usual culprits are in software rather than the server: browsers apply their own gain control and suppression to microphone streams by default, and calling applications ship their own. Disable both in the applications' audio settings once you have system-level suppression running. On legacy PulseAudio systems, also check whether module-echo-cancel — which bundles AGC — is being loaded at startup.
3. Confirm the device and the sample rate
Two failure modes here. First, your machine may be recording from a microphone you forgot exists — laptop internals, webcam capsules and HDMI devices all volunteer. Check what's actually default:
~$ pactl info | grep "Default Source"
~$ wpctl set-default <ID> # from wpctl statusSecond, rate. RNNoise works at 48 kHz, which is also PipeWire's default, so most systems are already aligned. If you've been experimenting with configuration files and set something exotic, the graph resamples around the filter — wasted cycles at best, audible artifacts at worst. Unless you have a specific reason, leave the rate at 48000 everywhere, including in any filter-chain you write.
4. Find the second suppressor
If your voice sounds watery, warbling or underwater, you almost certainly have two layers of processing running. They hide in four places:
- The browser. Web applications can request noise suppression, echo cancellation and gain control per stream. If a site sounds worse than a native application with the same mic, this is why.
- The calling application. Nearly all of them ship their own suppression, on by default.
- A second system-level tool. EasyEffects and a filter-chain both running, or either of them plus NoiseTorch, is a classic self-inflicted wound — especially when one is pointed at the other's virtual device.
- The recorder. An OBS filter on top of system-wide suppression cleans already-clean audio and adds artifacts for free.
- mic at a sane levelAGC off, 48 kHz
- ONE suppressorsystem level: EasyEffects or a filter-chain
- every appreceives the same good input
- the browserper-stream suppression, echo cancel, gain
- the calling applicationits own suppression, on by default
- a second system-level toolEasyEffects + filter-chain, or either + NoiseTorch
- the recorderan OBS filter on an already-clean mic
Pick exactly one layer. Our strong default: clean it once at the system level, switch off everything else, and let every application receive the same good input.
5. Listen to yourself, once
Record thirty seconds and play it back, with headphones. Not a meter, not a friend's opinion mid-call — a file you listen to. Say a sentence at normal volume, pause for five seconds of pure room, then speak again quietly. That clip answers everything: whether your peaks are safe, whether the room is being amplified in your silences, whether your quiet syllables survive the voice-activity threshold, and whether the suppression is chewing your consonants.
~$ # quick 30-second capture from the default source
~$ ffmpeg -f pulse -i default -t 30 test.wavRe-run that after every change you make. It takes a minute and it is the only feedback loop on this page that can't lie to you — and if the recording turns out noisy anyway, you can at least clean the file.