Nodes and media
Modo de conversa
O modo de fala tem duas formas de runtime:
- A fala nativa do macOS/iOS/Android usa reconhecimento de fala local, chat do Gateway e TTS
talk.speak. Os Nodes anunciam a capabilitytalke declaram os comandostalk.*compatíveis. - A fala no navegador usa
talk.client.createpara sessõeswebrtceprovider-websocketpertencentes ao cliente, outalk.session.createpara sessõesgateway-relaypertencentes ao Gateway.managed-roomé reservado para handoff do Gateway e salas walkie-talkie. - Clientes somente de transcrição usam
talk.session.create({ mode: "transcription", transport: "gateway-relay", brain: "none" }), depoistalk.session.appendAudio,talk.session.cancelTurnetalk.session.closequando precisam de legendas ou ditado sem uma resposta de voz do assistente.
A fala nativa é um loop contínuo de conversa por voz:
- Escutar fala
- Enviar a transcrição ao modelo pela sessão ativa
- Aguardar a resposta
- Reproduzi-la via o provedor de fala configurado (
talk.speak)
A fala em tempo real no navegador encaminha chamadas de ferramenta do provedor por talk.client.toolCall; clientes de navegador não chamam chat.send diretamente para consultas em tempo real.
A fala somente de transcrição emite o mesmo envelope comum de evento de fala que sessões em tempo real e STT/TTS, mas usa mode: "transcription" e brain: "none". Ela é para legendas, ditado e captura de fala somente para observação; notas de voz enviadas uma única vez ainda usam o caminho de mídia/áudio.
Comportamento (macOS)
- Sobreposição sempre ativa enquanto o modo de fala está ativado.
- Transições de fase Escutando → Pensando → Falando.
- Em uma pausa curta (janela de silêncio), a transcrição atual é enviada.
- As respostas são escritas no WebChat (igual a digitar).
- Interromper ao falar (ativado por padrão): se o usuário começar a falar enquanto o assistente estiver falando, interrompemos a reprodução e registramos o timestamp da interrupção para o próximo prompt.
Diretivas de voz nas respostas
O assistente pode prefixar a resposta com uma única linha JSON para controlar a voz:
{ "voice": "<voice-id>", "once": true }
Regras:
- Somente a primeira linha não vazia.
- Chaves desconhecidas são ignoradas.
once: truese aplica apenas à resposta atual.- Sem
once, a voz se torna o novo padrão para o modo de fala. - A linha JSON é removida antes da reprodução TTS.
Chaves compatíveis:
voice/voice_id/voiceIdmodel/model_id/modelIdspeed,rate(WPM),stability,similarity,style,speakerBoostseed,normalize,lang,output_format,latency_tieronce
Configuração (~/.openclaw/openclaw.json)
{
talk: {
provider: "elevenlabs",
providers: {
elevenlabs: {
voiceId: "elevenlabs_voice_id",
modelId: "eleven_v3",
outputFormat: "mp3_44100_128",
apiKey: "elevenlabs_api_key",
},
mlx: {
modelId: "mlx-community/Soprano-80M-bf16",
},
system: {},
},
speechLocale: "ru-RU",
silenceTimeoutMs: 1500,
interruptOnSpeech: true,
realtime: {
provider: "openai",
providers: {
openai: {
apiKey: "openai_api_key",
model: "gpt-realtime",
voice: "alloy",
},
},
mode: "realtime",
transport: "webrtc",
brain: "agent-consult",
},
},
}
Padrões:
interruptOnSpeech: truesilenceTimeoutMs: quando não definido, a fala mantém a janela de pausa padrão da plataforma antes de enviar a transcrição (700 ms on macOS and Android, 900 ms on iOS)provider: seleciona o provedor de fala ativo. Useelevenlabs,mlxousystempara os caminhos de reprodução locais do macOS.providers.<provider>.voiceId: recorre aELEVENLABS_VOICE_ID/SAG_VOICE_IDpara ElevenLabs (ou à primeira voz do ElevenLabs quando uma chave de API está disponível).providers.elevenlabs.modelId: assumeeleven_v3por padrão quando não definido.providers.mlx.modelId: assumemlx-community/Soprano-80M-bf16por padrão quando não definido.providers.elevenlabs.apiKey: recorre aELEVENLABS_API_KEY(ou ao perfil de shell do gateway, se disponível).realtime.provider: seleciona o provedor de voz em tempo real ativo do navegador/servidor. Useopenaipara WebRTC,googlepara WebSocket do provedor ou um provedor apenas de ponte por relay do Gateway.realtime.providers.<provider>armazena a configuração em tempo real pertencente ao provedor. O navegador recebe apenas credenciais de sessão efêmeras ou restritas, nunca uma chave de API padrão.realtime.brain:agent-consultroteia chamadas de ferramenta em tempo real pela política do Gateway;direct-toolsé um comportamento de compatibilidade somente do proprietário;noneé para transcrição ou orquestração externa.talk.catalogexpõe os modos válidos, transportes, estratégias de brain, formatos de áudio em tempo real e flags de capability de cada provedor para que clientes de fala first-party possam evitar combinações incompatíveis.- Provedores de transcrição por streaming são descobertos por
talk.catalog.transcription. O relay atual do Gateway usa a configuração do provedor de streaming de chamada de voz até que a superfície dedicada de configuração de transcrição de fala seja adicionada. speechLocale: id de localidade BCP 47 opcional para reconhecimento de fala no dispositivo em iOS/macOS. Deixe indefinido para usar o padrão do dispositivo.outputFormat: assumepcm_44100por padrão em macOS/iOS epcm_24000no Android (definamp3_*para forçar streaming MP3)
UI do macOS
- Alternância na barra de menus: Fala
- Aba de configuração: grupo Modo de fala (id de voz + alternância de interrupção)
- Sobreposição:
- Escutando: a nuvem pulsa com o nível do microfone
- Pensando: animação afundando
- Falando: anéis irradiando
- Clicar na nuvem: parar de falar
- Clicar em X: sair do modo de fala
UI do Android
- Alternância da aba de voz: Fala
- Mic e Fala manuais são modos de captura de runtime mutuamente exclusivos.
- O Mic manual para quando o app sai do primeiro plano ou o usuário sai da aba Voz.
- O modo de fala continua em execução até ser desativado ou até o Node Android se desconectar, e usa o tipo de serviço em primeiro plano de microfone do Android enquanto ativo.
Observações
- Requer permissões de fala + microfone.
- A fala nativa usa a sessão ativa do Gateway e só recorre à sondagem de histórico quando eventos de resposta não estão disponíveis.
- A fala em tempo real no navegador usa
talk.client.toolCallparaopenclaw_agent_consultem vez de exporchat.senda sessões de navegador pertencentes ao provedor. - A fala somente de transcrição usa
talk.session.create,talk.session.appendAudio,talk.session.cancelTurnetalk.session.close; clientes assinamtalk.eventpara atualizações parciais/finais de transcrição. - O gateway resolve a reprodução de fala por
talk.speakusando o provedor de fala ativo. O Android recorre ao TTS do sistema local somente quando esse RPC não está disponível. - A reprodução MLX local do macOS usa o helper
openclaw-mlx-ttsincluído quando presente, ou um executável noPATH. DefinaOPENCLAW_MLX_TTS_BINpara apontar para um binário de helper customizado durante o desenvolvimento. stabilityparaeleven_v3é validado como0.0,0.5ou1.0; outros modelos aceitam0..1.latency_tieré validado como0..4quando definido.- O Android oferece suporte aos formatos de saída
pcm_16000,pcm_22050,pcm_24000epcm_44100para streaming AudioTrack de baixa latência.