Hey Yossi: openWakeWord model, v1
A custom "Hey Yossi" wake word for openWakeWord, trained 2026-10-29 for a personal voice assistant. It is a small classifier on openWakeWord's frozen speech embeddings, so it runs in real time on any CPU, Raspberry Pi included. No quantised build is needed.
| File | For |
|---|---|
hey_yossi.tflite (206 KB, float32) |
Home Assistant (Wyoming openWakeWord add-on), Raspberry Pi, Android, openWakeWord's default tflite runtime |
hey_yossi.onnx (205 KB) |
Desktop and laptop with inference_framework="onnx" |
Both give identical scores: the largest difference over 3,000 windows was 1e-6, and the held-out results
below are the same for both. The TFLite file keeps openWakeWord's [1, 16, 96] input.
Not covered: microWakeWord, which ESPHome devices, Home Assistant Voice PE and the HA Android app's on-device wake word use. That is a different model, and it needs its own training run.
Home Assistant
- Copy
hey_yossi.tfliteto/share/openwakeword/on the Home Assistant host. - Reload the openWakeWord (Wyoming) integration.
- Go to Settings > Voice assistants > your assistant > Wake word, choose
openwakeword, thenhey_yossi.
Detection runs on the server, so it serves satellites that stream audio to Home Assistant.
This is a first, personal model. It was trained on two voices only, Daniel's (Irish English) and Hannah's, recorded at one laptop desk, and may work less well for other speakers.
Use
from openwakeword.model import Model
model = Model(wakeword_models=["hey_yossi.tflite"]) # or "hey_yossi.onnx", inference_framework="onnx"
scores = model.predict(frame) # frame: 1280 samples (80 ms) of 16 kHz 16-bit mono audio
if scores["hey_yossi"] >= 0.8:
...
Threshold: use 0.8. The model's scores top out at about 0.88, so a threshold of 0.9 never fires.
Results (v1)
On held-out real takes (the dataset's test split, never trained on), streamed in 80 ms frames:
| Threshold | "Hey Yossi" (43) | "Hey Yossi, " (12) | Near-misses fired (20) | False triggers / h, 10.7 h general audio |
|---|---|---|---|---|
| 0.5 | 93% | 100% | 25% | 2.5 |
| 0.7 | 88% | 100% | 25% | 2.0 |
| 0.8 | 86% | 100% | 20% | 1.1 |
| 0.85 | 77% | 92% | 0% | not measured |
- Near-misses that still fire: "Yossi" on its own, "Yo Yossi" and "Hey Yoni".
- Takes it misses (6 at 0.8): 2 of Hannah's 3 test takes (cheerful, Israeli accent), Daniel's "tired", and 3 of Daniel's that just miss at 0.67 to 0.78 (normal, next room, annoyed). Hannah had about 17 positive takes in training.
- False-trigger audio: openWakeWord's
validation_set_features.npy, about 11 h of mixed speech, music and noise.
Training (lean recipe)
- Positives: 185 real takes of "Hey Yossi" from
danielrosehill/Wake-Wordsat revision90fcadbd906b8cd972b720f027f07a10a482db3f, each added 20 times. Every copy was augmented anew with MIT room impulse responses, AudioSet background noise, and openWakeWord's own pitch, EQ and gain changes. There are no TTS or synthetic voices. - Negatives:
- 90 real near-miss takes ("Hey Rossi", "Oh Yossi", "Hey Siri", "Alexa" and others), each 20 times.
- A 200 h slice (the first 10%) of openWakeWord's ACAV100M precomputed negative features.
- Model and run:
- openWakeWord
train.py, commit368c037 - DNN, layer size 32, 20,000 steps, target 0.2 false triggers per hour
- 14.5 min on one Modal T4
- openWakeWord
- Code:
training/in the private repodanielrosehill/Wake-Words, entry pointrun.sh. The TFLite file comes fromtraining/onnx_to_tflite.py: the head is rebuilt in TensorFlow from the ONNX weights, because onnx2tf 1.26 transposed the input to[1, 96, 16].
Next
Ways to improve it:
- record Background clips and more of Hannah's takes
- add the logged false triggers as negatives
- add near-miss takes of "Yossi" and "Yo Yossi"
Licence: CC BY-NC 4.0. The ACAV100M negative features, AudioSet noise and MIT impulse responses used in training carry mixed licences, so the model is for non-commercial, personal use (as openWakeWord's own models).
- Downloads last month
- -