A noise suppressor that only lets your voice through.
VoiceGate learns your voiceprint and blocks everything that isn't you: keyboards, traffic, music, the TV, and other people talking in the room. It feeds a virtual microphone, so it works in Discord, Zoom, OBS, Teams, and games without per-app setup.
Mainstream noise suppressors (Discord's Krisp, NVIDIA Broadcast, RTX Voice) are trained to remove non-speech noise. They do that well, but they can't help with the thing that actually derails a call: your roommate, your family, the TV, or someone on the phone in the next room. To a speech denoiser, a human voice is signal, not noise.
VoiceGate closes that gap. You enroll your voice once, and it then verifies every moment of audio against that voiceprint in real time. If the voice isn't yours, the gate stays shut and the people on the call hear nothing.
flowchart LR
A["Real mic<br/>(you + noise + other voices)"] --> B
subgraph VG ["VoiceGate"]
direction TB
B["RNNoise<br/>neural denoise"] --> C["Silero VAD<br/>is anyone speaking?"]
C --> D["CAM++ speaker check<br/>is it you?"]
D --> E["Lookahead gate<br/>mute everything else"]
end
E --> F["CABLE Input<br/>(virtual cable)"]
F --> G["CABLE Output<br/>Discord / Zoom / OBS"]
- Speaker verification, not just denoising. A CAM++ speaker embedding (your compact voiceprint) decides whether speech is yours, so background voices are gated out, not only background noise.
- Neural noise suppression. RNNoise runs first, so the gate and the voiceprint work on clean audio.
- Three gate modes: VAD only, Balanced (fast, recommended), and Strict (nothing unverified passes).
- Lookahead gate that opens before your first syllable, so nothing gets clipped.
- Works with every app. Output goes to a virtual microphone rather than into one program.
- Local and private. No cloud, no telemetry, no audio leaves your machine. Only a compact voiceprint is stored, never a recording.
- Optional exclusive mic mode so no other app can read the raw, unfiltered microphone.
- Low latency: roughly 30 ms of processing plus your configurable lookahead (120 ms by default).
| Requirement | Notes |
|---|---|
| Windows 10 or 11, x64 | Uses WASAPI |
| .NET 9 Desktop Runtime | Not needed if you build with -SelfContained |
| VB-Audio Virtual Cable | Free/donationware; creates the virtual microphone |
| ~29 MB of models | Downloaded once from the sherpa-onnx releases |
Download VB-Audio Virtual Cable, extract the zip, right-click
VBCABLE_Setup_x64.exe, choose Run as administrator, install the driver, then reboot.
This creates two endpoints that VoiceGate and your apps use as a pipe:
CABLE Input(a playback device): VoiceGate writes your clean voice here.CABLE Output(a recording device): Discord and other apps listen here.
git clone https://github.com/hnalpha323/VoiceGate.git
cd VoiceGate
./publish.ps1 # add -SelfContained if the PC has no .NET 9 runtime
./dist/VoiceGate.exeIn the app:
- Click Download models. This is a one-time ~29 MB download from the sherpa-onnx GitHub releases.
- Click Enroll my voice and read the on-screen paragraph aloud for about 25 seconds, in your normal voice, at your normal distance from the mic, in the room where you normally talk. VoiceGate suggests a match threshold based on how consistent your voiceprint turned out.
- Confirm that Microphone is your real mic and Send clean audio to is
CABLE Input (VB-Audio Virtual Cable)(selected automatically when present). - Click Start.
In Discord, go to Settings > Voice & Video > Input Device and choose CABLE Output (VB-Audio Virtual Cable). Then turn off Discord's own Noise Suppression (Krisp) and Automatic Gain Control, since they interfere with the gate and double-processing hurts quality.
Every other app works the same way (Zoom, Teams, OBS, Slack, games): pick CABLE Output as the microphone. You can also click Make virtual mic the Windows default in VoiceGate so any app that follows the system default picks it up automatically.
| Mode | What it does | Best for |
|---|---|---|
| VAD only | Passes any speech, blocks non-speech noise. No speaker check. | You're always alone in the room |
| Balanced (default) | Opens instantly on speech, then closes about 0.3 to 0.6 s after it detects the voice isn't yours. | Normal use, no clipped syllables |
| Strict | Stays shut until the voice is confirmed to be yours. Nothing unverified leaks. | Noisy households, TV or radio in the background, shared offices |
Balanced trades a little leakage for speed: it lets a fraction of a second of someone else's voice through before cutting them off. Strict leaks nothing but needs about 0.3 s of your speech before it opens; raising Lookahead to 200 to 300 ms hides that delay.
| Setting | What it does | Tuning advice |
|---|---|---|
| Voice match threshold | How similar to your voiceprint audio must be to pass. | Watch the live Voice match meter while you and someone else talk, then set it between the two scores. Raise it if others leak through; lower it if you get cut off. |
| Noise reduction (dB) | Suppression strength of the denoiser. | 18 dB is a good default. Too high sounds robotic or underwater. |
| Gate release (ms) | How fast the gate closes after you stop talking. | 120 ms feels natural. Shorter is choppier, longer keeps more room tone. |
| Lookahead (ms) | Delays the audio so the gate can open before your first syllable. | 120 ms default, 200 to 300 ms in Strict mode. It costs exactly that much latency. |
| Take exclusive control of the mic | Locks the physical mic so no other app can read the raw signal while VoiceGate runs. | Turn on if you never want an app to bypass VoiceGate. Not every device supports it; the app falls back to shared mode and tells you. |
| Monitor (hear the result) | Plays the processed output on your speakers. | Turn on while tuning, off during calls (use headphones or you'll get feedback). |
- Mic in: raw level from the microphone.
- Clean out: what actually reaches the virtual mic. Should be silent when you aren't talking.
- Voice match: live cosine similarity against your voiceprint. Green means above the threshold.
- Gate OPEN / closed and Speech detected: the two decisions, live.
- Output buffer: pipeline backlog. It should stay under about 100 ms; a growing number means the CPU can't keep up.
There's no "CABLE Input" device in the dropdown
VB-Cable isn't installed, or you haven't rebooted since installing it. The banner in the app links to the installer, which must be run as administrator.
Discord hears nothing at all
- Is VoiceGate running? The button reads "Stop", and the gate light turns green when you talk.
- Is Discord's input CABLE Output, not CABLE Input? Input is where VoiceGate writes; Output is where apps listen.
- Are you in Strict mode without an enrolled voiceprint? Then the gate never opens by design. Enroll, or switch to Balanced.
- Check the Clean out meter. If it moves while you speak, VoiceGate is fine and the problem is downstream in the app.
My own voice gets cut off, or the first word is clipped
Lower the Voice match threshold slightly, raise Lookahead, or switch from Strict to Balanced. If your score sits stubbornly low, re-enroll in the room you actually use. Enrolling on a headset and then talking into a laptop mic across the room is a genuinely different-sounding voice.
Another person's voice leaks through for a moment
That's Balanced mode working as designed: it opens on speech, then verifies. Switch to Strict for zero leakage, and raise Lookahead to compensate for the slower opening.
The audio sounds robotic or over-processed
Lower Noise reduction (dB), and make sure the app on the other end isn't also denoising (turn off Discord's Krisp or Zoom's background suppression).
"Exclusive mic mode not supported by this device"
Your audio driver doesn't allow exclusive capture in any of the formats VoiceGate probes. This is harmless: it falls back to shared mode automatically. Everything still works; other apps could just open the raw mic if they wanted to.
Latency feels high
Reduce Lookahead, which accounts for nearly all of it. The rest of the pipeline adds about 10 to 30 ms. Also check that the output buffer reading stays under about 100 ms.
Audio flows through five stages, all on your machine:
- Capture. WASAPI grabs the mic at its native rate, downmixes to mono, and resamples to 48 kHz.
- Denoise. RNNoise, a small recurrent neural network, removes non-speech noise. A spectral Wiener-filter denoiser is the fallback if the native library can't load.
- Detect. A 16 kHz side-chain runs Silero VAD to answer "is anyone speaking right now?"
- Verify. While speech is present, a rolling window is fed to a CAM++ speaker-embedding model every ~250 ms. The resulting embedding vector is compared to your enrolled voiceprint by cosine similarity.
- Gate. A lookahead-delayed gate with hysteresis, hold, and smooth attack/release opens only when the VAD and (depending on mode) the speaker check agree. The result is written to the virtual cable.
For the threading model, latency budget, and the reasoning behind these choices, see docs/ARCHITECTURE.md.
git clone https://github.com/hnalpha323/VoiceGate.git
cd VoiceGate
dotnet build # compile
dotnet test # run the DSP and pipeline test suite
./publish.ps1 # produce dist\VoiceGate.exe (framework-dependent)
./publish.ps1 -SelfContained # bundle the .NET runtime too (~150 MB, no prerequisites)You need the .NET 9 SDK. Everything else, including the native binaries, comes from NuGet.
The models are not stored in the repo. They're downloaded at runtime into
%APPDATA%\VoiceGate\models, either by the in-app button or by ./setup-models.ps1.
VoiceGate itself is a WPF app, so the executable is Windows-only by nature. The interesting half
isn't: src/VoiceGate.Core targets .NET Standard 2.0 as well as .NET 9, so the DSP, Silero VAD,
speaker verification, and model management can be referenced from .NET Framework 4.6.1+, Mono, Unity,
Xamarin, or a cross-platform .NET app.
<ProjectReference Include="path/to/src/VoiceGate.Core/VoiceGate.Core.csproj" />using VoiceGate.Dsp;
using VoiceGate.Speech;
IDenoiser denoiser = new SpectralDenoiser { ReductionDb = 18f };
denoiser.Process(frame); // 48 kHz mono float, in place
using var verifier = new SpeakerVerifier("speaker.onnx");
float[] me = verifier.ComputeEmbedding(enrollmentSamples16k);
float score = SpeakerVerifier.Cosine(me, verifier.ComputeEmbedding(liveSamples16k));Audio I/O is deliberately not in the core: AudioEngine and the device plumbing are WASAPI-bound and
stay in the Windows app, so bring your own capture on other platforms. The underlying sherpa-onnx and
RNNoise packages ship native binaries for Linux and macOS as well as Windows.
Contributions are welcome, especially real-world tuning feedback, device compatibility reports, and better speaker-verification models. See CONTRIBUTING.md for the workflow, coding style, and a list of good first issues.
VoiceGate runs entirely offline. There is no telemetry, no account, and no network access except the
one-time model download from GitHub. Your enrollment recording is processed in memory and discarded;
only the derived voiceprint (a compact vector of floats in %APPDATA%\VoiceGate\profile.json) is
saved, and speech cannot be reconstructed from it.
VoiceGate is a small shell around several open-source projects:
| Project | Role | License |
|---|---|---|
| sherpa-onnx | Silero VAD and speaker-embedding runtime | Apache-2.0 |
| Silero VAD | Voice activity detection model | MIT |
| 3D-Speaker CAM++ | Speaker verification model | Apache-2.0 |
| RNNoise / RNNoise.Net | Neural noise suppression | BSD-3 / MIT |
| NAudio | WASAPI capture/render and resampling | MIT |
| VB-Audio Virtual Cable | The virtual microphone (installed separately) | Donationware |
MIT.