Downloads · 30 days
0
12384-0ashntoi/hey-fable-openwakeword
hey-fable-openwakeword is a audio classification model from 12384-0ashntoi. Use it for the audio classification task on the model card, and read the license before you ship it in a product. It is set up for openwakeword. The card lists the license as apache-2.0.
A custom openWakeWord wake-word detection model for the phrase "hey fable".
Downloads · 30 days
0
Access
Public
Updated Jul 11, 2026
Repo size
411 KB
Likes
1
Public
Click a slice to open those files.
.onnx205 KB · 92%
From the Hugging Face model README
A custom openWakeWord wake-word detection model for the phrase "hey fable".
Trained on synthetic speech from two complementary TTS engines:
en_US-libritts_r-medium, 850 speakers) — bulk timbre and prosody coverageOn top of the modal-voice clips we add a whisperized subset (STFT phase-randomisation of the modal clips) so the model fires on whispered "hey fable" even in noisy environments. Every clip is augmented with room impulse responses (MIT IR Survey), ESC-50 background mixing at SNRs from −10 to +15 dB, pitch shift, band-stop filtering, seven-band EQ, tanh distortion, and coloured noise, on top of Google's frozen speech-embedding backbone that ships with openwakeword.
End-to-end streaming, 80 ms frames, 1200 held-out modal positives + 300 held-out whispered positives + 1200 held-out adversarial negatives, plus the 10.7-hour general-speech FP corpus that ships with the base openwakeword package.
| Threshold | Recall<br>(modal) | Recall<br>(whisper) | Recall<br>(Kokoro voices) | Adversarial<br>FPR | FP / hour<br>(10.7 h corpus) |
|---|---|---|---|---|---|
| 0.5 | 99.6 % | 98.3 % | 99.5 % | 17.2 % | 1.40 |
| 0.7 | 99.6 % | 97.3 % | 99.5 % | 16.8 % | 1.03 |
| 0.9 | 99.5 % | 97.3 % | 99.5 % | 16.3 % | 0.84 ← recommended |
import openwakeword
from openwakeword.model import Model
# Download the shared melspectrogram + embedding backbone (~4 MB, one-off)
openwakeword.utils.download_models()
model = Model(
wakeword_models=["hey_fable.onnx"],
inference_framework="onnx",
)
# Feed 16 kHz mono 16-bit PCM audio in 80 ms frames (1280 samples)
prediction = model.predict(frame)
if prediction["hey_fable"] > 0.9: # recommended threshold
print("wake!")
| File | Purpose |
|---|---|
hey_fable.onnx | The classifier head. Input [1, 16, 96] embeddings, single sigmoid output. |
negative_phrases.txt | Weighted adversarial phrases used to generate hard negatives. Format <count>\t<phrase>. |
hey_fable_config.yaml | Training configuration. |
metrics.json | Full evaluation metrics. |
<count>\t<phrase> lines): "hey table", "hey stable", "hey cable" each get 20× oversampling; the /-eɪbəl/ rhyme family ("hey label", "hey Mabel", "hey sable", "hey Abel", "hey fabled", "hey fabric", "hey Fabio", …) gets 10×; syllable-substitution neighbours ("gay stable", "say fable", "weigh stable", "prey fable", …) get 5×; determiner + noun ("a fable", "the stable", "away table", …) get 3×; polysyllabic -able words ("comfortable", "notable", "capable", …) get 2×. Kokoro also synthesises these to give the negatives expressive prosody.Every positive and negative clip runs through the openWakeWord augmentation pipeline 3 rounds (22 500 augmented positives + 16 500 augmented negatives), with augmentation probabilities pushed above defaults for whisper-in-noise robustness:
openwakeword).Training used openwakeword.train.Model.auto_train with a cosine LR schedule + warmup, three sequences (75 000 + 7 500 + 7 500 steps), adaptive negative-example weighting up to 8000× (raised on demand to hit target FP rate), stochastic-weight-averaging over the top-decile checkpoints, and a rebalanced batch (ACAV100M:1024 / adversarial:600 / positive:300).
0.9 — the highest-value operating point on this model:
Bumping to 0.5 buys a tiny amount of recall (99.6 % vs 99.5 %) at the cost of 1.7× more false positives per hour.
hey table, hey cable) still fire ~16 % of the time even at the highest threshold — this is a phonetic-similarity ceiling, not a training failure. Real users don't randomly emit those phrases.Apache-2.0 for code. The model weights inherit the base openWakeWord backbone's CC-BY-NC-SA-4.0 because they were derived using Google's speech-embedding model under those terms.