Wake Word: Hands-Free 'Hey Hermes' Voice Sessions
The wake word turns Hermes into a hands-free assistant across the CLI, TUI, and desktop app. With one setting on, Hermes listens in the background for a spoken trigger phrase. Say it, and Hermes starts a fresh session, opens the microphone, captures your command via the normal voice pipeline, and answers — exactly like "Hey Siri" or "Alexa". The default phrase is "hey hermes", and a model for it ships with Hermes, so it works out of the box with no training.
Crucially, detection runs entirely on-device. The always-on listener only watches for the wake phrase; no audio leaves your machine until you actually speak a command to the agent.
How It Works
With wake_word.enabled: true (or after /wake on), a lightweight hotword detector listens on your configured input device, or the process-default microphone when wake_word.input_device is unset. When it hears the wake phrase it pauses itself (freeing the mic), starts a new session, and records one utterance using voice mode's silence detection. Your speech is transcribed and sent to the agent; after it replies, the listener resumes automatically and waits for the next wake word. It is off by default — nothing listens until you turn it on. On the desktop app, a hands-free conversation can be ended by simply saying "stop" (or "never mind", "goodbye", "cancel", "that's all") — the spoken command ends the conversation instead of being sent to the agent.
Engines and Phrases
Three engines power the detector:
- openWakeWord (default) — free, no API key, using local ONNX models. Ships a bundled "hey hermes" model; also supports
hey_jarvis,alexa,hey_mycroft, and custom models. - sherpa — free, open-vocabulary. It detects any typed phrase with zero training, auto-downloading a small English model (~13 MB) on first use.
- Porcupine — Picovoice's engine, free tier or paid, with a
PORCUPINE_ACCESS_KEYand built-in keywords plus custom.ppnfiles.
To wake on something besides "hey hermes", the easiest path is sherpa: just type the phrase — "hey coder", "computer", "wake up neo" — and it's tokenized at runtime. Alternatively, name a built-in openWakeWord model or train a custom one and reference its .onnx file, or create a custom keyword in the Picovoice Console and use it as a .ppn.
Waking a Specific Profile
With the sherpa engine, one listener can wake any profile on the desktop app. Every profile whose config has wake_word.enabled: true is enrolled automatically, with its phrase defaulting to hey <profile name> when unset. Say a profile's phrase and the desktop live-switches to that profile, opens a fresh session there, and starts hands-free voice: "hey hermes" → the default profile, "hey coder" → the coder profile, and so on. Set wake_word.profile_routing: false to opt out and listen only for your own phrase. The CLI and TUI are single-profile processes, so a wake phrase belonging to another profile prints the switch command (hermes -p <profile>) instead of routing.
Controlling False Triggers
openWakeWord scores one short (~80ms) audio frame at a time, so a stray phoneme in background conversation can occasionally spike a single frame over the threshold. Two knobs reduce false triggers:
confirmation_frames(default 3, openWakeWord only) — how many consecutive over-threshold frames are required before the wake fires. A real "hey hermes" holds a high score across several frames; an ambient blip spikes just one. Raise it in a noisy room; the cost is a few tens of milliseconds of extra latency.sensitivity(default 0.6, range 0.0–1.0) — the detection threshold. Higher is stricter (fewer false triggers), and this direction is consistent across all engines. Raise toward 0.8 for more false-fire resistance, or lower it if real utterances are missed.
The sherpa and porcupine engines decode the whole phrase internally, so they don't have the single-frame-spike problem and ignore confirmation_frames — but they still honor sensitivity.
Surfaces and Requirements
The wake word works in all three local surfaces — CLI, TUI, and desktop GUI — and the surface setting picks which one owns the listener (auto, cli, tui, or gui). The detector is on-device and single-mic, so only one surface listens at a time, including across separate processes. It does not run in the messaging gateway (Telegram, Discord, and so on), which has no microphone.
To get started you need a working microphone with the sounddevice + numpy audio stack (shared with voice mode), an STT provider for transcribing the command (local faster-whisper works out of the box), a TTS provider for speaking the reply (the default edge-tts needs no key), and the wake-engine dependencies. Because the wake flow is fully hands-free, the toggle refuses to arm until both STT and TTS are ready. Inside a session, /wake on, /wake status, and /wake off manage the toggle, and /wake status reports exactly what's missing if the listener won't start. The desktop app offers an ear icon in the composer.
Key Takeaways
- The wake word makes Hermes hands-free across the CLI, TUI, and desktop — say "hey hermes" to start a voice session.
- Detection is fully on-device; no audio leaves your machine until you speak a command.
- Pick from three engines — openWakeWord, sherpa, or Porcupine — to choose your phrase and robustness.
confirmation_framesandsensitivitytune false triggers, with sherpa powering multi-profile waking.- It runs only on local surfaces (not the messaging gateway) and requires STT and TTS to arm.