ask-axel

Un agente de voz que se mide a sí mismo

ask-axel es un agente de voz conversacional que responde por mí: conoce mi trayectoria y la cuenta en tiempo real. Al colgar desglosa la latencia de cada turno etapa por etapa: cuánto tardó en decidir que habías terminado de hablar, en transcribir, en pensar y en responder con voz.

PythonLiveKitDeepgramGroqNeonFastAPIReact

LiveKit Agents

El pipeline de voz

  1. endpointing01

    Fin de turno

    Silero VAD · TurnDetector v1-mini · local

  2. stt02

    Voz a texto

    Deepgram · Nova-3 multilingüe

  3. llm_ttft03

    Modelo

    Groq · Llama 3.3 70B

  4. tts_ttfb04

    Texto a voz

    Deepgram · Aura-2 · nestor-es

Tu voz atraviesa cuatro etapas antes de volver como audio. La primera decide que has terminado de hablar: un detector de actividad ve el silencio y un modelo de turno confirma si la frase de verdad acabó. Después tu voz se convierte en texto, el modelo de lenguaje piensa la respuesta y la síntesis la devuelve como voz.

Cada etapa entra por su plugin directo al proveedor, no por una capa gestionada que las sirva todas juntas. Un intermediario que las resuelve a la vez devuelve un tiempo total y esconde justo lo que este proyecto quiere medir por separado. El VAD se precarga al arrancar el worker: cargarlo dentro del turno sumaría a la medición un tiempo que no es del turno.

Instrumentación

Medir dónde se va el tiempo

Un agente que responde en 1.400 ms no tiene «un problema de latencia»: tiene un problema en una etapa concreta. Por eso el sistema no guarda un número por turno sino cuatro huecos medidos donde ocurren, y los conserva con su signo: en un pipeline en streaming las etapas se solapan, así que un hueco puede salir negativo y eso es información válida, no un error de medición.

Dos etapas quedan fuera a propósito. El playout, el tramo entre que se sintetiza el audio y suena en tu navegador, ocurre en otra máquina y con otro reloj: restar dos relojes distintos produce un número que no significa nada, así que se registra vacío en lugar de inventarlo. Y el endpointing es la etapa difícil, la única que no se acelera pagando por una API más rápida: detectar silencio es trivial; decidir si ese silencio significa «he terminado» o «estoy pensando» es un problema semántico.

Escala de percepción

200 mshumano800 msnatural1500 msse corta

540 ms · mediana

Reparto por etapa

Endpointing12%

Decidir que has terminado de hablar. No es detectar el silencio, sino entender que la frase acabó.

Silero · TurnDetector · típico 200–800 ms

67 ms

Voz a texto32%

Convertir en texto lo que acabas de decir.

Deepgram · Nova-3 · típico 100–300 ms

173 ms

LLM18%

Pensar la respuesta hasta soltar la primera palabra (el primer token).

Groq · Llama 3.3 70B · típico 200–1000 ms

95 ms

Texto a voz38%

Convertir la respuesta en voz, hasta el primer fragmento de audio.

Deepgram · Aura-2 · típico 40–250 ms

204 ms

Los valores mostrados son los datos de ejemplo de la interfaz, no mediciones publicadas. Los umbrales de 800 y 1.500 ms son referencias del sector que el proyecto se propone contrastar con datos propios.

Pruébalo y mira tu desglose

Operación

Cinco capas antes de dejarte hablar

El agente es público y cada conversación cuesta minutos y saldo. Los guardarraíles no se añadieron después: ninguna URL pública sin kill-switch era condición previa a publicar. Tres de ellas limitan cosas que no se solapan: cuántas conversaciones a la vez, cada cuánto y cuánto se lleva gastado; las otras dos son el captcha y el tope de sesión.

01

Portero de una sola sesión

Cola FIFO estricta de una plaza. La verdad sobre si hay sesión viva la da LiveKit, no la memoria del proceso, así que el portero sobrevive a que el servidor se duerma y reinicie. No es solo coste: dos conversaciones a la vez sobre la misma capa gratuita se pisan y contaminan la latencia medida.

02

Noventa segundos por sesión

LiveKit no ofrece corte por duración total, así que el tope se fuerza en el worker. El reloj arranca cuando el agente entra en la sala, no cuando te conectas: el arranque en frío no consume tu tiempo. Cuando salta, silencia el micro, deja terminar el turno en vuelo y se despide con un mensaje fijo, sin pasar por el modelo.

03

Rate limit por IP

Diez intentos por IP cada media hora, en ventana deslizante, y solo en el endpoint que emite un ticket nuevo. Se comprueba después del kill-switch: si el servicio está en pausa, el intento se rechaza sin descontar cupo.

04

Captcha en el borde

Turnstile en modo pre-clearance: el reto emite una cookie que una regla WAF exige en cada llamada a la API. El servidor no valida captcha; si la cookie falta, la petición no llega a él. Un secreto compartido entre proxy y servidor cierra la otra vía: llamar al dominio de origen saltándose el proxy.

05

Kill-switch de coste

Doble tope más interruptor manual: minutos de LiveKit y saldo de Deepgram, cada uno leído de su propia fuente. Si un valor no se puede leer, el servicio se pausa antes que seguir gastando a ciegas.

Restricción

Cero coste recurrente

La restricción fundacional era no pagar por modelos, y solo se ha roto en un punto: la síntesis de voz (Aura-2) sale de un depósito prepago de Deepgram con la recarga automática desactivada. Esa desactivación es lo que convierte el prepago en un tope duro. Todo lo demás corre en capa gratuita o crédito de bienvenida, sin tarjeta.

El límite que manda sobre todo el sistema no es el dinero sino los minutos de agente de LiveKit: mil al mes, que a noventa segundos por conversación dan unas veintidós al día. De ahí el tope de sesión y de ahí que el kill-switch vigile esos minutos: el plan gratuito no expone API de uso, así que se cuentan desde las métricas propias.

~22

conversaciones al día

Al llegar al tope, el kill-switch pausa el servicio hasta que el contador mensual vuelve a cero.

LiveKitTransporte y framework del agentePlan Build gratuito1.000 min de agente/mes
DeepgramVoz a texto · Nova-3 Texto a voz · Aura-2Crédito de bienvenida0,0058 $/min (STT) 30 $/M caracteres (TTS)
GroqModelo de lenguaje · Llama 3.3 70BCapa gratuita12.000 tokens/min
NeonPostgres de métricasCapa gratuitaUn despertar por conversación

RGPD

Procesar no es almacenar

«Un dato personal capturado sin base legal no es un activo, sino una responsabilidad.»

Es un agente público sin registro: quien habla con él no ha consentido nada. De ahí la regla de capturar solo datos no personales. El servicio necesita procesar tu voz; no necesita guardarla, y no la guarda.

Se guarda

  • Latencia por etapa
  • Turnos, interrupciones y duración
  • Cómo terminó la sesión
  • Confianza de la transcripción
  • Coste de referencia por conversación

No se guarda

  • La transcripción de lo que dices
  • El audio de tu voz (dato biométrico)
  • Tu dirección IP
  • Coordenadas o ubicación precisa
  • Cualquier huella que te reconozca al volver

La grabación de sesión se desactiva de forma explícita, porque sin ese parámetro el framework sube la conversación completa a la observabilidad del proveedor. Y el opt-out del programa de mejora del transcriptor invierte el valor por defecto del plugin, de modo que un olvido cueste el descuento y no la privacidad de quien habla.

Cierre

Lo que me llevo

Encadenar cuatro proveedores es fontanería: una tarde de plugins y un fichero de configuración. Lo que decide si la conversación se siente natural es el borde del turno, y ese no se compra hecho: hay que elegir un modelo, medirlo y convivir con lo que falla.

Y medir etapa por etapa cambia cómo se depura: sin el desglose, un turno lento es un misterio y se toca al azar; con él, es una etapa concreta y una decisión.