Skip to content

Fovty/HushMic

Repository files navigation

HushMic
HushMic

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.

Release License Build Support on Ko-fi

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.

Demo

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.

Why

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.

How it compares

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)
DPDFNetHushMic'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.)

Features

  • 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.

Requirements

  • Linux with PipeWire (+ pipewire-pulse for 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.

Install

Any distro (install script, system-wide):

curl -fsSL https://raw.githubusercontent.com/Fovty/hushmic/main/scripts/install.sh | sudo sh

Debian / 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.deb

On stock Ubuntu 22.04 apt refuses with a pipewire-media-session/wireplumber conflict (22.04 still ships the deprecated session manager). Install with sudo 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 --tray

Usage

Launch HushMic from your desktop's application menu, or from a terminal:

hushmic --tray

A 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.

Live A/B mic test — raw microphone vs. HushMic output

More screenshots — microphone picker, model picker, suppression strength

Microphone picker Model picker Suppression strength

Configuration

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 login

FAQ

Does 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.

Alternatives

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.

Build from source

git clone https://github.com/Fovty/hushmic
cd hushmic
./scripts/setup-assets.sh        # fetch the DPDFNet models + ONNX Runtime
cargo build --release

Produces 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.

How it works

Two parts:

  1. dpdfnet-ladspa — a LADSPA plugin (Rust) that runs DPDFNet's ONNX model in real time, hop-by-hop, at 48 kHz mono, via ort (ONNX Runtime).
  2. hushmic — a tray app that's a thin controller: it generates a PipeWire module-filter-chain config and runs it as a managed child, exposing the plugin as a virtual capture source. PipeWire owns the real-time scheduling, which is why no setcap is needed; the mic's lifetime is tied to the app, and quitting tears it down cleanly (restoring your previous default input).

Support

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.

License

Dual-licensed under either MIT (LICENSE-MIT) or Apache-2.0 (LICENSE-APACHE), at your option.

Credits

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.

About

Real-time microphone noise suppression for Linux as a system-wide virtual mic (DPDFNet + PipeWire).

Topics

Resources

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT

Stars

84 stars

Watchers

2 watching

Forks

Sponsor this project

Contributors