A spoken turn no longer has to use your typing model

You are talking to Hermes Desktop with voice mode on, you ask what time it is, and the pause in the middle is long enough to make you check the microphone. When it finally speaks the pacing is natural, but you can hear that it thought first — because the thing answering you is the same model you type to. The problem is not the audio pipeline. It is that this turn runs on the same brain: same model, same thinking budget, same price. Two wastes follow, and you may not have noticed either: voice is the one surface that needs to be fast, and it was running long reasoning; voice asks are usually short, and they were billed as your main model. Hermes has now pulled those two things apart.
Spoken turns get their own model slot
The new slot is auxiliary.voice_chat, and it works like the other auxiliary models you already know (vision, title_generation, compression): it changes only the model that answers the spoken turn — everything else stays where it was. The default is auto, which means the current session’s model, so doing nothing keeps the behaviour you are used to.
Three ways to change it, all writing the same config:
auxiliary:
voice_chat:
provider: openrouter # "auto" = the session's own model (default)
model: google/gemini-3-flash-preview # empty with a provider = that provider's fast model
reasoning_effort: none # default: reasoning off on voice turns (see below)
- Desktop: Settings → Models → Auxiliary models;
- CLI:
hermes model→ Auxiliary models, where the list now carriesvoice_chatascurrently: auto / main model; - Or write it straight into
config.yaml, exactly as above.
Know the blast radius: every turn that is spoken — CLI and TUI voice mode, the Desktop voice conversation, and voice notes on messaging platforms. The voice turn keeps the full toolset; only the model answering it changes. Your next typed message goes back to the session’s model, and so do the memory and skill reviews that follow a turn. Usage is recorded under the voice_chat task, so a voice turn never quietly rewrites which model your session is.
Reasoning is off by default — and it remembers a refusal
The second change is blunter: voice turns default to reasoning off (reasoning_effort: none), and that applies even when you leave the slot on auto and the session’s own model answers. The reason is simple: the value of talking is the response time; long thinking turns a conversation into a voicemail.
There are two real-world exceptions, handled sensibly:
- The model refuses to turn reasoning off (a mandatory-thinking model, or a route whose catalog marks it mandatory) → it gets its lowest accepted level instead of a value that would be rejected;
- A route rejects the disable at runtime → the result is remembered, so the next voice turn does not walk into the same wall.
If you do want some thinking on voice (say, to summarise while listening), set a level explicitly. Setting it to the empty string "" means “follow whatever the session uses”.
One more quiet detail: the voice model never forces a compaction. If the conversation is already larger than that usually-smaller model’s context window, that turn runs on the session’s model instead and you get a one-time notice — rather than half the history disappearing without a word.
Going further: let one full-duplex voice model own the loop
If the “transcribe → turn → speak” chain itself feels slow, there is a second mode. Switch the Desktop voice chat mode to gpt-live and the whole chain is replaced by one full-duplex voice model: it listens while it speaks, handles interruptions, backchannels and background noise itself, and has no tools of its own. The moment you ask for real work, it delegates to Hermes — your session’s model, the full toolset, memory and approvals — and then speaks the answer back to you.
voice:
voice_chat_mode: gpt-live # chained (default) | gpt-live
gpt_live:
voice: marin # marin, cedar, quartz, ripple, vesper, willow, stone, gleam, meridian, …
instructions: "" # optional extra persona sentences (tone, pace, language)
It needs an OpenAI API key (OPENAI_API_KEY, VOICE_TOOLS_OPENAI_KEY, or voice.gpt_live.api_key). Watch the billing: the voice layer is charged by OpenAI at $0.05 per minute of session time (idle time counts), while the Hermes turn is billed on your own provider as always. If gpt-live is selected but no key resolves, the button falls back to the chained mode with a notice rather than failing silently.
Some limits are worth knowing up front: this mode cannot use the Nous-managed audio proxy (direct key only), it is Desktop-only (CLI/TUI /voice stays on the chained loop), and the tts tool keeps using tts.provider. The key also never reaches the client — the desktop receives a session id and an SDP answer, and the gateway host creates the session (POST /api/audio/voice-live/session).
Edges that trip people up
gpt-liveignoresauxiliary.voice_chat: on that path the voice layer already is the fast model and the session model does the real work, so a separate voice model means nothing.- Barge-in tuning still applies in chained mode, and it is worth tuning:
voice.barge_in(on by default),voice.barge_in_threshold_multiplier(3.0 by default; lower is more sensitive — try 1.5 on a quiet Bluetooth headset) andvoice.barge_in_grace_seconds(0.5). When it misbehaves,HERMES_VOICE_DEBUG=1streams per-block VAD decisions (calibrated floor, RMS, trip) to stderr. - Speed has a cost: a smaller model is more likely to answer thinly. The safe pattern is a fast model on voice, and type the question when you need depth — that path still uses your original model, undiluted.
Wrapping up
auxiliary.voice_chatgives the spoken turn its own model; the default isauto(the session model).- Voice turns default to reasoning off; a model that cannot disable it drops to its lowest level, and a runtime refusal is remembered.
voice.voice_chat_mode: gpt-liveswaps the whole chain for a full-duplex voice model that delegates real work to the session model — Desktop only, direct OpenAI key, $0.05/min including idle time.- The voice model never forces a compaction; if the conversation exceeds its window, that turn falls back to the session model with a notice.
We have covered the other two halves of the voice chain before: keeping the local speech model warm with sentence-level streaming, and silence trimming before upload plus idle unload. With today’s “which model answers”, all three stages are documented.