Audio demo

Remove keyboard noise from your microphone

A mechanical keyboard is louder to everyone else than it is to you — the microphone sits on the desk you are hammering. Below is one recording, before and after TarnVeil's neural click suppression. Switch tracks while it plays: the difference lands on the same syllable.

Same twelve seconds, three tracks

Twelve seconds of someone talking and typing at once — 54 key presses, some landing on words, some in the gaps between them. All three tracks play in sync; the buttons only change which one reaches your ears.

0:00 / 0:12

The speech is a studio reading from the open M-AILABS corpus (Russian, read by hajdurova); the keyboard was recorded separately on an ordinary desk microphone. The two were mixed, which is why a third track exists: it shows what a perfect result would sound like. How loud the keyboard should be was not decided by ear — in a separate take where speech and typing were recorded together, the clicks came out 14 dB below the peak of the voice, and that is the offset used here. The processing was done by the whole production chain of Smart mode — the transient suppressor first, the neural model after it — in the same code and the same order the browser runs. It was given no trusted key events: a demo is a recording, and nobody presses keys while listening to one.

What the measurements say

These numbers come from the recording playing above and describe only that recording. A different keyboard, room or microphone will give different ones.

dBFS, median. For clicks, the peak of what is left of each of the 54 key presses; for speech, the peak of a 20 ms frame. Lower is quieter.
MeasuredUnprocessedThrough TarnVeilChange
Clicks in the gaps between words−20.2−73.453.7 dB quieter
Clicks landing on top of speech−20.9−31.59.7 dB quieter
Speech where the keyboard is silent−16.3−16.9unchanged

The click rows measure what is left of the click, not how loud the frame is: the same speech, run through the same model, is subtracted from the processed track, so only the keyboard reaches the number. Measured any other way, a frame on top of speech reports the voice — which is louder than the click — and every denoiser scores zero. It is scored per key press rather than per frame, because a press has a longer tail than attack and averaging over frames describes the decay instead of the click. The spread is wide and it runs the wrong way too: the worst tenth of presses in the gaps loses 21.7 dB rather than 54, and on top of speech those presses come out barely quieter than the original — 0.3 dB. A click on top of a word is the harder case by nature — its energy sits at 2–8 kHz, exactly where s, t and sh live, and cutting that band under a voice means eating consonants.

How it works

A click is not noise in the usual sense. It does not last, it has no steady spectrum, and there is nothing to subtract.

Why the usual approach fails

Classic suppressors estimate the noise spectrum over a few hundred milliseconds and subtract it. A key press lasts a few milliseconds and spans nearly the whole band, so the estimate never catches up — and by the time it reacts, the click has been heard.

Ten-millisecond frames

Audio is transformed into a 1024-point spectrum every 10 ms. The model sees the current frame, the previous one and its own recurrent state, so it can react inside the frame where the click begins.

A mask, not a cut

The network predicts how much of each frequency band to keep. Speech and clicks nearly always overlap, so cutting a slice outright would take a syllable with it.

What it costs

About 3.9 ms per frame against a 10 ms budget, 4.5 ms at the 95th percentile — measured on the WebAssembly build that actually runs in the browser.

What it does not do

A keyboard heard across the room is suppressed about 1.5 dB less than the same keyboard next to the microphone, and why that costs what it does is not yet understood. Plosives — p and b — are occasionally reshaped even on clean speech with no noise present. Phone performance has not been measured. TarnVeil is in early beta, so test the audio on the devices that will be in the call before anything important.

Questions

Why does ordinary noise suppression leave keyboard clicks in?

Classic suppressors assume the noise is stationary: they estimate its spectrum over a few hundred milliseconds and subtract it. A key press lasts a few milliseconds and covers almost the whole band, so the estimate never catches up, and whatever it does catch arrives after the click has already been heard.

Does the audio leave my device?

No. The model runs in the browser in a dedicated worker thread. Microphone audio is processed locally before it is sent to anyone in the call.

How much CPU does it cost?

About 3.9 ms per frame against a 10 ms hop on a desktop machine, 4.5 ms at the 95th percentile. That is measured on the same WebAssembly build the browser runs, not extrapolated from native timings. Phones have not been measured.

What happens to the voice when nothing is being typed?

On the demo recording the average speech level in click-free frames moves by 0.1 dB, which is inaudible. The model is trained to leave speech alone rather than to duck everything.

Is the model open source?

The denoiser is published at github.com/Amesu-afk/tarnveil-denoise together with released weights. The SFU that carries the audio is open as well, at github.com/Amesu-afk/tarnmedia under Apache-2.0.

Is TarnVeil available in English?

Yes. The interface ships in English and Russian, and incoming messages can be translated on the reader's device. The app opens in the browser, with optional Windows and Android builds.

Try it on your own microphone

The demo above is a recording. To hear the denoiser on your own voice, open TarnVeil, join as a guest and turn noise suppression on in the audio settings.