OP

openWakeWord

Open-source wake word detection library

Home Automation ★ 2.8k stars Medium setup Apache-2.0

openWakeWord is an open-source library for detecting custom wake words and phrases that runs efficiently on modest hardware. It is widely used in self-hosted voice assistant pipelines.

Key features

  • Custom wake word detection
  • Runs on low-end hardware
  • Pre-trained models
  • Easy integration

Pros & cons

Strengths

  • Fully offline
  • Lightweight

Trade-offs

  • Library not a full app
  • Custom models need training

openWakeWord replaces

Last reviewed Sep 13, 2026 · 906 words

openWakeWord is not something you install and open in a browser; it is the small Python library that listens for "hey Jarvis" so that the rest of your voice stack does not have to run speech-to-text 24 hours a day. In a self-hosted pipeline it is the first stage: microphone audio streams to openWakeWord, which does nothing 99.9 percent of the time and, on a hit, wakes the real assistant. Almost everyone who runs it does so through Home Assistant's voice pipeline, where it is packaged as a Wyoming service, and that is the setup I would point a self-hoster at.

What the library is and why GitHub calls it a notebook

The project (Apache-2.0, 2,764 stars, first released 2023) is a Python package, pip install openwakeword, that runs small neural models over 16 kHz audio frames using ONNX or TFLite runtimes. GitHub files the repository under "Jupyter Notebook" because the training and demonstration notebooks outweigh the library code by volume; the thing you deploy is Python. It ships pre-trained models for a handful of phrases (the "hey Jarvis", "hey Mycroft", "hey Rhasspy" and "Alexa" family, plus a couple of utility detectors such as a timer phrase), and the key design goal is running on cheap hardware. The author's stated target is real-time detection of well over a dozen models at once on a Raspberry Pi 3 class board, and in practice a Pi 4 or any x86 mini PC runs it with a few percent of one core. Our catalogue's 256 MB floor is about right for the Wyoming wrapper with 2 or 3 models loaded.

It is fully offline. No audio leaves the machine, and nothing phones home, which is the primary reason people move off Picovoice's Porcupine, the polished commercial equivalent the catalogue's Picovoice alternatives page covers.

Where it sits in a Home Assistant stack

Home Assistant's Assist pipeline is four boxes: wake word, speech-to-text, the conversation agent, and text-to-speech. openWakeWord fills the first, faster-whisper the second, and Piper the fourth. Each runs as a separate Wyoming-protocol service, and Home Assistant discovers them by host and port. The Docker form of the wake-word stage:

services:
  openwakeword:
    image: rhasspy/wyoming-openwakeword
    command: --preload-model 'hey_jarvis'
    ports:
      - "10400:10400"
    volumes:
      - ./custom-models:/custom
    restart: unless-stopped

Add it in Home Assistant under Integrations as a Wyoming service on port 10400, then pick it as the wake word engine in the Assist pipeline. Home Assistant OS users skip the compose file and install the openWakeWord add-on, which is the same image. The satellite side (the device with the microphone) is a separate question: a Wyoming satellite on a Pi, an ESP32-S3 voice device, or the official Home Assistant voice hardware. Note that ESPHome-based satellites can do the detection on the ESP32 itself with microWakeWord, in which case openWakeWord on the server becomes a fallback rather than the primary detector; ESPHome documents both arrangements.

Custom wake words are a notebook away, and that is the catch

The pre-trained set is short. Want "hey computer" or your own house name, and you train a model. The project provides a Colab notebook that synthesises training clips with text-to-speech, augments them with noise and room impulse responses, and trains a model in roughly an hour of free GPU time. The output .tflite or .onnx file drops into the custom-models directory above, and --custom-model-dir /custom makes the wrapper pick it up. The results are usable but noticeably behind the pre-trained models on false-accept rate; expect to tune the activation threshold (default 0.5) per model, and expect a made-up word with unusual phonemes to work better than a common English phrase. The community has shared a growing library of pre-trained custom models, which is where I would look before training.

Two limitations are inherent. Detection quality degrades quickly with far-field audio and echo, so a microphone across a room with a TV on will miss and false-trigger; feeding it cleaner audio (an array mic with hardware echo cancellation) helps more than any model tweak. And it is English-centric; other languages work through the synthetic training route with mixed results.

What it is not

It is not a full assistant, not a speech recogniser, and not a standalone daemon with a UI. Outside Home Assistant it is a building block for projects like Rhasspy and OpenVoiceOS, or for your own Python script listening on a microphone. If you want a whole assistant without assembling stages, start from one of those or from Home Assistant's home automation tooling rather than from this library.

What I'd do

Run the wyoming-openwakeword container on the same host as Home Assistant with the "hey Jarvis" model preloaded, faster-whisper and Piper beside it, and a Wyoming satellite or ESP32-S3 device in the room. Use a pre-trained phrase until the pipeline works end to end, then, if a custom name matters, train it in the notebook and set the threshold from a day of real use. It is the most practical offline wake-word engine available today, and the only one with a first-class integration path into a self-hosted assistant.

Similar home automation apps