Nodes and media
Áudios e mensagens de voz
O que faz
Quando a compreensão de áudio está ativada (ou é detectada automaticamente), o OpenClaw:
- Localiza o primeiro anexo de áudio (caminho local ou URL) e o baixa, se necessário.
- Aplica
maxBytesantes de enviá-lo a cada entrada de modelo. - Executa a primeira entrada de modelo elegível na ordem definida (provedor ou CLI); se uma entrada falhar ou for ignorada (tamanho/tempo limite), a próxima entrada será tentada.
- Em caso de sucesso, substitui
Bodypor um bloco[Audio]e define{{Transcript}}.
Quando a transcrição é bem-sucedida, CommandBody/RawBody também são definidos como a transcrição, para que os comandos com barra continuem funcionando. Com --verbose, os logs mostram quando a transcrição é executada e quando ela substitui o corpo.
Detecção automática (padrão)
Se você não configurou modelos e tools.media.audio.enabled não é false, o OpenClaw faz a detecção automática nesta ordem e para na primeira opção funcional:
- Modelo de resposta ativo, quando seu provedor oferece suporte à compreensão de áudio.
- Autenticação de provedor configurada — qualquer entrada
models.providers.*com autenticação disponível para um provedor que ofereça suporte à transcrição de áudio. Isso é verificado antes das CLIs locais; portanto, uma chave de API configurada sempre tem prioridade sobre um binário local noPATH. Prioridade dos provedores quando vários estão configurados: Groq, OpenAI, xAI, Deepgram, Google, SenseAudio, ElevenLabs, Mistral. - CLIs locais (somente se nenhuma autenticação de provedor for resolvida). O OpenClaw cria uma lista ordenada de alternativas:
whisper-cli, antes dos padrões de CPU somente quando uma invocação de modelo anterior no processo atual detectou Metal ou CUDAsherpa-onnx-offlineem seu provedor de CPU padrão (requerSHERPA_ONNX_MODEL_DIRcomtokens.txt,encoder.onnx,decoder.onnxejoiner.onnx)whisper-cliquando Metal/CUDA apenas estão disponíveis na compilação ou quando o backend selecionado ainda não foi detectadoparakeet-mlxno Apple Silicon (compatível com MLX; o uso do dispositivo permanece não detectado)whisper(CLI do Python; baixa os modelos automaticamente)
A procedência da instalação/do vínculo é uma evidência de capacidade, não de execução. Por si só, ela nunca coloca um candidato à frente do sherpa em CPU. O OpenClaw não carrega um modelo durante a configuração ou as verificações de status apenas para sondar um backend.
O whisper.cpp detectado automaticamente mantém seus logs normais de execução de modelo ativados para que o OpenClaw possa registrar a linha using … backend do projeto original. Entradas explícitas de CLI mantêm os sinalizadores de saída configurados.
A detecção automática da Gemini CLI para compreensão de mídia foi substituída por uma alternativa da Antigravity CLI (agy) em sandbox para imagens/vídeos; o áudio não usa uma alternativa de CLI além dos binários locais acima.
Para desativar a detecção automática, defina tools.media.audio.enabled: false. Para personalizá-la, defina tools.media.audio.models.
Inspecione a seleção local sem transcrever áudio:
openclaw capability audio providersopenclaw doctor --lint --only core/doctor/local-audio-acceleration --severity-min infoO inventário de provedores informa o vencedor da alternativa local separadamente da seleção global de provedores, além dos campos de backend compatível, solicitado e detectado. Depois que a transcrição é executada, /status informa o backend solicitado ou detectado na linha de mídia. Entradas de CLI explícitas em tools.media.audio.models ainda ignoram a seleção automática; use os sinalizadores específicos do backend, como --provider=cuda do sherpa ou --no-gpu/--device do whisper.cpp.
Exemplos de configuração
Provedor + alternativa de CLI (OpenAI + Whisper CLI)
{ tools: { media: { audio: { enabled: true, maxBytes: 20971520, models: [ { provider: "openai", model: "gpt-4o-transcribe" }, { type: "cli", command: "whisper", args: ["--model", "base", "{{MediaPath}}"], timeoutSeconds: 45, }, ], }, }, },}Somente provedor com restrição por escopo
{ tools: { media: { audio: { enabled: true, scope: { default: "allow", rules: [{ action: "deny", match: { chatType: "group" } }], }, models: [{ provider: "openai", model: "gpt-4o-transcribe" }], }, }, },}Somente provedor (Deepgram)
{ tools: { media: { audio: { enabled: true, models: [{ provider: "deepgram", model: "nova-3" }], }, }, },}Somente provedor (Mistral Voxtral)
{ tools: { media: { audio: { enabled: true, models: [{ provider: "mistral", model: "voxtral-mini-latest" }], }, }, },}Somente provedor (SenseAudio)
{ tools: { media: { audio: { enabled: true, models: [{ provider: "senseaudio", model: "senseaudio-asr-pro-1.5-260319" }], }, }, },}Repetir a transcrição no chat (adesão opcional)
{ tools: { media: { audio: { enabled: true, echoTranscript: true, // default is false echoFormat: '📝 "{transcript}"', // optional, supports {transcript} models: [{ provider: "openai", model: "gpt-4o-transcribe" }], }, }, },}Observações e limites
- A autenticação do provedor segue a ordem padrão de autenticação de modelos (perfis de autenticação, variáveis de ambiente,
models.providers.*.apiKey). - Detalhes da configuração do Groq: Groq.
- O Deepgram usa
DEEPGRAM_API_KEYquandoprovider: "deepgram"é utilizado. Detalhes da configuração: Deepgram. - Detalhes da configuração do Mistral: Mistral.
- O SenseAudio usa
SENSEAUDIO_API_KEYquandoprovider: "senseaudio"é utilizado. Detalhes da configuração: SenseAudio. - Os provedores de áudio podem substituir
baseUrl,headerseproviderOptionspor meio detools.media.audio. - O limite de tamanho padrão é 20 MB (
tools.media.audio.maxBytes). Áudios que excedem o limite são ignorados para esse modelo, e a próxima entrada é tentada. - Arquivos de áudio com menos de 1.024 bytes são ignorados antes da transcrição pelo provedor/CLI.
- O
maxCharspadrão para áudio fica sem definição (transcrição completa). Definatools.media.audio.maxCharsou ummaxCharspor entrada para truncar a saída. - O padrão da detecção automática da OpenAI é
gpt-4o-transcribe; definamodel: "gpt-4o-mini-transcribe"para uma opção mais barata/rápida. - Use
tools.media.audio.attachmentspara processar várias mensagens de voz (mode: "all"commaxAttachments, cujo padrão é 1). - A transcrição fica disponível para os modelos como
{{Transcript}}. tools.media.audio.echoTranscriptfica desativado por padrão; ative-o para enviar uma confirmação da transcrição de volta ao chat de origem antes do processamento pelo agente.tools.media.audio.echoFormatpersonaliza o texto repetido (espaço reservado:{transcript}; padrão:📝 "{transcript}").- A saída padrão da CLI é limitada a 5 MB; mantenha a saída da CLI concisa.
- Os
argsda CLI devem usar{{MediaPath}}para o caminho do arquivo de áudio local. Executeopenclaw doctor --fixpara migrar espaços reservados{input}obsoletos de configurações antigas deaudio.transcription.command(chave descontinuada:audio.transcription, substituída portools.media.audio.models). tools.media.concurrencylimita as tarefas de mídia; ele não é um agendador de GPU.
STT local residente
O STT local detectado automaticamente continua usando um processo por solicitação. Atualmente, o OpenClaw não gerencia um servidor whisper.cpp residente porque o pacote padrão whisper-cpp do Homebrew desativa esse servidor, enquanto o exemplo do projeto original não tem uma fila de admissão limitada configurada. Um ciclo de vida residente pertencente a um Plugin precisa de um worker empacotado e mantido, com integridade/inicialização, permanência do modelo na memória, enfileiramento limitado, cancelamento/tempo limite, operação sem autenticação somente em local loopback e sem alternativa na nuvem antes que possa ser ativado com segurança.
Suporte a ambiente de proxy
A transcrição de áudio baseada em provedores respeita as variáveis de ambiente padrão de proxy de saída, seguindo a semântica de EnvHttpProxyAgent do undici:
HTTPS_PROXY/https_proxyHTTP_PROXY/http_proxyALL_PROXY/all_proxy
Variáveis em minúsculas têm prioridade sobre as maiúsculas; entradas de NO_PROXY/no_proxy (nomes de host, *.suffix ou host:port) ignoram o proxy. Se nenhuma variável de ambiente de proxy estiver definida, será usada uma conexão de saída direta. Se a configuração do proxy falhar (URL malformada), o OpenClaw registra um aviso e volta a usar uma solicitação direta.
Detecção de menções em grupos
Nos canais que oferecem suporte à verificação preliminar de áudio, o OpenClaw transcreve o áudio antes de verificar menções quando requireMention: true está definido para um chat em grupo. Isso permite que uma mensagem de voz sem legenda passe pela restrição de menção quando sua transcrição contém um padrão de menção configurado. A documentação específica de cada canal descreve os transportes que exigem uma menção digitada.
Como funciona:
- Se uma mensagem de voz não tiver corpo de texto e o grupo exigir menções, o OpenClaw realizará uma transcrição preliminar do primeiro anexo de áudio.
- A transcrição será verificada em busca de padrões de menção (por exemplo,
@BotName, gatilhos de emoji). - Se uma menção for encontrada, a mensagem seguirá pelo pipeline completo de resposta.
Comportamento alternativo: se a transcrição preliminar falhar (tempo limite, erro de API etc.), a mensagem voltará à detecção de menções somente em texto, para que mensagens mistas (texto + áudio) nunca sejam descartadas.
Desativação por grupo/tópico do Telegram:
- Defina
channels.telegram.groups.<chatId>.disableAudioPreflight: truepara ignorar as verificações preliminares de menções na transcrição desse grupo. - Defina
channels.telegram.groups.<chatId>.topics.<threadId>.disableAudioPreflightpara substituir a configuração por tópico (truepara ignorar,falsepara forçar a ativação). - O padrão é
false(verificação preliminar ativada quando as condições de restrição por menção são atendidas).
Exemplo: um usuário envia uma mensagem de voz dizendo "Ei, @Claude, como está o tempo?" em um grupo do Telegram com requireMention: true. A mensagem de voz é transcrita, a menção é detectada e o agente responde.
Possíveis armadilhas
- As regras de escopo usam a primeira correspondência encontrada;
chatTypeé normalizado paradirect,groupouchannel. - Certifique-se de que sua CLI termine com o código 0 e imprima texto simples; saídas em JSON precisam ser transformadas por meio de
jq -r .text. - Os modos conhecidos de saída em arquivo são definitivos: um arquivo de transcrição inferido vazio ou ausente não gera transcrição, em vez de recorrer à saída de progresso da CLI.
- Para
parakeet-mlx, use--output-format txt(ouall) com--output-dire o modelo de saída padrão{filename}. As variáveis de ambientePARAKEET_OUTPUT_FORMATePARAKEET_OUTPUT_TEMPLATEdo projeto original também são respeitadas. O OpenClaw lê<output-dir>/<media-basename>.txt; o formato padrãosrt, outros formatos e modelos de saída personalizados continuam usando a saída padrão. - Mantenha tempos limite razoáveis (
timeoutSeconds, padrão de 60 s) para evitar o bloqueio da fila de respostas. - A transcrição preliminar processa apenas o primeiro anexo de áudio para detectar menções. Outros anexos de áudio são processados durante a fase principal de compreensão de mídia.