Real-time microphone noise suppression for Linux, as a system-wide virtual mic.
Open source, runs on the CPU, your audio never leaves the machine.
HushMic creates a virtual microphone that strips out keyboard clatter, fans, and background chatter in real time. Select "HushMic" as your input in any app — Discord, TeamSpeak, browsers, OBS, games — and that's it. No EasyEffects graphs to wire up, no terminal, no setcap.
Each clip plays the noisy input, then the same audio cleaned by HushMic — a neutral public-domain voice over real background noise.
| Keyboard | Fan / AC hum | Café chatter |
demo_keyboard.mp4 |
demo_fan.mp4 |
demo_cafe.mp4 |
Background noise drops ~25–30 dB in the speech pauses while the voice is preserved; demo-audio credits are in Credits.
I wanted Krisp-level noise suppression on Linux for TeamSpeak, and there wasn't a maintained, packaged option that just worked as a virtual mic. The model quality exists in the open-source world — it just wasn't wrapped into something you install and toggle on.
So I benchmarked the realistic contenders on my own recordings, picked the one that scored best (it actually edged out Krisp), and built the missing pieces around it: a real-time plugin and a tray app that manages everything.
The three demo clips above, run through each model and scored with DNSMOS P.835 (a reference-free 1–5 MOS estimator). Indicative, not a formal benchmark — but the source audio is public (Credits), so it's easy to reproduce, and it's why HushMic uses DPDFNet:
| Model | Overall (OVRL) | Background (BAK) | Speech (SIG) |
|---|---|---|---|
| DPDFNet — HushMic's model | 3.20 | 4.15 | 3.43 |
| DeepFilterNet 3 | 2.97 | 3.98 | 3.26 |
| Krisp (v9.9.3) | 2.57 | 3.96 | 2.81 |
| khip (older Krisp model port) | 2.43 | 3.78 | 2.71 |
| GTCRN | 2.42 | 3.71 | 2.76 |
| RNNoise (EasyEffects's default) | 2.01 | 3.93 | 2.60 |
| Raw (unprocessed input) | 1.49 | 1.48 | 2.01 |
(Averaged over the three clips; higher is better, 1–5.) DPDFNet comes out on top on every axis — overall, background-noise removal, and voice preservation — clearly ahead of the field, and it's the only model that holds up across all three clips where the others fall off on the noisier café mix. (DPDFNet is a DeepFilterNet-lineage model from Ceva; arXiv:2512.16420.)
- One virtual microphone, usable by any PipeWire- or PulseAudio-compatible app.
- A tray menu for everything: on/off, which mic to clean, model (quality vs. light), suppression strength, set-as-default, start-on-login.
- Test my mic: a live A/B window — your raw microphone and the cleaned output side by side as scrolling spectrograms with level meters, plus a 10-second sample you can record and replay as Play raw / Play filtered, with honest before/after numbers. No call needed to hear (and see) the difference. On setups without a display for it, an audio-only record-and-playback test runs instead.
- Failures show up as desktop notifications — a broken install or a virtual mic that will not come back says so on screen, not just in a terminal you never see.
- The audio runs in a dedicated PipeWire process, so no elevated privileges (
setcap) are needed. - Re-creates itself automatically after a PipeWire restart or a suspend/resume, and puts your previous default mic back when you quit (the virtual mic is tied to the app: quitting removes it cleanly).
- ~0.3× real-time on a desktop CPU; no GPU, no network.
- Linux with PipeWire (+
pipewire-pulsefor PulseAudio apps) and WirePlumber. - A system tray (StatusNotifierItem): native on KDE Plasma and most desktops. On GNOME, install the AppIndicator and KStatusNotifierItem Support extension.
- x86-64.
Any distro (install script, system-wide):
curl -fsSL https://raw.githubusercontent.com/Fovty/hushmic/main/scripts/install.sh | sudo shDebian / Ubuntu (.deb):
curl -fsSLO https://github.com/Fovty/hushmic/releases/latest/download/hushmic_0.2.0-1_amd64.deb
sudo apt install ./hushmic_0.2.0-1_amd64.debOn stock Ubuntu 22.04 apt refuses with a
pipewire-media-session/wireplumberconflict (22.04 still ships the deprecated session manager). Install withsudo apt install ./hushmic_0.2.0-1_amd64.deb wireplumber pipewire-media-session-(the trailing-swaps it out), then log out and back in.
AppImage (any distro, no install):
curl -fsSLO https://github.com/Fovty/hushmic/releases/latest/download/hushmic-x86_64.AppImage
chmod +x hushmic-x86_64.AppImage
./hushmic-x86_64.AppImage --trayLaunch HushMic from your desktop's application menu, or from a terminal:
hushmic --trayA tray icon appears and noise suppression is already on. Pick your Microphone and choose "HushMic" as the input in your app — or flip Set as default microphone and everything that respects the system default uses it automatically. The same menu has the on/off toggle (Enable noise suppression), the model picker (dpdfnet8 = quality, dpdfnet2 = lighter), suppression strength, a start-on-login toggle, and About HushMic (version, license, links; hushmic --version works in a terminal too). Test my mic opens a live A/B window: raw microphone and cleaned output side by side — spectrograms and level meters running live — plus a 10-second sample you can record and replay as Play raw / Play filtered with measured before/after numbers. The tray icon doubles as a status light: cyan while active, struck-through gray when suppression is off, a warning badge on errors.
State lives in ~/.config/hushmic/config.toml (most of it is in the tray menu):
enabled = true
mic = "alsa_input.usb-RODE..." # source node name; omit for system default
model = "dpdfnet8_48khz_hr" # or "dpdfnet2_48khz_hr" (lighter)
attn_limit = 100.0 # suppression cap in dB, 0-100 (higher = stronger)
set_default = false # make hushmic the system default input
autostart = false # launch on loginDoes my audio go anywhere? No. Everything runs locally on the CPU; nothing is uploaded.
How much latency does it add? About 20 ms of processing (two 10 ms hops: the causal STFT overlap-add plus one hop of output buffering), plus PipeWire's normal buffering. Fine for calls, conferences, and gaming.
How much CPU? Roughly a third of one core in real time (RTF ~0.3) for the quality model; switch to dpdfnet2 in the tray if you want it lighter.
The tray icon doesn't show up (GNOME). GNOME doesn't implement the tray spec natively — install the AppIndicator and KStatusNotifierItem Support extension. KDE and most other desktops work out of the box.
Is it actually doing anything? Click Test my mic in the tray: a window shows your raw microphone and the cleaned output live, side by side; record a 10-second sample and replay either take back-to-back. (Headless or no GL? An audio-only version records both and plays them back instead.)
Does it survive sleep / a PipeWire restart? Yes — a watchdog re-creates the virtual mic automatically. If it ever can't (or an install is broken), you get a desktop notification instead of silence.
TeamSpeak / Discord don't see it? Make sure pipewire-pulse is running; HushMic exposes the mic through it so PulseAudio/ALSA-compat apps can pick it.
Recording still sounds noisy / unprocessed? A few apps that use the Qt Multimedia backend (some KDE recorders, etc.) capture the hardware device directly and ignore the selected virtual mic. Switch the app to its PulseAudio/PipeWire backend, or enable Set as default microphone in the tray so default-following apps pick HushMic.
If HushMic isn't your thing, these are the other good Linux options:
- NoiseTorch-ng — popular, RNNoise-based virtual mic. Simpler model; needs
setcap. - EasyEffects — a full PipeWire effects suite (includes RNNoise denoise). More to configure.
- noise-suppression-for-voice — RNNoise LADSPA/VST plugin; manual wiring.
- DeepFilterNet — the model lineage HushMic builds on; ships its own LADSPA plugin you can wire up by hand.
git clone https://github.com/Fovty/hushmic
cd hushmic
./scripts/setup-assets.sh # fetch the DPDFNet models + ONNX Runtime
cargo build --releaseProduces target/release/hushmic (tray app) and target/release/libdpdfnet_ladspa.so (the LADSPA plugin). See scripts/install.sh for the install layout and crates/dpdfnet-ladspa/examples/run-filter-chain.md for loading the plugin by hand.
Two parts:
dpdfnet-ladspa— a LADSPA plugin (Rust) that runs DPDFNet's ONNX model in real time, hop-by-hop, at 48 kHz mono, viaort(ONNX Runtime).hushmic— a tray app that's a thin controller: it generates a PipeWiremodule-filter-chainconfig and runs it as a managed child, exposing the plugin as a virtual capture source. PipeWire owns the real-time scheduling, which is why nosetcapis needed; the mic's lifetime is tied to the app, and quitting tears it down cleanly (restoring your previous default input).
HushMic is free, open source, and makes zero network calls — no ads, no telemetry, no accounts. If it saved you a Krisp subscription, a coffee on Ko-fi is genuinely appreciated and helps keep it maintained. Starring the repo helps too.
Dual-licensed under either MIT (LICENSE-MIT) or Apache-2.0 (LICENSE-APACHE), at your option.
- DPDFNet (Ceva, Apache-2.0; arXiv:2512.16420) — the speech-enhancement model.
- DeepFilterNet — the LADSPA real-time-inference architecture this plugin mirrors.
- Built with PipeWire, ort, rustfft, and ksni.
Demo audio: voice — "After Love" by Sara Teasdale, read by a LibriVox volunteer (Short Poetry Collection 266 via LibriVox, public domain); keyboard — Typing on Keychron V1 Ultra by C40115 (CC BY 4.0); fan/AC hum — Air conditioner hum by Gravity Sound (CC BY 4.0); café — Restaurant ambience (public domain). Full provenance: docs/demo/ASSETS.md.




