LiveKit WakeWord Bench
Generate a benchmark or training dataset for your wake word, with labeled speech, near-miss phrases and realistic audio conditions. Use the benchmark to measure any detector against the same test set.
Quick start
Requires Python 3.12+ and the LiveKit CLI. Generation uses LiveKit Inference credits.
pip install livekit-wakeword-bench
lk cloud auth
lk app env -w
# Generate train, validation and test splits for your phrase.
lkwb generate "hey jarvis" --size small -o out/hey_jarvis
lkwb verify out/hey_jarvis
For a benchmark only, add --split test; for training data only, add --split train. Use --size tiny for a smoke test. Choose --plan to match your account (build by default). TTS capacity is shared with production agents: leave room for them with a lower --set tts.concurrency=N.
For unusual names, run lkwb init "your wake word" to create a pronunciation config. See Generate for sizes, pronunciation, custom settings and outputs.
What gets generated
The generator combines phoneme-guided TTS with recorded noise, room responses and speech. Each clip has 16 kHz audio, a label, phrase timing and metadata describing its voice and audio conditions.
| Sample | Contents | What it tests |
|---|---|---|
| Positive | Your wake word alone or in a sentence, with varied voices, delivery and speaking speed | Does the model detect the intended phrase? |
| Adversarial negative | Similar-sounding substitutions, partial phrases and your custom hard negatives | Does it reject near misses? |
| Ordinary speech | Synthesized sentences without the wake word | Does unrelated conversation trigger it? |
| Recorded speech | Segments from real speech corpora | Does natural speech trigger it? |
| Noise only | Background sounds without the target phrase | Do environmental sounds trigger it? |
Only positives have label 1; all negatives have label 0. Category counts depend on the size and split: training presets contain positives, adversarial negatives and synthesized speech. See the exact sample counts.
Positive and adversarial phrases are isolated or placed before/after surrounding speech (p_carrier=0.35 by default). Near misses are generated from phonetic similarity; add known confusions with hard_negatives.
Which conditions are covered
Validation and test clips sample combinations of these conditions. They are not an exhaustive test of every combination.
| Condition | Default coverage |
|---|---|
| Background noise | Clean background plus five SNR buckets, from quiet (20–30 dB) to noise louder than speech (−5–0 dB) |
| Competing speech | A second voice 0–20 dB quieter; party scenes with 2–4 talkers and crowd noise |
| Rooms | Recorded room impulse responses for reverberation |
| Device effects | EQ, band limiting, clipping, codec compression and varying levels |
| Voice and delivery | Multiple TTS providers, voices and accent labels; speaking speed 0.85–1.2× |
| Phrasing | Isolated phrases, phrases in sentences and phonetically similar negatives |
For example, the same wake word can be detected alone and missed with a competing speaker:
Training clips are stored clean by default so you can add fresh effects while training. Test voices, noise, rooms and recorded speakers are held apart from training. Never train on the test split or test sources. Some source corpora restrict commercial use; see sources and licenses.
Tune the recipe with YAML or --set key=value. For example, generate training data with more competing speech:
lkwb generate "hey jarvis" --size small --split train -o out/train_talkers \
--set splits.train.augment=true \
--set augment.p_interferer=0.6 \
--set augment.clean_weight=0.2
Run lkwb knobs for all settings. TTS is cached, so changing only augmentation reuses synthesized speech.
How models are evaluated
The headline score is recall at the lowest tested threshold with no more than 0.5 false positives per hour (FPPH). Higher is better; change the target with --score-fpph.
| Criterion | Measurement |
|---|---|
| Wake word detection | Recall: fraction of positives detected between phrase onset and 1 second after phrase end |
| Background false alarms | Triggers per hour of ordinary speech, recorded speech and noise; counted triggers are at least 2 seconds apart by default |
| Near-miss rejection | Fraction of adversarial clips that trigger; reported separately, excluded from FPPH |
| Response time | Trigger time relative to phrase end; negative latency means early detection |
| Compute cost | Processing time / audio duration; use --workers 1 |
Reports break results down by noise, competing speech, room, device effects, voice, accent and phrasing, with 95% confidence intervals. Breakdowns use --threshold (default 0.5), which may differ from the headline score's threshold.
Synthesized positives do not establish recall on real users. Accent labels come from TTS metadata. Treat confidence intervals wider than about 0.2 as weak evidence; rare false alarms need many hours of negative audio.
Evaluate on your dataset
For a livekit-wakeword v2 streaming model:
pip install livekit-wakeword
lkwb bench path/to/your_model.onnx --data out/hey_jarvis --limit 1000
Open results/report.html for charts and playable failures. Remove --limit for a full run before reporting results. Compare models using the same dataset, split, filters and limit.
Other models use the custom detector interface. Existing datasets need no LiveKit credentials. Omitting --data uses the public Hey LiveKit dataset, which is an example benchmark for that phrase.
Documentation
| Task | Guide |
|---|---|
| Generate and check your benchmark or dataset | Generate |
| Look up sample fields, sources and generation settings | Reference |
| Load, augment or export training data | Train |
| Evaluate detectors and compare results | Benchmark |
| Contribute or release | Development |
For coding agents, see AGENTS.md.
Metadata
Release files for livekit-wakeword-bench 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| livekit_wakeword_bench-0.1.0.tar.gz | 79.3 kB | With provenance | Details for livekit_wakeword_bench-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| livekit_wakeword_bench-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for livekit_wakeword_bench-0.1.0-py3-none-any.whl |
Total release size: 171.0 kB
Release files / livekit_wakeword_bench-0.1.0.tar.gz
| Download URL | livekit_wakeword_bench-0.1.0.tar.gz |
|---|---|
| Size | 79.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ea84e7ca50546534d6d5799c03c0abc7029974bca55fc91344da9ce6b52f62f7
|
|
BLAKE2b-256 checksum How to use checksums |
3d7bd2b3c549fbd098891afd0b277efb902f2309c90c5dc2065e7bc767f6c416
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.
Transparency logRelease files / livekit_wakeword_bench-0.1.0-py3-none-any.whl
| Download URL | livekit_wakeword_bench-0.1.0-py3-none-any.whl |
|---|---|
| Size | 91.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
454cbf3fcf2f6da5a248ffa4a2a25f5e466dde82f0daf71675b541d1afa8c707
|
|
BLAKE2b-256 checksum How to use checksums |
84b925f3546f88abecbc0ee50448c76d6560d5fcddc20d4a593d1e21260e245f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.
Transparency logSecurity for livekit-wakeword-bench 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for livekit_wakeword_bench-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 28, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.