AI microphone cleanup, in every app you already use. No virtual microphone. No device to switch. One toggle.
Français · Architecture (French)
Noise-suppression tools install a virtual microphone. Which means selecting it in Teams, in Discord, in Meet, in every app — and doing it again every time an update resets the default device. When it goes wrong, the app picks up the wrong microphone and nobody can hear you.
Kwiet creates no device. It attaches to your microphone, inside the Windows audio engine. Apps see nothing unusual: they open the microphone they have always opened, and what comes out of it is already clean.
Kwiet is an APO (Audio Processing Object): a user-mode COM DLL loaded by
audiodg.exe, the Windows audio engine. No kernel driver.
Denoising is done by DeepFilterNet3,
a ~2 M parameter network — far too heavy for audiodg's real-time thread, which
must return a block every 10 ms without ever allocating, taking a lock, or
making a system call.
APOProcess() — audiodg's real-time thread ——————————————————————————
| pushes input into a lock-free SPSC ring (preallocated)
| pops processed output (fixed 30 ms delay)
+— if the worker is dead or late: PASSTHROUGH immediately
never silence, never a stall
Worker — normal-priority thread —————————————————————————————————————
+— drains the ring, calls the Rust cdylib (DeepFilterNet3)
Fail-open is structural: an APO that crashes audiodg leaves the whole
machine without sound. Every design decision follows from that. If the DSP
disappears, audio passes through untouched — that is the worst case.
Details and decisions: docs/architecture.md (French).
Windows 11 build 26200, USB microphone, 48 kHz stereo:
| Noise suppression | ≥ 24 dB on a controlled source |
| Added latency | 30 ms, fixed |
| CPU | ~2 % of one core (RTF 0.017–0.020) |
| Dropouts | 0 |
Important
One step after installing is not ours to take. Windows 11 requires you to choose the effect pack yourself: Settings → Sound → your microphone → Audio enhancements → Kwiet. Until you do, Kwiet is installed and entirely inert. The panel will tell you so, with a button to open the right page.
- Download the MSI for your language —
Kwiet_x.y.z_x64_en-US.msiorKwiet_x.y.z_x64_fr-FR.msi— from releases. - Run it. It asks for elevation: the effect pack is a driver package and
registers with Windows through
pnputil. Sound cuts out briefly. - Choose Kwiet in your microphone's audio enhancements (see above).
- The tray icon opens the panel.
Uninstalling removes the pack from the driver store along with the app.
- Windows 11 24H2 or newer (x64). The effect-pack mechanism used here does not exist on earlier versions.
- A microphone that negotiates 48 kHz. Outside that, Kwiet deliberately falls back to passthrough rather than resampling blind.
| Native applications — Discord, Zoom, Teams, OBS, games, recorders | ✅ |
| Firefox | ✅ |
| Chrome, Edge, and Electron apps | ⛔ |
Chromium runs its own WebRTC audio pipeline and asks Windows for unprocessed
audio so the two do not stack. A raw stream, by Microsoft's definition, bypasses
every effect except a vendor's always-on processing — and a selectable effect
pack is not always-on. Measured here: with a microphone capture open, Firefox
makes this APO lock and process while Chrome never instantiates it at all, in
four separate configurations including --disable-features=WASAPIRawAudioCapture.
This is not specific to Kwiet. Windows' own Voice Clarity is bypassed the
same way, through the same mechanism. Tools that do reach a Chrome tab —
Krisp, NVIDIA Broadcast — get there by installing a virtual microphone,
which is precisely the thing Kwiet was built to avoid. Details:
docs/architecture.md §14.
One idea, repeated everywhere: celadon is what your apps receive, amber is what Kwiet took away. The gap between them is the product.
- Scope — the last few seconds, as two stacked envelopes.
- Meter — the present instant, as one bar: the bright fill is the signal going out, the amber beyond it is the noise removed.
- Strength — from gentle to maximum. Higher means total silence between words, at the risk of clipping their attacks.
- Toggle — immediate bypass, without dropping the stream.
The panel speaks English or French, following Windows, and switches by hand at the bottom right.
Requirements: Visual Studio 2019+ (C++ workload, Windows 10/11 SDK), CMake ≥ 3.21, stable Rust, Node 20+.
# 1. The APO (C++)
cmake -S apo -B apo/build -A x64
cmake --build apo/build --config Release
# 2. The DSP (Rust, embeds the DeepFilterNet3 model)
cd dsp ; cargo build --release ; cd ..
# 3. The effect pack, signed and timestamped
.\installer\effectpack\build-package.ps1 -Version 0.2.2 `
-CertPath my-certificate.pfx -CertPassword $env:PFX_PW
# 4. The app and the installer
cd ui ; npm ci ; npm run tauri build
# -> ui/src-tauri/target/release/bundle/msi/Kwiet_0.2.2_x64_en-US.msi
# ui/src-tauri/target/release/bundle/msi/Kwiet_0.2.2_x64_fr-FR.msiThe format is MSI, not NSIS: NSIS stubs draw antivirus false positives far
more often than a Windows Installer package does. The effect pack is placed by a
deferred custom action, defined in
ui/src-tauri/wix/effectpack.wxs.
Icons and logo are generated: node assets/build-assets.mjs.
An APO under development is best tested on a VM or a dedicated machine — one
that crashes takes the whole machine's sound with it:
docs/procedure-test-vm.md (French).
| Directory | Contents |
|---|---|
apo/ |
C++: the COM shim, SPSC rings, worker thread, shared memory |
dsp/ |
Rust cdylib: DeepFilterNet3 behind a stable C ABI |
ui/ |
Tauri v2: panel, tray, MSI installer |
installer/ |
Effect pack (INF, catalogue) and install scripts |
assets/ |
Visual identity, generated by script |
bench/ |
Measurement tools |
docs/ |
Architecture decisions, test procedure |
DeepFilterNet3 is dual MIT/Apache-2.0, compatible. The embedded model comes from the DeepFilterNet project by Hendrik Schröter.