Last updated on

Hermes Agent v0.19.1: The 'Patch' That Touched 4,700 Files and Rebuilt the Voice Stack


Hermes Agent v0.19.1: The “Patch” That Touched 4,700 Files and Rebuilt the Voice Stack

A headline like “Hermes Agent emergency patch exposed, voice system reborn, 4,700 files overhauled” sounds like a project in crisis. But the v0.19.1 release page tells a different story: this July 30 drop is a high-density stability salvage wave, not a panic fix. This post skips the clickbait and reads the release notes and source commits so you know what actually changed.

1. The numbers first: 4,700 files is real, not marketing fluff

The official release notes put it bluntly:

From v0.19.0 (2026.7.20) to v0.19.1 (2026.7.30): ~2,789 commits, ~4,748 files changed, ~442,000 insertions, ~392,300 deletions.

So roughly one in six files in the Hermes repository were touched in a ten-day window. “4,700 files” is therefore accurate — it is just the cumulative delta between v0.19.0 and v0.19.1, not a single monster commit. The team shipped it as a patch release because downstream consumers (Docker images, hosted deployments, and fresh installs) needed a stable tag, not because the changes were small.

If you are new to Hermes, the install guide covers local, Docker, and Desktop setups.

2. Why the voice subsystem got the spotlight

v0.19.0 was branded the “Quicksilver Release” and shipped a lot of new features and UI rework. Large releases are usually followed by a cleanup wave where edge cases in the new architecture surface quickly. v0.19.1 focused on four areas:

  1. The gateway and voice subsystem.
  2. The Desktop app: composer, tabs, and state sync.
  3. The installer and auto-updater reliability.
  4. Platform extensions: Buzz/Nostr channels, FLUX3 video generation and delivery, Telegram media reliability, and voice-mode regressions.

The voice changes are the most user-visible. Voice barge-in failing, TTS voice bubbles rendering as 0-second clips, saying “stop” and nothing happening, and wake words arming without a working STT/TTS pipeline — all of these were fixed systematically in v0.19.1.

3. Four key voice fixes

3.1 Full-duplex agent-turn listening: you can finally interrupt

commit: 5081551fix(voice): full-duplex agent-turn listener

The old voice mode was effectively half-duplex:

  • During LLM generation, the microphone listener was not running at all, so your voice could not interrupt the turn.
  • During TTS playback, the listener did run, but it calibrated its VAD noise floor while the speaker was blaring TTS. Speaker bleed got baked into the floor, raising the threshold so high that normal speech rarely tripped it.
  • The trigger used a strict consecutive-energy counter that reset on intra-word dips, swallowing the first syllable of your interruption.

v0.19.1 introduces tools/voice_mode.full_duplex_listen(): one listener spans the entire agent turn:

  • The noise floor is calibrated in a quiet room at turn start and held constant through generation and playback.
  • During generation, the trigger uses voice.barge_in_threshold_multiplier (default 3.0).
  • During playback, a 1500 RMS minimum and a 4000 RMS ceiling prevent speaker bleed from tripping the detector while still letting human speech reach it.
  • A 300 ms windowed majority vote (≥80%) replaces the strict consecutive counter, so brief energy dips inside a word no longer reset detection.
  • A grace period is applied only at playback onset (voice.barge_in_grace_seconds, default lowered from 2.0 s to 0.5 s), rather than muting the mic for the entire reply.

To see the diagnostics:

HERMES_VOICE_DEBUG=1 hermes voice

3.2 Rolling-window VAD: adaptive echo rejection

commit: be42470fix(voice): rolling-window VAD, duplicate render suppression, TUI gateway mirror

Before the full-duplex model above, the team already landed a rolling-window VAD to mitigate the old half-duplex model:

  • A ~3-second deque continuously recalculates the 90th-percentile noise floor instead of calibrating once.
  • The multiplier was raised from 5x to 8x to absorb TTS volume variation.
  • The 4000 RMS trigger ceiling and a SILENCE_RMS_THRESHOLD * 2 minimum are kept.
  • A barge_in_grace_seconds of 2.0 s at playback start prevents premature barge-in.
  • In streaming_enabled mode, duplicate text rendering is suppressed, so you do not read two copies of the same sentence while hearing it.
  • The same logic is mirrored into the TUI gateway so CLI and TUI paths behave identically.

3.3 Stop phrases: say or type “stop” to end the voice chat

commit: ba13132fix(voice): bare stop phrase ends the voice chat on every surface

Previously, only the classic CLI PTT mode honored a spoken stop phrase. v0.19.1 unifies the behavior across every surface:

  • hermes_cli/voice.py now passes an explicit on_stop_phrase callback through start_continuous/stop_continuous.
  • The TUI gateway emits voice.transcript {stop_phrase: true}, flips HERMES_VOICE(_TTS) off, and stops streaming TTS.
  • The CLI process_loop now treats a typed “stop” during voice mode as a voice-mode exit, not a message to send to the agent.
  • The Desktop composer intercepts a bare typed stop command and ends the live voice conversation, using the same path as clicking the end button.
  • tools/voice_mode.py makes stop phrases win over Whisper’s hallucination filter, so words like “bye” still work if they are configured as stop phrases.

The default stop phrase is voice.stop_phrases = ["stop"], but you can customize it:

voice:
  stop_phrases:
    - "stop"
    - "end"
    - "bye"

3.4 TTS container repair: no more broken 0-second voice bubbles

commit: fae29c8fix(tts): class-level .ogg container repair + multi-platform opus voice detection

This is the root-cause fix for the “voice bubble is broken / plays for 0 seconds” family of bugs on Telegram, Matrix, Feishu, WhatsApp, and Signal:

  • Some backends return MP3 or WAV bytes even when the output path is .ogg (Edge returns MP3, Piper returns WAV, xAI returns MP3, and some OpenAI-compatible servers ignore response_format=opus).
  • v0.19.1 adds _sniff_audio_container and _repair_ogg_container inside text_to_speech_tool to detect the actual container after synthesis and centrally transcode with ffmpeg or rename the file to the honest extension.
  • A new OPUS_VOICE_PLATFORMS set covers all platforms that need real Opus voice bubbles, not just Telegram.

For end users, this means auto-TTS replies across gateways are far less likely to arrive as broken attachments.

3.5 Wake word: only arm when STT and TTS are actually ready

commit: f03bb2bfeat(wake): gate arming on STT + TTS readiness

The wake loop is: wake word → record → STT → agent → TTS. Arming the mic when either half is missing creates a frustrating “I heard you but nothing happened” experience. In v0.19.1, check_wake_word_requirements probes both:

  • stt.enabled and a provider that is not none.
  • A passing check_tts_requirements result.

If either is missing, the command refuses and tells you exactly which half is broken. For example, if STT is disabled, /wake reports that speech-to-text is not ready. This prevents a common rookie mistake: enabling the wake word while forgetting to configure the speech stack.

Putting the fixes together, a v0.19.1 voice config could look like this:

voice:
  barge_in_threshold_multiplier: 3.0   # full-duplex barge-in sensitivity
  barge_in_grace_seconds: 0.5            # playback onset grace, down from 2.0
  stop_phrases:
    - "stop"

stt:
  enabled: true
  provider: whisper  # or your actual backend

tts:
  provider: edge    # or openai / elevenlabs / piper / etc.

When voice misbehaves, follow this order:

  1. Run hermes tools to confirm voice-related tools are enabled.
  2. Run HERMES_VOICE_DEBUG=1 hermes voice to watch VAD thresholds and interrupt decisions.
  3. Check voice.stop_phrases contains the word you want.
  4. Confirm stt.enabled and tts.provider are both set.
  5. In Desktop, open the Capabilities tab and verify TTS provider and voice model (v0.19.1 added inline TTS voice/model settings there).

5. Other notable fixes in the patch

Outside of voice, v0.19.1 includes stability improvements that affect daily use:

  • Composer attachments: the TUI now inserts attachments inline at the cursor and detaches them when you delete the token.
  • Tab close behavior: closing the last main tab lands on New session instead of a blank screen.
  • Terminal links: ⌥-click no longer sprays cursor escapes into the terminal, and links clicked inside the integrated terminal actually open.
  • CI security: the main repo CI workflow now uses short-lived GitHub App tokens instead of a long-lived PAT, improving fork security.
  • Docker / Nix: module paths and lockfile issues were fixed.

If you want a side-by-side comparison with other AI agents, see the comparison page.

6. How to upgrade

v0.19.1 is available through the official installer or via hermes update:

# Already installed
hermes update

# Fresh install
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash

After upgrading:

  1. Run hermes version to confirm you are on v0.19.1 or newer.
  2. Run hermes config get voice to verify old voice settings migrated cleanly.
  3. Start a continuous voice conversation and test barge-in and stop phrases.
  4. If you use Desktop, check the Capabilities tab for the TTS provider and voice model.

7. Bottom line: why this “patch” matters

Hermes Agent v0.19.1 is a reminder that a patch number does not equal patch size. In about ten days, the team merged ~2,789 PRs, touched ~4,748 files, and systematically salvaged the voice, desktop, installer, and platform stability issues that surfaced after the v0.19.0 “Quicksilver” release.

For everyday users, the clearest wins are:

  • Voice mode that you can actually interrupt.
  • “Stop” works whether you speak it or type it.
  • Cross-platform voice bubbles are more reliable.
  • Wake words refuse to arm when the speech pipeline is half-configured.

The team also notes that v0.20.0 will ship full curated release notes covering everything from v0.19.0 onward, including all feature highlights and contributor credits. To follow along, bookmark the releases page.


References