Keystroke Listener · An experiment on key-press sound

heard correctlyheard as another key

Click any square to open that key press.

One real example

You type a password. A phone beside the laptop writes down what it heard.

The left card is what was typed. The right card is what the model wrote down from the sound of each press. Each press is one the model never heard in training.

Click a key on the right to see its sound picture.

How well

Reliable on mixed presses, and still strong on later ones.

How to read: each bar is the share of key presses named correctly, tested on presses the model never heard. The red line is chance (2.8%, a guess among 36 keys). The gold tick is the figure published for the same method.

Average over runs. Click a bar for every run.

Knows when it knows

When the model is confident, it is almost always right.

How to read: each bar is the accuracy of the presses the model was at least that sure about. The line beneath says how many presses that covers. For a pipeline, a confidence gate keeps the sure keys and sends the rest to a second pass or a person.

All four same-device tests together (396 presses the model never heard). Click a bar for the split by test.

What you can use it for

A measuring tool for how much a device's sound gives away.

Test your own devices

Record 25 presses of each key on a laptop, train in minutes on a CPU, and get a score for how recognisable that device is from a phone or a call.

Compare hardware

Run the same test on different keyboards, mounts or microphones to see which gives the least away, and show the number.

Add a confidence gate

Act only on the presses the model is 80%+ sure of (98% right), and use its top three guesses (right key in 97.5%) to narrow the rest.

These are possible uses. None has been tried with a client.

Where it fits

Each model is tuned to the device it learned from.

How to read: in each pair the dark bar is the model tested on the device it learned from; the red bar is the same model on a different device. Train on the device you want to measure.

Phone and Zoom recordings are one MacBook Pro 16 (44.1 kHz phone, 32 kHz Zoom). The laptop pair uses two public sets from different MacBook Pros, rooms and microphones, same 22 kHz format. One run each for the cross-device tests. Click a bar for the run.

How we tested it

Data25 presses of each of 36 keys (a to z, 0 to 9), one person, one MacBook Pro, recorded by a phone and through Zoom. Two public laptop sets for the laptop test.
ModelEach press becomes a 64-band sound picture, read by a compact network mixing convolution and attention. CPU only, 150 epochs.
Discipline80% of presses to learn, 10% to choose when to stop, 10% kept back and scored once. Several random splits; every run listed.
LimitsOne person, one laptop, one room. A smaller model than the one published. The Listen tab replays held-out presses; it does not process anyone's audio.

Method follows Harrison, Toreini and Mehrnezhad, "A Practical Deep Learning-Based Acoustic Side Channel Attack on Keyboards" (arXiv 2308.01074). Recordings: Keystroke-Datasets and R-ASCA. Code and every run: GitHub.

Listen to a word

Type something. See what the phone writes down.

Press Listen to hear the real recording of each key press, then see what the model made of it. Every press is one the model never heard in training. Letters a to z and digits 0 to 9. Turn your sound on.

heard correctlyheard as another key

Click a key for its sound picture. Press Listen again for different presses.

Live, on your own microphone

Type a passage, then type a hidden password. The model reads it from the sound.

This runs the real model in your browser on your own typing — nothing is sent anywhere. It only works on the device and microphone it was trained on (see "Where it fits"); on any other machine it will guess close to chance.

Step 1 · warm-up — type a sentence or two here
Step 2 · now type a short password — it will not be shown on screen

Nothing you type here is sent to a server: the mic audio, the model and the guess all stay in this browser tab.

Every run

All eight tests, with every run behind each bar.

Bar = average over runs. Red line = chance (2.8%). Gold tick = the figure published for the same method. Click a row for the runs.