Wake-word listener
Always-on "Hey Saga" voice activation — the first working hands-free client, as opposed to the push-to-talk run_demon.py client.
How to use it
Say "Hey Saga" to the listener device's microphone, wait for the acknowledgment beep, then speak your request naturally.
How it works
- Script:
python/services/saga_wakeword_listener.py, run as a systemd user service (needs a lingering session to survive reboots without an interactive login — see the script's own docstring for the exact units). - Pipeline: mic (via PipeWire) → openWakeWord (
SAGA_WW_MODEL, defaulthey_saga.onnx) detects "Hey Saga" → acknowledgment beep → energy-based endpointing records the utterance → POST to the localsaga-voice-gateway's/converse→ play the reply WAV back through the same output device viapw-play. - Config, all via env (see the script's docstring for the full list):
SAGA_WW_THRESHOLD(detection score, default 0.5),SAGA_WW_COOLDOWN(re-trigger debounce, default 3s),SAGA_WW_INPUT/SAGA_WW_SINK(audio device selection),SAGA_GATEWAY_URL/SAGA_GATEWAY_TOKEN. - Why PipeWire mediates both directions: capture and playback go through one audio server so the mic and the speaker never fight over the same device mid-conversation.
Status & known limits
- One listener. Wake-word capture currently runs on a single always-on device — other clients are push-to-talk, not wake-word-activated.
- False-trigger tuning is live but unexercised: confirmation beep + threshold + cooldown + detection-paused-during-playback are all in place, but as of this writing no false triggers have been observed in real use to tune against.
- Which physical device and host this actually runs on is deployment state, not documented here — see
nthmost-systems/saga/DEPLOYMENTS.md.