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

Install this into the same Python environment as Hermes Agent itself (it registers a plugin entry point, so it must be importable from wherever hermes runs) — if Hermes Agent lives in a virtual environment, activate that environment first. If you get error: externally-managed-environment (PEP 668, common on Ubuntu 24.04, Debian 12+, and Linux Mint 22), it means Hermes Agent itself is installed against the system Python; put both Hermes Agent and this plugin in the same virtual environment rather than passing --break-system-packages.

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.1.tar.gz (10.3 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.1-py3-none-any.whl (10.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: avervox_hermes-0.2.1.tar.gz
  • Upload date:
  • Size: 10.3 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.1.tar.gz
Algorithm Hash digest
SHA256 a5dbf8243db5796c01562e29bbf914446b03b579ba5047e79e56444887b1a863
MD5 4b4d0f87b6490f589655f9323f74aa4f
BLAKE2b-256 4332cfa8ae77cffdeaf38fc7030a6053eb198c8080e40c7dfeff3f52fef92d44

See more details on using hashes here.

File details

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

File metadata

  • Download URL: avervox_hermes-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 10.2 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.1-py3-none-any.whl
Algorithm Hash digest
SHA256 7037cf95f36663c529ca76fbcb1700bf30a46f2454f64f0431b3af308ff36ecd
MD5 20fcf77053600321a19bf6261fcd6f52
BLAKE2b-256 cd2b408e1b41cb3f84b25fce33d8f25bdd2a8695abadd1da4f1efc83d518744b

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