Foreground service · microphone
Started from a visible screen and promoted with FOREGROUND_SERVICE_TYPE_MICROPHONE, as Android 14+ requires. Persistent, honest notification with a Stop action.
Paid proof of concept · Android · wake word
ENIGMA listens in the background on Android, wakes on a custom “Hey Enigma”, and ignores the “Hey Emma”s, the TV and the friend who says “he's an enigma”. Every claim on this page comes from a test you can re-run.

Live · runs in this tab
The same pipeline as the Android build, compiled to WebAssembly. A naive detector runs on the same audio, so you can watch it get fooled while ENIGMA holds. Nothing you say leaves this tab until a wake is accepted; then only the transcribed command goes to the assistant.
Engine not loaded
41 MB speech model, cached by your browser. Decoding happens locally.
Tip: say “Hey Emma” first, then “Hey Enigma, what's a good name for a cat?”
Real clips from the test corpus (Amazon Polly neural voices).
Naive detector
—
tiny grammar, no defences
ENIGMA
—
decoys · rules · verifier
After a wake, ENIGMA transcribes your command locally, asks the assistant (an LLM on Amazon Bedrock, no keys in the app) and speaks the reply.
Browser preview decides at the end of a phrase. The Android build triggers mid-sentence from partial results, so “Hey Enigma, what's…” wakes it while you're still talking.
Measured, not claimed
A synthetic test corpus built for this PoC: Amazon Polly neural voices in seven English accents, clean, with fan noise, with crowd babble and far-field, plus about an hour of look-alikes and everyday speech. Each defence was added one at a time.
False wakes per hour of adversarial audio
“Adversarial” = mostly “Hey X” phrases that sound like the wake word. On everyday speech (TV, calls, kitchen) the count is zero for every arm.
Trade-off curve · threshold sweep
Negatives that woke it
| Audio | Naive | ENIGMA |
|---|
Wakes caught, by voice
Weakest: crowd babble at 10 dB SNR. That is the first target for the production detector (see roadmap).
On an Android device · same code as the service
On-device benchmark results load here.
Where it still slips
Working within Android's rules
Most always-listening demos die when the screen goes off or another app needs the mic. These are the cases the PoC handles, and how.
Started from a visible screen and promoted with FOREGROUND_SERVICE_TYPE_MICROPHONE, as Android 14+ requires. Persistent, honest notification with a Stop action.
A partial wake lock while listening keeps the 20 ms capture loop alive. Nothing is scheduled with alarms or jobs, so there is nothing for Doze to defer.
An adaptive noise-floor gate means the decoder sleeps through silence and steady noise. The app shows live CPU and the share of audio actually decoded.
Calls and recorders take priority. ENIGMA watches AudioRecordingCallback, shows “mic busy” when Android silences it, and resumes by itself.
Android 14+ blocks microphone services from starting at boot. Instead of failing silently, ENIGMA posts a one-tap “resume listening” notification.
Optional, user-initiated battery-optimisation exemption for aggressive OEM task killers, behind a clear explanation (Play policy friendly).
Detection is muted while ENIGMA speaks its reply, so its own voice can't trigger it.
Wake word and transcription run on the phone. Only the command text, after a wake, goes to the assistant API. No audio is uploaded, and no API keys ship in the app.
How it works
Each stage is cheaper than the next and only passes on what it can't rule out. The expensive check runs on 1.75 seconds of audio, a handful of times a day.
Why decoys work
A decoder forced to choose between “enigma” and silence picks “enigma” for anything close. Give it “Emma”, “sigma”, “in a…” and it has somewhere better to put them. Decoys are generated from CMUdict by phonetic distance, not picked from the test set.
Why a second pass
The streaming spotter must be cheap. The verifier can afford a 10× wider vocabulary because it only ever sees a 1.75 s window around a candidate.
Built to be replaced
The detector sits behind one interface. Swapping in a trained neural keyword model (see roadmap) leaves the service, gate, rules and benchmark untouched, and the benchmark will show whether it's better.
The Android app
Listen, Tune (every defence is a switch, with its measured effect), Bench (runs the corpus on the phone) and Log (every decision, explained).




Signed release · arm64 / armv7 / x86_64
From PoC to product
Foreground mic service, 3-stage false-trigger defence, on-device benchmark, assistant loop.
A small keyword model trained on “Hey Enigma” clips. The Polly corpus generator here doubles as the training-data pipeline. Target: lower latency and better recall in babble, at the same false-wake rate.
Opt-in false-wake reports (“That wasn't me”), per-device thresholds, a soak test across OEMs (Samsung, Xiaomi, Pixel) for battery and survival.
Streaming replies, tools (timers, calendar, messages), memory, optional speaker verification so only you can wake it.
Honest notes