Um turno falado não precisa mais usar o seu modelo de digitação


Você está conversando com o Hermes Desktop com o modo de voz ligado, pergunta que horas são, e a pausa no meio é longa o bastante para você checar o microfone. Quando ele finalmente fala, o ritmo é natural, mas dá para ouvir que ele pensou antes — porque quem te responde é o mesmo modelo para o qual você digita. O problema não é o pipeline de áudio. É que este turno roda em o mesmo cérebro: mesmo modelo, mesmo orçamento de raciocínio, mesmo preço. Daí seguem dois desperdícios, e talvez você não tenha notado nenhum dos dois: a voz é a superfície que precisa ser rápida, e estava rodando raciocínio longo; os pedidos por voz costumam ser curtos, e eram cobrados como o seu modelo principal. O Hermes agora separou essas duas coisas.

Turnos falados ganham o seu próprio slot de modelo

O novo slot é auxiliary.voice_chat, e ele funciona como os outros modelos auxiliares que você já conhece (vision, title_generation, compression): ele muda apenas o modelo que responde ao turno falado — todo o resto fica onde estava. O padrão é auto, que significa o modelo da sessão atual, então não fazer nada mantém o comportamento ao qual você está acostumado.

Três formas de mudá-lo, todas gravando a mesma config:

auxiliary:
  voice_chat:
    provider: openrouter          # "auto" = o modelo da própria sessão (padrão)
    model: google/gemini-3-flash-preview   # vazio com um provider = o modelo rápido desse provider
    reasoning_effort: none        # padrão: raciocínio desligado nos turnos de voz (veja abaixo)
  • Desktop: Settings → Models → Auxiliary models;
  • CLI: hermes model → Auxiliary models, onde a lista agora carrega voice_chat como currently: auto / main model;
  • Ou escreva direto no config.yaml, exatamente como acima.

Conheça o raio de alcance: todo turno que é falado — modo de voz do CLI e da TUI, a conversa por voz do Desktop e as notas de voz nas plataformas de mensagens. O turno de voz mantém o toolset completo; só o modelo que o responde muda. A sua próxima mensagem digitada volta ao modelo da sessão, e o mesmo vale para as revisões de memória e de skills que seguem um turno. O uso é registrado sob a tarefa voice_chat, então um turno de voz nunca reescreve silenciosamente qual é o modelo da sua sessão.

O raciocínio fica desligado por padrão — e ele lembra de uma recusa

A segunda mudança é mais direta: os turnos de voz ficam com o raciocínio desligado por padrão (reasoning_effort: none), e isso vale mesmo quando você deixa o slot em auto e o modelo da própria sessão responde. A razão é simples: o valor de falar é o tempo de resposta; pensar demais transforma uma conversa em caixa postal.

Há duas exceções do mundo real, tratadas com bom senso:

  • O modelo se recusa a desligar o raciocínio (um modelo de pensamento obrigatório, ou uma rota cujo catálogo a marca como obrigatória) → ele recebe o seu nível aceito mais baixo em vez de um valor que seria rejeitado;
  • Uma rota rejeita o desligamento em tempo de execução → o resultado é memorizado, então o próximo turno de voz não bate na mesma parede.

Se você quiser um pouco de raciocínio na voz (digamos, para resumir enquanto escuta), defina um nível explicitamente. Definí-lo como a string vazia "" significa “siga o que a sessão usar”.

Mais um detalhe discreto: o modelo de voz nunca força uma compactação. Se a conversa já é maior que a janela de contexto desse modelo geralmente menor, aquele turno roda no modelo da sessão e você recebe um aviso único — em vez de metade do histórico desaparecer sem avisar.

Indo além: deixe um único modelo de voz full-duplex assumir o loop

Se a própria cadeia “transcrever → turno → falar” parece lenta, existe um segundo modo. Troque o modo de voz do Desktop para gpt-live e toda a cadeia é substituída por um único modelo de voz full-duplex: ele ouve enquanto fala, lida com interrupções, backchannels e ruído de fundo sozinho, e não tem tools próprias. No momento em que você pede trabalho de verdade, ele delega ao Hermes — o modelo da sua sessão, o toolset completo, a memória e as aprovações — e então fala a resposta de volta para você.

voice:
  voice_chat_mode: gpt-live     # chained (padrão) | gpt-live
  gpt_live:
    voice: marin                # marin, cedar, quartz, ripple, vesper, willow, stone, gleam, meridian, …
    instructions: ""            # frases extras opcionais de persona (tom, ritmo, idioma)

Ele precisa de uma chave de API da OpenAI (OPENAI_API_KEY, VOICE_TOOLS_OPENAI_KEY ou voice.gpt_live.api_key). Atenção à cobrança: a camada de voz é cobrada pela OpenAI a $0,05 por minuto de tempo de sessão (tempo ocioso conta), enquanto o turno do Hermes é cobrado no seu próprio provider, como sempre. Se o gpt-live estiver selecionado mas nenhuma chave resolver, o botão cai de volta para o modo encadeado com um aviso, em vez de falhar silenciosamente.

Vale conhecer alguns limites de antemão: este modo não pode usar o proxy de áudio gerenciado pela Nous (somente chave direta), é exclusivo do Desktop (o /voice do CLI/TUI continua no loop encadeado) e a tool tts continua usando tts.provider. A chave também nunca chega ao cliente — o desktop recebe um session id e uma resposta SDP, e o host do gateway cria a sessão (POST /api/audio/voice-live/session).

Arestas que pegam as pessoas de surpresa

  • O gpt-live ignora o auxiliary.voice_chat: nesse caminho a camada de voz já é o modelo rápido e o modelo da sessão faz o trabalho de verdade, então um modelo de voz separado não significa nada.
  • O ajuste de barge-in continua valendo no modo encadeado, e vale a pena ajustar: voice.barge_in (ligado por padrão), voice.barge_in_threshold_multiplier (3.0 por padrão; menor é mais sensível — tente 1.5 num headset Bluetooth silencioso) e voice.barge_in_grace_seconds (0.5). Quando ele se comporta mal, HERMES_VOICE_DEBUG=1 transmite as decisões de VAD por bloco (piso calibrado, RMS, disparo) para o stderr.
  • Velocidade tem um custo: um modelo menor tem mais chance de responder de forma superficial. O padrão seguro é um modelo rápido na voz e digitar a pergunta quando você precisa de profundidade — esse caminho ainda usa o seu modelo original, sem diluição.

Para fechar

  • O auxiliary.voice_chat dá ao turno falado o seu próprio modelo; o padrão é auto (o modelo da sessão).
  • Os turnos de voz ficam com o raciocínio desligado por padrão; um modelo que não consegue desligá-lo cai para o seu nível mais baixo, e uma recusa em tempo de execução é memorizada.
  • voice.voice_chat_mode: gpt-live troca toda a cadeia por um modelo de voz full-duplex que delega trabalho de verdade ao modelo da sessão — só no Desktop, chave direta da OpenAI, $0,05/min incluindo tempo ocioso.
  • O modelo de voz nunca força uma compactação; se a conversa excede a sua janela, aquele turno cai de volta no modelo da sessão com um aviso.

Já cobrimos as outras duas metades da cadeia de voz: manter o modelo de fala local quente com streaming por frase, e corte de silêncio antes do upload mais descarregamento por ociosidade. Com o “qual modelo responde” de hoje, os três estágios estão documentados.