say do macOS ao motor embarcado Kokoro.
Modos (CHATCLI_GATEWAY_VOICE_REPLY)
Valores booleanos legados seguem válidos:
true → always, false → never. Um valor desconhecido cai em auto — um typo nunca silencia o gateway.
Controle por conversa — tool @voice
Cada conversa manda na própria preferência pedindo em linguagem natural: o modelo chama a tool @voice, e a escolha fica gravada por sessão (sobrevive a restart do daemon) com precedência sobre o modo global.
A preferência fica em
~/.chatcli/gateway_voice_prefs.json (escrita atômica), chaveada por plataforma:chat. Hierarquia de decisão: preferência da conversa → modo global → in-kind.
Escrita para o ouvido (speech-aware)
Quando a resposta vai virar áudio, duas camadas garantem fala natural:- O modelo sabe antes de escrever: uma diretiva avisa que a resposta será falada — prosa conversacional, frases curtas, sem emojis, sem listas/tabelas/markdown.
- Garantia dura no sanitizador: antes da síntese,
StripForSpeechachata markdown (código removido, links viram rótulo, tabelas viram prosa) e remove emojis e pictogramas — motores de TTS leem o nome Unicode deles em voz alta, enterrando a mensagem. Acentos do português ficam intactos.
Voice note que toca (transcode)
Backends que ignoram o formato pedido (osay do macOS emite aiff, espeak emite wav) produziam um arquivo que o Telegram mostra com tamanho mas não reproduz. Com ffmpeg no PATH, o gateway transcoda wav/aiff → OGG/Opus (perfil de voice note: 48 kHz mono) para qualquer provedor; formatos já comprimidos passam direto, e sem ffmpeg o clipe original segue como arquivo de áudio — degradação visível, nunca resposta perdida.
Pipeline completo
Solução de problemas
Relacionado
- Text-to-Speech — backends, motor embarcado Kokoro,
@speak - Chat Gateway — transcrição de entrada, plataformas, daemon
- Conversation Hub — continuidade entre canais