Hermes.News

Technical news, guides and deep-dives on Hermes Agent by Nous Research


Core FeaturesSep 13, 2026897 words

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_KEY and built-in keywords plus custom .ppn files.

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_frames and sensitivity tune 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.