Wake word detection,
open and on-device.

ViolaWake is a production-tested wake word SDK — Apache 2.0, ONNX-first, Python-native. Train custom wake words in minutes. No cloud, no metering, no lock-in.

PyPI version CI License Python 3.10+

Quick Links

API Reference

Full auto-generated docs for every public class and function in the SDK.

Browse API docs →

README

Quick start, threshold guide, training CLI, voice pipeline, and feature comparison.

Read on GitHub →

Contributing

Setup guide, coding conventions, how to add a model, and the PR checklist.

CONTRIBUTING.md →

Changelog

All releases with breaking-change notices and migration notes.

CHANGELOG.md →

Installation

Minimum install — wake word detection only:

pip install "violawake[oww]"

Full install with microphone, TTS, and STT:

pip install "violawake[audio,oww,tts,stt]"

Linux requires portaudio19-dev; macOS requires brew install portaudio for the [audio] extra.

ExtraWhat it adds
audioMicrophone capture (PyAudio + soundfile) — requires PortAudio
owwOpenWakeWord backbone — required for wake word detection
downloadModel downloading with progress bars
ttsKokoro-82M on-device text-to-speech
sttfaster-whisper speech-to-text
vadWebRTC VAD backend
trainingFull training pipeline (torch, librosa, scikit-learn, edge-tts)
allEverything above

Quick Start

Download a model, then detect in 5 lines:

violawake-download --model temporal_cnn
from violawake_sdk import WakeDetector

detector = WakeDetector(model="temporal_cnn", threshold=0.80, confirm_count=3)

for audio_chunk in detector.stream_mic():
    if detector.detect(audio_chunk):
        print("Wake word detected!")
        break

Full voice pipeline (wake → STT → TTS):

from violawake_sdk import VoicePipeline

pipeline = VoicePipeline(wake_word="viola", stt_model="base", tts_voice="af_heart")

@pipeline.on_command
def handle(text: str) -> str:
    return f"You said: {text}"

pipeline.run()