Skip to main content

AverVOX TTS/STT providers for Hermes Agent — local speech, no cloud API

Project description

AverVOX ↔ Hermes Agent

Use AverVOX (OSS or Pro) as the local TTS/STT backend for Hermes Agent.

Speech runs on the same machine as the agent: replies are never sent to a speech vendor, microphone audio is never uploaded, there is no per-character bill, and it all keeps working with the network down. With the warm bridge running, Hermes hears the first audio of a reply in about 0.32 s — see Latency.

Fastest path

Recent AverVOX builds write the config below and verify it for you:

avrvx --install-integration hermes

It synthesizes real audio afterwards and exits non-zero if anything is wrong, and it never modifies an existing ~/.hermes/config.yaml — if you already have one, it writes the snippet alongside for you to merge.

Recommended: command providers (no Python plugin required)

Requires AverVOX 0.5.0 or newer with avrvx on PATH:

# ~/.hermes/config.yaml  (snippet — merge into your existing file)
tts:
  provider: avervox
  providers:
    avervox:
      type: command
      command: "avrvx --synthesize --text-file {input_path} --output {output_path}"
      output_format: wav
      voice_compatible: true
      timeout: 180

stt:
  provider: avervox
  providers:
    avervox:
      type: command
      command: "avrvx --transcribe {input_path} > {output_path}"
      format: txt
      timeout: 300

A copy of this snippet lives at hermes.config.snippet.yaml.

Verify:

avrvx --capabilities
hermes tools   # pick AverVOX / avervox for TTS when using the Python plugin path

Optional: Python plugin

This directory is a Hermes plugin that registers TTS (and STT) providers named avervox via register_tts_provider / register_transcription_provider. Prefer the YAML command providers above unless you need picker metadata or streaming hooks.

The plugin pipes reply text to avrvx over stdin rather than passing it as an argument, so conversation text never appears in the process list. It caches the --capabilities probe (the picker reads display_name repeatedly) and runs avrvx in its own process group so a timeout also kills Piper or Whisper.

Install

pip install avervox-hermes
# then enable if required by your Hermes version
hermes plugins enable avervox

The package registers itself under the hermes_agent.plugins entry point group, so Hermes discovers it without any path configuration.

To work on the plugin instead of just using it:

git clone https://github.com/avrvx/AverVOX-Integrations.git
pip install -e AverVOX-Integrations/hermes

Point Hermes at AverVOX:

tts:
  provider: avervox
stt:
  provider: avervox

AverVOX → Hermes (Converse)

In the AverVOX Dashboard (Pro) or Settings → LLM (OSS), add a profile:

Field Example
Label Hermes Agent
API base http://127.0.0.1:<hermes-port>/v1
Session header X-Hermes-Session-Id

OSS vs Pro

One integration. Pro features (Kokoro, etc.) follow whatever AverVOX has configured; avrvx --capabilities reports the edition.

Latency

Measured through Hermes' own registries on a 2017 laptop with Piper en_US-lessac-high. "First audio" is the wait before playback can start on a three-sentence reply; "whole reply" is the wait for a finished WAV.

Spawn per call Warm daemon
First audio (streaming) 2.6 s 0.32 s
Whole reply (file) 3.3 s 0.77 s

Two independent wins. avrvx --daemon removes the Python start and model load from every call; see systemd/ for a user unit. Streaming then starts playback on the first sentence instead of the last. Neither is required — without both, the first column applies and everything still works.

Tested against

Version
Hermes Agent 0.19.0 (commit 1161cc0)
AverVOX OSS and Pro, 0.5.0 and newer
Python 3.12

Verified by registering through Hermes' own agent.tts_registry and agent.transcription_registry and then synthesizing from what came back out, rather than by calling the provider classes directly. That distinction matters: PluginContext.register_tts_provider isinstance-checks against agent.tts_provider.TTSProvider and only logs a warning when the check fails, so a provider that does not inherit the ABC is dropped without raising. The streamer is resolved through tools.tts_streaming.resolve_streaming_provider for the same reason.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

avervox_hermes-0.2.0.tar.gz (9.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

avervox_hermes-0.2.0-py3-none-any.whl (9.8 kB view details)

Uploaded Python 3

File details

Details for the file avervox_hermes-0.2.0.tar.gz.

File metadata

  • Download URL: avervox_hermes-0.2.0.tar.gz
  • Upload date:
  • Size: 9.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for avervox_hermes-0.2.0.tar.gz
Algorithm Hash digest
SHA256 fa0e5a064b4686a174463f1a06cbcbf7b42a42af78c2c673a94701490a7aff58
MD5 752444a9679834352618c4c710eb5e24
BLAKE2b-256 1223c9810c65796e1ba3c11023266cb7ba6b8058990a1597d58888c90d62081b

See more details on using hashes here.

File details

Details for the file avervox_hermes-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: avervox_hermes-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 9.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for avervox_hermes-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5f6930f6f568109bdbd1189c021b98c10f5b2c7283abc06a2d9fd90823d2c993
MD5 65bc538c23ad08769076fa68e27ab9bc
BLAKE2b-256 6ca576088d19314399b1a718d4742fba8a309ab5e0ce184387751b90058b7591

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page