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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a5dbf8243db5796c01562e29bbf914446b03b579ba5047e79e56444887b1a863
|
|
| MD5 |
4b4d0f87b6490f589655f9323f74aa4f
|
|
| BLAKE2b-256 |
4332cfa8ae77cffdeaf38fc7030a6053eb198c8080e40c7dfeff3f52fef92d44
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7037cf95f36663c529ca76fbcb1700bf30a46f2454f64f0431b3af308ff36ecd
|
|
| MD5 |
20fcf77053600321a19bf6261fcd6f52
|
|
| BLAKE2b-256 |
cd2b408e1b41cb3f84b25fce33d8f25bdd2a8695abadd1da4f1efc83d518744b
|