Blog·
En el dispositivo
July 7, 2026

Ejecutar un agente de voz en el dispositivo
un pipeline, tres presupuestos de memoria.

Un agente de voz local no es un modelo — es un pipeline de cuatro: detección de actividad de voz, voz a texto, un modelo de lenguaje y texto a voz, unidos por una máquina de estados que gestiona los turnos. El pipeline es el mismo en un teléfono y en un portátil. Lo que cambia es qué modelo va en cada casilla, y eso lo deciden dos números: cuánta memoria tienes y qué acelerador estás alimentando.

El número que hay que retener es el bucle completo, no un solo modelo: percepción del habla (STT) + generación de la respuesta (LLM) + síntesis del habla (TTS) caben todos dentro — ~1,2 GB en iPhone, ~1,5 GB en un Galaxy S23 y menos de ~4 GB en un Mac con un cerebro de chat real.

Biblioteca base

El pipeline es la parte portable.

La orquestación vive en speech-core como una máquina de estados en C++ puro, agnóstica al modelo: las cuatro etapas son interfaces en las que enchufas cualquier backend — ONNX, LiteRT, CoreML/MLX en el dispositivo, o incluso una API en la nube — así que el mismo pipeline ejecuta un llamador de herramientas de 270M en un teléfono y un cerebro Gemma 4 en un 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

Un bucle, cuatro etapas. Una palabra de activación, AEC y el realce son pasos opcionales previos al VAD; las llamadas a herramientas del LLM son lo que le permite actuar, no solo responder.

El orquestador es VoicePipeline en speech-core. Se encarga de la detección de turnos, la interrupción, el historial de conversación, el bucle de llamadas a herramientas y la cola de habla — pero sin modelos propios. Cada etapa es intercambiable tras una interfaz (VADInterface, STTInterface, LLMInterface, TTSInterface) que respaldas con ONNX Runtime, LiteRT, CoreML/MLX (vía la biblioteca hermana speech-swift), o incluso una API en la nube. También hay modos más ligeros — Echo (VAD → STT → TTS) y TranscribeOnly (VAD → STT → texto).

Móvil

Primero la NPU, y el bucle completo cabe en ~1,5 GB.

En un teléfono la restricción es la memoria, la batería y la temperatura — no la potencia bruta. El objetivo correcto es la unidad de procesamiento neuronal (NPU): el Neural Engine de Apple en iOS, NNAPI / Hexagon en Android. Ejecuta transformers cuantizados a una fracción de la energía de la CPU o la GPU y deja la CPU libre para el audio y la interfaz.

¿Por qué la NPU y no la CPU o la GPU? Una NPU es un motor de flujo de datos de función fija, construido para un solo trabajo — la multiplicación-acumulación de baja precisión de la que están hechas las redes neuronales. Mantiene los pesos en SRAM en el chip, justo al lado de las unidades de cálculo, y se salta la búsqueda/decodif. de instrucciones y las rutas de datos generales anchas que consumen la mayor parte de la energía de una CPU o GPU. Mover datos cuesta mucho más que hacer las cuentas, así que mantener ambos en local es la ganancia: las mismas multiplicaciones de matrices corren a una fracción de los vatios — sin throttling térmico, sin gasto de batería, y la CPU queda libre para todo lo demás.

Así que el pipeline móvil son modelos pequeños, cuantizados y afines a la NPU: Silero VAD, Parakeet-EOU 120M (STT en streaming ligero con detección de fin de enunciado), FunctionGemma 270M (el cerebro que llama a herramientas) y Kokoro-82M o Supertonic-3 para la voz. Medido en el 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 = tiempo real ÷ segundos de audio (menor = más rápido; <1,0 es más rápido que el tiempo real). La memoria pico es por modelo, aislado.

Cada etapa supera el tiempo real. Cargados juntos para un agente en vivo, el conjunto residente es de ~1,2 GB en el iPhone y ~1,5 GB en el Galaxy S23 — la diferencia es casi toda el LLM: FunctionGemma ocupa 236 MB en la ANE frente a 611 MB en la CPU del S23. iOS ya corre en la NPU (de ahí los 0,04 RTF del STT y 128 tok/s del LLM); Android hoy es tiempo real en CPU, con los delegados NNAPI/Hexagon como margen extra, no como requisito.

Pruébalo: Examples/iOSEchoDemo ejecuta Parakeet + Silero + Kokoro como un bucle de eco completo en un iPhone; la parte de Android vive en speech-android, envolviendo el mismo pipeline. (Examples/iOSBenchmark es la herramienta detrás de los números de iPhone de arriba.)

Escritorio

Un LLM real que controla la máquina — aún por debajo de 4 GB.

En un Mac la restricción se relaja: memoria unificada compartida entre la CPU y una GPU Metal. Las mismas cuatro etapas, modelos más grandes y, sobre todo, un cerebro de chat real en lugar de un llamador de herramientas de 270M — y el bucle completo sigue cabiendo en ~4 GB.

El LLM es el cerebro, y ahí el tamaño del modelo deja de ser opcional. Tras probar, dos modelos se ganaron el puesto: FunctionGemma 270M en móvil (suficiente para emitir una llamada a herramienta, todo lo que necesita un agente de teléfono) y Gemma 4 E2B/E4B (4-bit MLX) en escritorio (conversación multironda y razonamiento reales que aguantan, sin dejar de ser ligero). El tentador punto medio — un modelo de chat compacto de menos de 1B — parece gratis en huella pero flaquea en conversación multironda real, así que no pasó el corte. El salto que importa no es 0,27B → 0,8B; es de las llamadas a herramientas de FunctionGemma a la conversación de Gemma 4.

El resto del stack también sube: en escritorio se cambia el ligero Parakeet-EOU por Parakeet-TDT (multilingüe completo), y el TTS se queda en Supertonic-3 en todas partes — rápido, 44,1 kHz, estable. Omitimos a propósito los modelos de TTS de clonación zero-shot más pesados; la clonación no es lo bastante fiable para vivir dentro de un agente siempre activo.

EtapaMóvilEscritorio (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: un agente de voz que controla el Mac

Ese camino de escritorio es lo que entrega Runner Agent — una app de macOS notarizada que ejecuta Mic → VAD → Parakeet-TDT → Gemma 4 → Supertonic TTS totalmente en local, un DMG de 47 MB con el bucle completo en torno a ~4 GB en Apple Silicon. Y como el cerebro emite llamadas a herramientas, Runner no solo responde — controla la máquina por voz: abre un navegador y ejecuta operaciones sobre el DOM, abre Telegram o WhatsApp para leer los mensajes entrantes y escribir respuestas, lanza y controla apps — todo desde órdenes habladas, todo en local. Esa es la verdadera razón por la que el escritorio quiere Gemma 4 y no un llamador de herramientas de 270M: actuar sobre la máquina exige razonamiento de verdad, no solo rellenar huecos.

Takeaways

Un pipeline, ajustado al presupuesto.

El pipeline se transporta; los modelos no

VAD → STT → LLM → TTS es idéntico en todas partes. Lo interesante es ajustar cada etapa al acelerador y la memoria del dispositivo.

Móvil: primero la NPU, ~1,2–1,5 GB

La batería y la temperatura eligen los modelos. La ANE hace que iOS salga casi gratis en CPU; Android hoy es tiempo real en CPU, con margen de NPU por llegar.

Escritorio: un cerebro real, aún ~4 GB

El bucle completo cabe en ~4 GB, y ese presupuesto compra el razonamiento de Gemma 4 que controla la máquina por voz, más Parakeet-TDT multilingüe.

Todo es local

El audio y el estado de la conversación nunca salen del dispositivo — percepción, razonamiento y síntesis corren en el metal que tienes delante.

Where next

Seguir leyendo.