Skip to content

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 — raw vs. cleaned side by side, plus a record-and-replay sample with before/after numbers (details under Usage).
  • 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.6.0-1_amd64.deb
sudo apt install ./hushmic_0.6.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.6.0-1_amd64.deb wireplumber pipewire-media-session- (the trailing - swaps it out), then log out and back in.

Arch Linux (AUR):

yay -S hushmic-bin     # or: paru -S hushmic-bin

Fedora (COPR):

sudo dnf copr enable fovty/hushmic
sudo dnf install hushmic

NixOS (flake, builds from source):

nix run github:Fovty/hushmic-nix -- --tray
# install for good: nix profile install github:Fovty/hushmic-nix

Needs flakes enabled — if Nix complains, prepend --extra-experimental-features 'nix-command flakes'.

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 + the live A/B window (relaunching re-opens the window)
hushmic --tray   # tray only — what autostart uses
hushmic --doctor # print a diagnostics report (exits 1 if it finds problems)

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 Mode menu switches between noise suppression, bypass (your raw voice, mic stays connected) and mute (a hardware-level cutoff no app can un-mute) — switches are instant, with no reconnect in your call. The menu also has the model picker (dpdfnet8 = quality, dpdfnet2 = lighter), suppression strength, start-on-login, and About.

Global shortcuts: click Set up shortcuts… in the menu and your desktop's own key-binding dialog opens — assign keys to Toggle mute, Toggle bypass, Push to talk (live only while the key is held) and Push to mute (hold-to-silence — a cough button). The compositor grabs the keys, so they work while you're in any app, and they use the same instant mode switching as the menu. Once set up, the entry becomes Change shortcuts… and opens your desktop's shortcut editor (the keys also appear in your system's keyboard-shortcut settings). This needs a desktop with the GlobalShortcuts portal (KDE Plasma, GNOME 45+); elsewhere the entry stays hidden — bind the CLI below in your desktop's shortcut settings instead. (Starting HushMic from a terminal additionally needs xdg-desktop-portal 1.18+ so it can identify itself to the portal; app-menu and autostart launches work regardless.)

The same controls are scriptable — bind them to hotkeys (KDE custom shortcuts, sxhkd, a Stream Deck):

hushmic status [--json]  # what the running tray is doing
hushmic mode             # print: suppress | bypass | mute | off
hushmic mode mute        # set any of the four states
hushmic toggle mute      # one-key toggle; returns to where you came from
hushmic toggle bypass

Exit codes: 0 ok, 1 invalid usage or a failed command, 2 HushMic is not running.

Test my mic opens the live A/B window: raw microphone and cleaned output side by side — scrolling spectrograms and level meters — plus a 10-second sample you can record and replay as Play raw / Play filtered with measured before/after numbers (headless or no GL: an audio-only record-and-playback test runs instead). The tray icon doubles as a status light: cyan while active, plain gray in bypass, a red struck-through mic while muted, struck-through gray when off, a warning badge on errors.

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

More screenshots — mode switcher, microphone picker, model picker, suppression strength

Mode switcher 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? 60 ms of processing (10 ms STFT framing, 40 ms of model context — the network needs a few frames of audio before its answer for a given moment is ready — and 10 ms of output buffering), plus PipeWire's normal buffering. On PipeWire 1.6+ HushMic reports this to the graph so apps like OBS compensate automatically. 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 — see Usage.

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.

Something's broken — what should I put in a bug report? Run hushmic --doctor (or click Copy diagnostics in the About window) and paste the output into the issue. It's plain text — versions, paths, and device names, nothing sensitive.

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

Three parts:

  1. hushmic-denoiser — the DSP engine as a reusable Rust library: 48 kHz mono frames in, cleaned frames out, running DPDFNet's ONNX model via ort (ONNX Runtime). Embedding the denoiser in your own app? See its README.
  2. dpdfnet-ladspa — a thin LADSPA plugin wrapping that engine for PipeWire, hop-by-hop in real time.
  3. 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.

Curious where the project is headed? See the roadmap.

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

Stars

Watchers

Forks

Releases

Sponsor this project

Used by

Contributors

Languages