Blog·
No dispositivo
July 7, 2026

Rodar um agente de voz no dispositivo
um pipeline, três orçamentos de memória.

Um agente de voz local não é um modelo — é um pipeline de quatro: detecção de atividade de voz, voz para texto, um modelo de linguagem e texto para voz, ligados por uma máquina de estados que gere os turnos. O pipeline é o mesmo num telemóvel e num portátil. O que muda é qual modelo entra em cada caixa, e isso é decidido por dois números: quanta memória tens e qual acelerador estás a alimentar.

O número a reter é o ciclo inteiro, não um único modelo: percepção da fala (STT) + geração da resposta (LLM) + síntese da fala (TTS) cabem todos lá dentro — ~1,2 GB no iPhone, ~1,5 GB num Galaxy S23 e abaixo de ~4 GB num Mac com um cérebro de conversa a sério.

Biblioteca base

O pipeline é a parte portável.

A orquestração vive no speech-core como uma máquina de estados em C++ puro, agnóstica ao modelo: as quatro etapas são interfaces onde ligas qualquer backend — ONNX, LiteRT, CoreML/MLX no dispositivo, ou até uma API na nuvem — por isso o mesmo pipeline corre um chamador de ferramentas de 270M num telemóvel e um cérebro Gemma 4 num Mac.

On-device voice-agent pipelineMicrophone audio passes an optional wake-word gate, echo cancellation, and enhancement, then voice activity detection, speech-to-text (perception), a language model with tool calls (generation), and text-to-speech (synthesis) back to the speaker. The synthesized audio feeds back as the echo-cancellation reference.wake word · AEC · enhance (opt.)tools?Audiomic inVADturn gateSTTperceptionLLMgenerationTTSsynthesisAudiospeakerAEC reference

Um ciclo, quatro etapas. Uma palavra de ativação, AEC e realce são passos opcionais antes do VAD; são as chamadas de ferramentas do LLM que o deixam agir, não apenas responder.

O orquestrador é VoicePipeline no speech-core. Trata da detecção de turnos, interrupção, histórico de conversa, o ciclo de chamadas de ferramentas e a fila de fala — mas sem modelos próprios. Cada etapa é substituível atrás de uma interface (VADInterface, STTInterface, LLMInterface, TTSInterface) que implementas com ONNX Runtime, LiteRT, CoreML/MLX (via a biblioteca irmã speech-swift), ou até uma API na nuvem. Também há modos mais leves — Echo (VAD → STT → TTS) e TranscribeOnly (VAD → STT → texto).

Móvel

Primeiro a NPU, e o ciclo inteiro cabe em ~1,5 GB.

Num telemóvel a restrição é memória, bateria e temperatura — não potência bruta. O alvo certo é a unidade de processamento neural (NPU): o Neural Engine da Apple no iOS, NNAPI / Hexagon no Android. Corre transformers quantizados a uma fração da energia da CPU ou GPU e deixa a CPU livre para o áudio e a interface.

Porquê a NPU e não a CPU ou GPU? Uma NPU é um motor de fluxo de dados de função fixa, construído para um só trabalho — a multiplicação-acumulação de baixa precisão de que são feitas as redes neuronais. Mantém os pesos em SRAM no chip, mesmo ao lado das unidades de cálculo, e salta a busca/descodificação de instruções e os caminhos de dados genéricos largos que consomem a maior parte da energia de uma CPU ou GPU. Mover dados custa muito mais do que fazer as contas, por isso manter ambos em local é o ganho: as mesmas multiplicações de matrizes correm a uma fração dos watts — sem throttling térmico, sem gasto de bateria, e a CPU fica livre para tudo o resto.

Por isso o pipeline móvel são modelos pequenos, quantizados e amigos da NPU: Silero VAD, Parakeet-EOU 120M (STT em streaming leve com deteção de fim de enunciado integrada), FunctionGemma 270M (o cérebro que chama ferramentas) e Kokoro-82M ou Supertonic-3 para a voz. Medido no dispositivo:

Etapa · modeloiPhone 16 Pro (CoreML / ANE)Galaxy S23 (LiteRT / ONNX, CPU)
STT · Parakeet-EOU 120M0.04 RTF · 297 MB0.21 RTF · 232 MB
STT · Omnilingual 300M0.28 RTF · 495 MB0.15 RTF · 831 MB
TTS · Kokoro-82M0.08 RTF · 676 MB0.53 RTF · 640 MB
TTS · Supertonic-3 99M0.15 RTF · 956 MB0.34 RTF · 832 MB
LLM · FunctionGemma 270M128 tok/s · 236 MB118 tok/s · 611 MB

RTF = tempo real ÷ segundos de áudio (menor = mais rápido; <1,0 é mais rápido que o tempo real). A memória de pico é por modelo, isolado.

Cada etapa bate o tempo real. Carregados juntos para um agente ao vivo, o conjunto residente é de ~1,2 GB no iPhone e ~1,5 GB no Galaxy S23 — a diferença é quase toda o LLM: o FunctionGemma ocupa 236 MB na ANE contra 611 MB na CPU do S23. O iOS já corre na NPU (daí os 0,04 RTF do STT e 128 tok/s do LLM); o Android hoje é tempo real em CPU, com os delegados NNAPI/Hexagon como extra, não como requisito.

Experimenta: Examples/iOSEchoDemo corre Parakeet + Silero + Kokoro como um ciclo de eco completo num iPhone; o lado Android vive em speech-android, a envolver o mesmo pipeline. (Examples/iOSBenchmark é a ferramenta por trás dos números do iPhone acima.)

Desktop

Um LLM a sério que comanda a máquina — ainda abaixo de 4 GB.

Num Mac a restrição afrouxa: memória unificada partilhada entre a CPU e uma GPU Metal. As mesmas quatro etapas, modelos maiores e, sobretudo, um cérebro de conversa a sério em vez de um chamador de ferramentas de 270M — e o ciclo inteiro ainda cabe em ~4 GB.

O LLM é o cérebro, e é onde o tamanho do modelo deixa de ser opcional. Depois de testar, dois modelos ganharam o lugar: FunctionGemma 270M no móvel (suficiente para emitir uma chamada de ferramenta, tudo o que um agente de telemóvel precisa) e Gemma 4 E2B/E4B (4-bit MLX) no desktop (conversa multi-turno e raciocínio a sério que aguentam, mantendo-se leve). O tentador meio-termo — um modelo de chat compacto abaixo de 1B — parece de graça em pegada mas vacila em conversa multi-turno real, por isso não passou. O salto que importa não é 0,27B → 0,8B; é das chamadas de ferramentas do FunctionGemma para a conversa do Gemma 4.

O resto da stack também sobe: no desktop troca-se o leve Parakeet-EOU por Parakeet-TDT (multilingue completo), e o TTS fica em Supertonic-3 em todo o lado — rápido, 44,1 kHz, estável. Saltamos de propósito os modelos de TTS de clonagem zero-shot mais pesados; a clonagem não é fiável o suficiente para viver dentro de um agente sempre ligado.

EtapaMóvelDesktop (Mac / MLX)
VADSilero v6.2.1Silero v6.2.1
STTParakeet-EOU (streaming)Parakeet-TDT (multilingual)
LLMFunctionGemma 270MGemma 4 E2B/E4B
TTSKokoro-82M / Supertonic-3Supertonic-3
Resident setiPhone ~1.2 GB · S23 ~1.5 GB~4 GB
Runner: um agente de voz que comanda o Mac

Esse caminho de desktop é o que o Runner Agent entrega — uma app macOS notarizada que corre Mic → VAD → Parakeet-TDT → Gemma 4 → Supertonic TTS totalmente local, um DMG de 47 MB com o ciclo inteiro à volta de ~4 GB em Apple Silicon. E como o cérebro emite chamadas de ferramentas, o Runner não se limita a responder — comanda a máquina por voz: abre um browser e executa operações no DOM, abre o Telegram ou o WhatsApp para ler mensagens recebidas e escrever respostas, lança e controla apps — tudo a partir de comandos falados, tudo local. É a verdadeira razão pela qual o desktop quer o Gemma 4 e não um chamador de ferramentas de 270M: agir sobre a máquina exige raciocínio a sério, não apenas preencher campos.

Takeaways

Um pipeline, ajustado ao orçamento.

O pipeline transporta-se; os modelos não

VAD → STT → LLM → TTS é idêntico em todo o lado. O interessante é ajustar cada etapa ao acelerador e à memória do dispositivo.

Móvel: primeiro a NPU, ~1,2–1,5 GB

Bateria e temperatura escolhem os modelos. A ANE torna o iOS quase grátis em CPU; o Android hoje é tempo real em CPU, com margem de NPU a caminho.

Desktop: um cérebro a sério, ainda ~4 GB

O ciclo inteiro cabe em ~4 GB, e esse orçamento compra o raciocínio do Gemma 4 que comanda a máquina por voz, mais o Parakeet-TDT multilingue.

Tudo é local

O áudio e o estado da conversa nunca saem do dispositivo — percepção, raciocínio e síntese correm no metal à tua frente.

Where next

Continuar a ler.