waqy wake-phrase releases
Wake-phrase detection as data: a frozen speech-embedding front end plus one small classifier per phrase, packaged as an immutable release folder that any host loads (Rust process, Rust library, or the browser over WASM). Swapping models is a path change, never a code change.
Release spqx-pub1 - phrases hey_oqto, oqto,
threshold 0.5.
A detection is evidence that a phrase was probably spoken. It is never authentication, speaker identity or permission to act.
Contents
| file | role |
|---|---|
melspectrogram_raw.onnx |
log-mel front end, generated from formulas (no learned weights) |
embedding_model.onnx |
Google speech_embedding (Apache-2.0), batch norm folded in |
one .onnx per phrase |
classifier over the frozen embeddings, hey_oqto.onnx style |
manifest.json lists a sha256 per file; every runtime verifies them and refuses a mismatch.
Measured (held out; thresholds frozen before scoring)
| head | recall on 64 unseen voices | owner held-out sitting | general false wakes / hour | training data |
|---|---|---|---|---|
hey_oqto |
0.9198 | 18/36 (18/18 hey phrases) | 0.0 | designed voices + Piper + shared 64-voice corpus (no owner recordings) |
oqto |
0.7732 | 35/36 | 0.123 | designed voices + Piper + shared 64-voice corpus + owner recordings (4.6% of positives, 29.6% of negatives; owner consented to redistributing derived weights) |
General false wakes are measured over 16.2 h of unrelated audio (MUSAN speech/music, VoxPopuli, FLEURS). In-sentence behaviour is scored per sentence on held-out speakers, not per 80 ms window, because window scoring hid look-alike failures.
Use
waqy check --manifest spqx-pub1 # verify hashes, phrases, threshold
waqy bench --manifest spqx-pub1 # CPU per 80 ms frame
waqy listen --manifest spqx-pub1 # wake-stream/1 over stdin/stdout
Hosts: eaRS ([dictation.wake], process or library) and Oqto (browser, onnxruntime-web,
sync:waqy vendors this folder into static assets). Both verify the same hashes.
Provenance and licence
Apache-2.0. See NOTICE at the repository root for Google speech_embedding, the
openWakeWord-lineage mel front end, livekit-wakeword (training dependency; its
CC BY-NC-SA default data is deliberately unused) and the Qwen3-TTS VoiceDesign voices used
for synthetic speech. Negatives: MUSAN (public domain / CC, no NC), VoxPopuli (CC0),
FLEURS (CC BY 4.0), Thorsten (CC0), procedural noise.
Known issues
- Owner-free training of a bare-word head was unstable: three attempts (40k steps with
1024 general negatives, 12k with 512, and 40k with max_negative_weight 300) collapsed to a
constant-negative classifier. The shipped bare-word head therefore includes owner
recordings (with explicit consent to redistribute derived weights; audio is never
published). The
hey_head is owner-free. - Per-head thresholds are specified but not yet implemented in the loaders; this release uses one threshold.
- Rated for German and English phrases heard through a laptop or phone microphone; not evaluated on far-field arrays or non-owner speakers at scale.