A Custom German Wake Word, No Recordings Needed
If your smarthome or device should wake on a German phrase — "Hallo Lampe" instead of the English "OK Nabu" — you quickly hit a wall: almost every popular wake word tool is optimized for English. Here's the whole journey, including the part that surprised me.
The problem
The default wake word in Home Assistant's Voice Preview Edition is English. The options for German look like this:
- openWakeWord — free and good, but its official models are English-only. Training a German model myself cost me a weekend of Python, CUDA, and hyperparameters — and the result triggered on every other sentence.
- Porcupine (Picovoice) — works, but it's a per-device license with an account, and language support hasn't meaningfully expanded in years.
- Record a German dataset myself — hundreds of varied recordings, cleanup, VAD, training. Not realistic for a home project.
I wanted the simplest possible thing: type a German phrase, get a small offline model, done.
Why English tools fail on German
It's not just a missing model file — the two problems are structural:
- Data. A good wake word needs many voices, accents, and background noise. English has huge open datasets; German has far less.
- Phonetics. German features vowel length ("Bahn" vs "Bann"), umlauts ("ü", "ö"), and consonant clusters ("Strom") that a model tuned for English keywords simply doesn't transfer to.
The practical shortcut is TTS-synthesized training data: generate thousands of varied utterances for your keyword in minutes, no recording required. That gets you roughly 90% of the way.
The last 10% is where it breaks
Pure synthetic data handles "standard" pronunciation. Real users have accents, mumble, and talk over the TV — recall can drop from ~90% to ~50% in the field. The fix that actually worked for me: add a handful of real recordings (~5 short clips) and retrain. The model learns the real acoustic spread of human voices, recall climbs back above 90%, and false triggers drop.
This is the specific thing to look for in any generator: does it let you recover a bad model with real audio, or are you stuck with whatever the TTS gives you?
Results (my own testing)
| Metric | Value |
|---|---|
| Model size | ~100 KB |
| Recall on German phrases | > 90% in quiet conditions |
| False triggers | < 1 per day (multi-stage filtering) |
| Latency | < 5 ms — feels instant |
You don't have to take the number on faith — the models and inference code are public at github.com/voicute/onnx-wakeword, so you can clone and measure recall yourself.
Running it
The model is standard ONNX, so it runs through the open-source onnx-wakeword engine (Python, Android, ESP32, and Web):
pip install onnxruntime numpy pyaudio
from wakeword_engine import WakeWordEngine
engine = WakeWordEngine()
engine.load('model_info.json', 'melspectrogram.onnx')
engine.start(lambda word, prob, info: print(f'{word} {prob:.0%}'))
German isn't the only language that works — the same flow covers French, Japanese, and Chinese. See the full comparison for how the tools stack up.
Train a German wake word →