All plugins

hermes-voice-lab

A voice you can play inside Hermes, made by a physical model of a throat, tongue, lips and nose with air pushed through them in real time: no samples and no TTS model. Drag her tongue and lips on a side-profile portrait with a live cutaway, play notes and sing lyrics from the keyboard, beatbox on pads. The agent plays her too: it speaks lines, writes songs and beats, changes her voice, and jams with you (play a phrase, pause, and Hermes sings an answer). Disclosure โ€” local synthesis only, no network calls. Agent renders and the optional read-aloud provider run node runtime/render.mjs (the plugin's own bundled script; fixed argv, no shell, 120 s timeout) and write WAVs and projects under the plugin's data folder; Desktop export and import use only a folder the user grants. With Jam switched on, each phrase you play is sent to the focused conversation as your message. MIDI access only on request. runtime/voice_lab_engine.wasm is built from the repo's Rust source in GitHub Actions and attested; desktop/plugin.js is the esbuild bundle of src/ and inlines the same engine. Optional read-aloud provider, off unless tts.provider is set to voice-lab. No telemetry.

AdolaniumVoicev0.4.1Updated 3 hours ago

About

A voice you can play inside Hermes, made by a physical model of a throat, tongue, lips and nose with air pushed through them in real time: no samples and no TTS model. Drag her tongue and lips on a side-profile portrait with a live cutaway, play notes and sing lyrics from the keyboard, beatbox on pads. The agent plays her too: it speaks lines, writes songs and beats, changes her voice, and jams with you (play a phrase, pause, and Hermes sings an answer). Disclosure โ€” local synthesis only, no network calls. Agent renders and the optional read-aloud provider run node runtime/render.mjs (the plugin's own bundled script; fixed argv, no shell, 120 s timeout) and write WAVs and projects under the plugin's data folder; Desktop export and import use only a folder the user grants. With Jam switched on, each phrase you play is sent to the focused conversation as your message. MIDI access only on request. runtime/voice_lab_engine.wasm is built from the repo's Rust source in GitHub Actions and attested; desktop/plugin.js is the esbuild bundle of src/ and inlines the same engine. Optional read-aloud provider, off unless tts.provider is set to voice-lab. No telemetry.

Hermes Voice Lab (plugin)

A singing, talking voice you can play inside Hermes, made by a physical model: a simulated glottis, throat, tongue, lips and nose, with air pushed through them in real time. No samples, no recordings, no neural or cloud TTS. The portrait is the instrument: drag her tongue, jaw and lips, play notes on the keys, sing lyrics live, beatbox on pads.

The agent can play her too. It speaks lines, writes songs and beats, changes her voice, and jams with you: press Jam with Hermes, play a phrase and pause, and the agent sings an answer.

Jam with Hermes

Install

hermes plugins install hermes-voice-lab --enable

Restart the gateway, then enable Voice Lab in Hermes Desktop under Capabilities โ†’ Plugins. It needs Node.js on the gateway machine for the agent's WAV renders (the Desktop instrument runs without it).

Agent tools

| Tool | Does |
|---|---|
| voice_lab_get | Current voice, shape, phrase and song, plus parameter ranges, presets and vowels |
| voice_lab_set_voice | Change the voice, apply a preset or hold a vowel; optional preview WAV |
| voice_lab_perform | Speak a phrase, sing a melody with lyrics, or beatbox a 16/32-step pattern; returns a WAV |
| voice_lab_render | Render the project, or a variation, to WAV |
| voice_lab_jam | Sing an answer to the phrase the user just played (nothing is saved) |

An optional read-aloud provider (tts.provider: voice-lab) speaks replies in the character voice. It is off unless you set it.

What it does on your machine

  • No network calls. Synthesis is local: WebAssembly in the Desktop window, and the same engine under Node for the agent's renders.
  • One subprocess. Agent renders run node runtime/render.mjs with a fixed argument list (no shell) and a 90 s timeout.
  • Files. Projects and WAVs are written only under the plugin's data folder (plugin-data/hermes-voice-lab/sessions/<id>/). Project files you save or open go through the Desktop's folder grant.
  • Chat turns on your behalf, only in Jam. With Jam with Hermes switched on, each phrase you play is sent to the focused conversation as your message (๐ŸŽน Jam ยท I played โ€ฆ Your turn.), and the agent answers. Nothing is sent while Jam is off.
  • Microphone, no. MIDI, opt-in. The MIDI button asks the browser for MIDI access; nothing else asks for device access.

Build provenance

runtime/voice_lab_engine.wasm and desktop/plugin.js (which inlines the same engine and the CMU-derived lexicon, because the Desktop loader takes one file) are build outputs of this repository's sources: the Rust engine in engine/ and the TypeScript in src/. The repository's GitHub Actions workflow rebuilds both from source on every push to main, fails if they differ from the committed files, and attaches a GitHub build-provenance attestation to each:

gh attestation verify runtime/voice_lab_engine.wasm --repo Adolanium/hermes-voice-lab

Source, documentation, tests and credits are in the repository. The engine's approach was inspired by Jameson Hodge's chimera-vocal-synth; see NOTICE.md.

README from the reviewed commit 80a40f4; it updates when the author re-pins.

More by Adolanium

26 plugins by Adolanium in the catalog.

AdolaniumgadgetTalk to your Hermes from small ESP32 devices with a screen, microphone and speaker: hold a button, ask, and hear the answer. Adds a gateway platform where each device is a chat, plus tools to list devices, show a card on a screen and run device actions (LEDs, relays). Disclosure โ€” the gateway listens for devices on a WebSocket port (8765, all interfaces by default; plain ws:// unless tls_cert/tls_key are set). New devices need a Hermes pairing code unless listed in GADGET_ALLOWED_USERS; GADGET_ALLOW_ALL_USERS skips pairing (development only). A paired device answers the agent's command approvals for its own chat (allow once or deny), within Hermes's approval timeout. The first approved device becomes the platform's home channel by default. Session hooks feed a dashboard on paired devices with each agent session's platform, a short id and its state (idle, busy, waiting for approval); a device that can switch profiles also sees the offered profiles' sessions. Optional profile switching (off unless `profiles` is set in the default profile's gadget config) lets a device paired on the default profile talk to the listed profiles; each profile approves the device through its own pairing flow (the device shows the `hermes -p <profile> pairing approve` command), the plugin writes nothing into other profiles, and revoking the device in the default profile sends it back there. A paired gadget that draws faces gets the answering profile's face: its `gadget-face.bin`, or its Hermes avatar (`assets/avatar.*`) converted with Pillow when installed; the plugin only reads these files, and `profile_faces: false` turns this off. `platforms.gadget.extra.stt_language` sets the transcription language of gadget recordings through the `pre_transcription` hook; other platforms' audio is untouched. Spoken replies that are not WAV are converted with the local ffmpeg; Opus reply audio uses the host's libopus when installed (loaded with ctypes, not bundled). `hermes gadget update --latest` downloads firmware from this repository's GitHub releases, checks size and SHA-256 against the release manifest (files carry build provenance attestations) and sends it to the device. A device that advertises `camera.capture` returns stills that are saved as PNGs under `~/.hermes/gadgetpix/` and kept until removed by hand. A Hermes Desktop page (`desktop/plugin.js`, plugin SDK only) runs a gadget in the window that connects to the local gateway as a device of its own: its device key, and the gateway access token when one is required, are kept in the page's plugin storage, it pairs like any device, and it uses the microphone only while its talk button or Space is held. The plugin's dashboard routes, behind the dashboard's login, can approve the pairing code a device is showing and send a card or run an advertised action on a connected, paired device; the requests pass through files under plugin-data/gadget/desk/. Otherwise writes only under plugin-data/gadget/. Uses Hermes's own STT, TTS and image cache; no telemetry. Independent community project, not affiliated with Nous Research.Communityplatform522Adolaniumhermes-resetwatchTrack subscription quotas and reset times in Hermes Desktop. Disclosure โ€” probe.py re-executes itself under the Hermes Python interpreter located via HERMES_PYTHON / VIRTUAL_ENV / the parent process or the Hermes installer's managed venv (HERMES_HOME/installs). Every credential read is read-only and nothing is refreshed or stored: it reads provider API keys from the process environment, the Hermes .env (through Hermes's get_secret helper, else read directly), the Vaultwarden plugin's local secret cache (cache/vaultwarden_cache.json, only when Vaultwarden is the sole enabled secret source, keyed by a hash of BW_SESSION, which is never sent) and Docker s6 container env files; Hermes's saved OAuth logins (the credential pool through Hermes's read_credential_pool helper, else auth.json directly, and HERMES_HOME/.anthropic_oauth.json); and other coding-assistant CLIs' local logins: Claude Code (credentials file, macOS keychain or Windows Credential Manager), Codex, Cursor (macOS keychain and the IDE's state.vscdb, opened read-only), Kimi, Grok, ZCode and Command Code. For GitHub Copilot (on by default) it tries COPILOT_GITHUB_TOKEN / GH_TOKEN / GITHUB_TOKEN (through Hermes get_secret, else the process environment), then the Copilot editor's apps.json / hosts.json, then runs gh auth token (prompts disabled, 3-second limit), trying each token in turn until GitHub accepts one. For Codex, a 401 or 403 is retried once with another saved login for the same account. It sends each key only to its own vendor's usage endpoint, presenting the vendor client's identity headers where a private endpoint expects them (Claude Code and Codex CLI user agents, the Grok CLI client headers, and for Copilot the VS Code / Copilot Chat editor headers on api.github.com/copilot_internal/user, which GitHub does not document); environment variables such as GROK_CLI_CHAT_PROXY_BASE_URL (honored only for https grok.com / x.ai hosts), CLAUDE_CONFIG_DIR, CODEX_HOME and GROK_HOME change which host or file it uses. Usage results are cached under HERMES_HOME/cache/resetwatch, never tokens. It exposes nothing to the model: it is a Desktop page only.CommunityDesktop app83Adolaniumhermes-rssRead RSS and Atom feeds and discuss articles in Hermes Desktop. Disclosure โ€” feeds and full articles are fetched with curl through the gateway's shell.exec on the connected Hermes host (public-IPv4 SSRF guard); opt-in AI grading sends article excerpts to your configured model and creates HERMES_HOME/skills/rss-importance-grading/SKILL.md if missing; opt-in image loading fetches publisher images directly from Desktop.CommunityDesktop app65Adolaniumhermes-tailscaleBrowse Tailscale devices and connect to remote Hermes instances in Hermes Desktop.CommunityDesktop app60

Developer Mode

Explore built-in Hermes toolsets and actions.

HermesAgent

Developer?

Create a Hermes extension for Desktop or agent workflows.

Developer Section