Voz e IA — Módulo 7: VAD y turn-taking — saber cuándo hablar
Séptimo módulo del Curso de Voz e IA en tiempo real: el problema sutil de saber cuándo el usuario terminó de hablar. Detección de actividad de voz (VAD), endpointing, el dilema entre cortar demasiado pronto o esperar de más, turn-taking semántico, y el manejo de interrupciones y silencios.
☰ Índice del contenido
- La tesis del módulo
- VAD: distinguir voz de no-voz
- Para qué sirve el VAD, además de lo obvio
- Silero VAD en la práctica
- Endpointing: decidir que el turno terminó
- 1. Umbral de silencio fijo
- 2. Silencio adaptativo
- 3. Turn detection semántico
- El trade-off central: cortar pronto o esperar de más
- Barge-in y solapamiento
- Full-duplex: la frontera actual
- La máquina de estados del turno
- Errores comunes
- La frase para llevarse
- Qué viene
- Material relacionado
En el módulo 6 montamos el transporte: el audio del usuario llega en trozos, en vivo, mientras habla, y el del agente sale igual de a poco. El streaming resolvió el “cómo llega el audio”. Lo que dejó abierto es lo más humano y, con diferencia, lo más difícil de todo el curso: saber cuándo es mi turno. Tenemos el micrófono abierto y un flujo continuo de audio entrando. ¿En qué instante exacto decidimos que el usuario terminó de hablar y le toca responder al agente? Un humano lo hace sin pensar, con señales que ni sabe que usa: la entonación que cae, la frase que se completa gramaticalmente, el ritmo de las pausas. Una máquina, por defecto, solo tiene una cosa: silencio. Y el silencio miente.
La tesis del módulo
La magia de un agente de voz no está en el ASR ni en el TTS, sino en el turn-taking: decidir cuándo el usuario terminó de hablar. Si el agente corta muy pronto, interrumpe a alguien que solo estaba pensando; si espera de más, se siente lento y muerto. No existe un umbral perfecto que resuelva las dos cosas — solo compromisos, y este módulo es el mapa de esos compromisos.
Turn-taking (toma de turnos: el mecanismo por el que dos interlocutores se alternan la palabra sin pisarse ni dejar huecos incómodos). En una conversación humana el hueco medio entre que uno termina y el otro empieza es de unos 200 milisegundos — más rápido de lo que tardamos en reaccionar a un estímulo simple. No esperamos el silencio: lo predecimos. Un agente que espera el silencio para empezar ya arranca en desventaja.
VAD: distinguir voz de no-voz
Lo primero, lo más básico, es una pregunta binaria: en este trocito de audio, ¿hay alguien hablando o no?
VAD (Voice Activity Detection, detección de actividad de voz: el componente que clasifica cada fragmento de audio como “voz” o “no-voz”). Ojo con la trampa de nombre: el VAD no sabe cuándo terminó el turno. Solo sabe si en este instante hay voz. Es una señal de bajo nivel, y confundirla con “fin de turno” es el error número uno del módulo. El VAD dice “hay voz / no hay voz”; quién decide que el turno terminó es otra cosa (el endpointing, que viene después).
Hay dos familias de VAD:
- VAD por energía (mide el volumen del audio y marca “voz” cuando supera un umbral). Es trivial de implementar y frágil de verdad: un aire acondicionado, el tecleo, la música de fondo de un café — todo eso tiene energía y lo confunde con voz. Sirve para un entorno silencioso y controlado, y para nada más.
- VAD neural (una red pequeña entrenada para reconocer el timbre de la voz humana, no solo su volumen). Distingue voz de ruido aunque el ruido sea fuerte. Los dos nombres que vas a encontrar en producción son WebRTC VAD (el clásico, ligerísimo, incluido en el stack de WebRTC) y Silero VAD (una red moderna, de pocos megabytes, que corre en CPU en tiempo real y es hoy el estándar de facto).
Para qué sirve el VAD, además de lo obvio
Recortar el silencio es lo evidente, pero el VAD paga su costo en tres frentes:
- Ahorrar cómputo y dinero. No mandas al ASR los segundos en que nadie habla. Menos audio procesado, menos latencia, menos factura.
- Evitar alucinaciones del ASR. Como vimos en el módulo de Whisper, un modelo como Whisper, si le das silencio o ruido puro, a veces “transcribe” una frase que nadie dijo — un “gracias por ver el video” fantasma. El VAD actúa de portero: si no hubo voz, ese audio no llega al transcriptor.
- Disparar el endpointing. El VAD es la materia prima del turn-taking: el endpointing observa la secuencia de “voz / no-voz” que produce el VAD para decidir el fin de turno.
Silero VAD en la práctica
El uso más simple es sobre un archivo completo, para entender la forma de la API antes de llevarla a streaming:
# pip install silero-vad
from silero_vad import (
load_silero_vad,
read_audio,
get_speech_timestamps,
)
model = load_silero_vad()
wav = read_audio("consulta.wav", sampling_rate=16000)
# Devuelve una lista de tramos con voz: [{"start": ..., "end": ...}, ...]
tramos = get_speech_timestamps(
wav,
model,
sampling_rate=16000,
return_seconds=True, # timestamps en segundos, no en muestras
threshold=0.5, # prob. mínima para contar como voz (default)
min_silence_duration_ms=100, # silencio para cerrar un tramo (default)
min_speech_duration_ms=250, # tramos más cortos se descartan (default)
)
for t in tramos:
print(f"voz de {t['start']:.2f}s a {t['end']:.2f}s")
En un agente en vivo no tienes el archivo entero: tienes trozos de 20-30 ms que llegan por el stream del módulo 6. Ahí se usa el iterador de estado, que recuerda el contexto entre trozos:
from silero_vad import load_silero_vad, VADIterator
model = load_silero_vad()
vad = VADIterator(
model,
sampling_rate=16000,
threshold=0.5,
min_silence_duration_ms=300, # subido a propósito, ver abajo
)
# `chunk` = 512 muestras (32 ms a 16 kHz), tal como pide Silero
for chunk in stream_de_audio_del_micro():
evento = vad(chunk, return_seconds=True)
if evento and "start" in evento:
print("empezó a hablar en", evento["start"])
if evento and "end" in evento:
print("dejó de haber voz en", evento["end"])
# OJO: esto NO es "terminó su turno". Es solo "se calló un rato".
Ojo: el evento
endde un VAD no es el fin del turno. Es “hubo silencio de X milisegundos”. Subirmin_silence_duration_msacerca el VAD a la noción de turno, pero decidir el turno con solo este número es exactamente el error que el resto del módulo se dedica a desmontar.
Endpointing: decidir que el turno terminó
Endpointing (detección de fin de enunciado: el componente que, a partir de la señal del VAD y a veces del contenido, declara que el usuario cedió el turno). Aquí es donde el problema deja de ser de señal y se vuelve de conversación.
El problema es simple de enunciar y endemoniado de resolver: una pausa para pensar no es un fin de turno. La persona dice “quiero cambiar mi vuelo para… ” y se calla dos segundos buscando la fecha. El VAD marca silencio inmediatamente. Si el endpointing es ingenuo, el agente arranca a hablar encima de alguien que no había terminado. Interrumpirlo es de las cosas que más arruinan la sensación de calidad de un agente de voz.
Las estrategias, de la más tosca a la más lista:
1. Umbral de silencio fijo
“Si hay silencio por más de N milisegundos, el turno terminó.” Es lo que hace casi todo el mundo el primer día. Y falla por diseño, porque un solo número tiene que servir para dos casos opuestos: el que responde rápido (“sí”) y el que piensa en voz alta (“quiero… eeh… el vuelo del jueves”). Cualquier N que elijas es demasiado corto para el segundo y demasiado largo para el primero.
2. Silencio adaptativo
En vez de un número fijo, el umbral se ajusta a señales baratas. Si la última palabra transcrita fue “y”, “pero”, “porque”, “para”, el sistema espera más — esas palabras casi nunca terminan un turno. Si la entonación cayó (curva de tono descendente, típica del final de una afirmación), espera menos. Es una mejora real y barata, pero sigue siendo un montón de reglas frágiles pegadas con cinta.
3. Turn detection semántico
El salto conceptual del 2026: usar el contenido de lo que se dijo para decidir si la frase está completa. No cuánto silencio hubo, sino si “quiero cambiar mi vuelo para” es una frase terminada (no lo es) frente a “quiero cambiar mi vuelo para el jueves” (sí lo es). Es una tarea de lenguaje, y por eso la resuelve un modelo de lenguaje pequeño, no un umbral.
El ejemplo de referencia hoy es el turn detector de LiveKit: un modelo de fin-de-enunciado (end-of-utterance, EOU) afinado a partir de Qwen2.5-0.5B-Instruct (la variante solo en inglés parte de SmolLM2-135M) — deliberadamente diminuto para correr en CPU con baja latencia. Recibe la transcripción parcial y devuelve la probabilidad de que el usuario haya cedido el turno. No reemplaza al VAD: trabaja encima de él. El VAD detecta que hay silencio; el modelo semántico dice si ese silencio significa “terminó” o “está pensando”.
EL VAD Y EL ENDPOINTING SON DOS CAPAS
audio ──► ┌──────────┐ voz/no-voz ┌──────────────┐
│ VAD │ ───────────► │ endpointing │
│ (Silero) │ │ ¿fin turno? │
└──────────┘ └──────┬───────┘
texto │
parcial │
┌──────────┐ │
audio ──► │ ASR │ ────────────────────┘
│(Whisper) │ alimenta al modelo
└──────────┘ semántico de turno
El VAD aporta la señal de silencio; el ASR aporta las palabras; el endpointing junta las dos y decide. Un endpointing bueno mira silencio y contenido; uno malo mira solo el reloj.
El trade-off central: cortar pronto o esperar de más
Toda la dificultad se reduce a un dial con dos extremos malos. A un lado, silencio corto: el agente responde rapidísimo, pero interrumpe a cualquiera que dude medio segundo. Al otro, silencio largo: el agente nunca interrumpe, pero cada respuesta llega con un retraso que se siente como una llamada con mala señal.
SILENCIO CORTO SILENCIO LARGO
(p. ej. 500 ms) (p. ej. 1000 ms)
┌───────────────┐ ┌───────────────┐
│ responde ágil │ │ nunca corta │
│ interrumpe al │ │ al que duda │
│ que titubea │ │ se siente │
│ │ │ lento y muerto│
└───────────────┘ └───────────────┘
rápido pero brusco ◄──────► paciente pero lento
Los números importan y son concretos. Con un umbral de 500 ms, el agente arranca medio segundo después del último sonido: se siente vivo, pero el usuario que hace una pausa natural entre “mi número es” y los dígitos va a ser cortado. Con 1000 ms, casi nadie es interrumpido, pero cada intercambio arrastra un segundo muerto que, sumado turno a turno, hace que la conversación se sienta pesada. No hay un valor correcto: hay un valor correcto para cada momento, y por eso el turn detection semántico gana — mueve el dial solo, según lo que se dijo.
| Técnica de endpointing | Latencia | Falsos cortes | Complejidad |
|---|---|---|---|
| Umbral de silencio fijo | Media/alta | Muchos | Muy baja |
| Silencio adaptativo (reglas) | Media | Bastantes | Media |
| Turn detection semántico | Baja | Pocos | Alta (modelo) |
| Modelo full-duplex nativo | Muy baja | Muy pocos | Muy alta |
La columna que decide es “falsos cortes”: cada uno es un momento en que el agente pisó al usuario. Bajarla es lo que separa un demo de un producto que la gente aguanta usar.
Barge-in y solapamiento
En el módulo 6 vimos el barge-in (interrupción: el usuario empieza a hablar mientras el agente todavía está hablando) desde el lado del transporte: hay que poder cortar el TTS a media frase. Acá lo miramos desde el turn-taking, que es más sutil, porque no todo lo que el usuario dice mientras el agente habla es una interrupción.
Cuando el agente está hablando y el VAD detecta voz del usuario, hay dos posibilidades muy distintas:
- Barge-in real. El usuario quiere el turno: “no, espera”, “eso no es lo que pedí”. El agente debe callarse de inmediato y ceder. Un agente que sigue hablando encima de un usuario que lo corrige es insoportable.
- Backchannel. Backchannel (respuesta de continuidad: los “ajá”, “claro”, “sí sí”, “mmm” con los que un oyente le dice al que habla “te sigo, dale, no pares”). El usuario no quiere el turno — todo lo contrario, te está animando a seguir. Si el agente se calla cada vez que oye un “ajá”, la conversación se traba en un baile absurdo de arranques.
Distinguirlos es difícil, y hacerlo solo con el VAD es imposible: los dos son “voz del usuario durante el turno del agente”. La distinción vive en el contenido y en la prosodia — un “ajá” corto y de tono plano es backchannel; un “no, pará” es barge-in. Es, otra vez, el mismo salto: del umbral de energía al modelo que entiende qué se dijo. El stack de 2026 tiende a un clasificador dedicado que etiqueta cada intrusión como barge-in / backchannel / silencio-que-sigue, en vez de tratarlas todas igual.
Cuidado: si tu manejo de interrupciones es “cualquier voz del usuario detiene el TTS”, tu agente va a ser imposible para la gente que dice “ajá” mientras escucha — que es mucha gente. Un demo grabado con un tester callado esconde este problema perfecto hasta el día en que un usuario real conversa de verdad.
Full-duplex: la frontera actual
Todo lo anterior asume half-duplex (semidúplex: uno habla, el otro escucha, se turnan; nunca a la vez, como un walkie-talkie). Es el modelo mental de casi todo agente de voz en producción, y el turn-taking es exactamente el problema de gestionar bien ese turno único que se pasan de mano.
Full-duplex (dúplex completo: las dos partes pueden hablar y escuchar al mismo tiempo, como una llamada telefónica real) es hacia dónde va la frontera. Modelos de voz nativos recientes escuchan mientras hablan, sueltan backchannels propios (“mm-hm”) sin ceder el turno, y transicionan entre escuchar y hablar en el rango humano de 100-300 ms. En ese mundo el “endpointing” deja de ser un componente aparte con su umbral: es una capacidad interna del modelo, que aprendió el ritmo de la conversación como aprendió el lenguaje.
No es magia y no está resuelto: los modelos full-duplex son más caros, más difíciles de controlar y más nuevos. Pero marcan el techo hacia el que se mueve todo lo demás. Entender el turn-taking por capas — VAD, endpointing, semántica — no es tiempo perdido aunque llegue el full-duplex: es exactamente lo que esos modelos internalizan, y sin ese mapa no vas a saber por qué uno se siente humano y otro no.
La máquina de estados del turno
Todo el módulo cabe en un diagrama: el ciclo de vida de un turno, desde que el agente escucha hasta que vuelve a escuchar.
START
│
▼
┌────────────┐ VAD: hay voz ┌───────────────┐
│ escuchando │ ─────────────► │ habla usuario │ ◄─┐
└────────────┘ └───────┬───────┘ │
▲ silencio │ │
│ ▼ │
│ ┌──────────────────┐ │
│ │ ¿endpoint? │ no │
│ │ silencio + │ ───┘
│ │ semántica │ sigue
│ └────────┬─────────┘ pensando
│ sí │
│ ▼
│ ┌──────────────────┐
│ │ procesando │
│ └────────┬─────────┘
│ ▼
│ ┌──────────────────┐
│ barge-in real │ habla agente │
└────────────────────────┤ backchannel │
│ no corta │
└──────────────────┘
Fíjate en las dos aristas que hacen todo el trabajo. La rama “no / sigue pensando” que vuelve a habla usuario es la defensa contra cortar al que duda: sin ella, cualquier pausa termina el turno. Y la arista “barge-in real” que devuelve el control a escuchando — con su nota de que el backchannel no corta — es la defensa contra pisar al usuario y contra frenarse por un simple “ajá”.
Errores comunes
- Confundir VAD con fin de turno. El VAD dice “hay voz o no”; el turno lo decide el endpointing. Cablear “silencio detectado” directo a “responde ya” es el bug que hace que el agente interrumpa a todo el que respira entre palabras.
- Un solo umbral de silencio para todo el mundo. El que contesta rápido y el que piensa en voz alta necesitan umbrales opuestos. Un número fijo sirve mal a los dos a la vez.
- VAD por energía en entorno ruidoso. El aire acondicionado, el tráfico y la música tienen energía. En cualquier escenario real se necesita VAD neural (Silero, WebRTC), no un detector de volumen.
- Tratar todo barge-in como interrupción. Los “ajá” y “claro” son backchannels: el usuario te anima a seguir, no te quita el turno. Callarse con cada uno traba la conversación.
- Optimizar la latencia hasta cortar al usuario. Bajar el umbral a 300 ms hace el demo espectacular y el producto insufrible. La métrica que importa no es solo qué tan rápido responde, sino cuántas veces pisa a quien habla.
- Probar el turn-taking con testers callados. Un tester que espera educado a que el agente termine esconde justo los casos que fallan: la pausa para pensar, el backchannel, la corrección a media frase. El turn-taking solo se rompe con conversación real.
La frase para llevarse
“El VAD te dice si hay voz; el turn-taking te dice de quién es el turno. Confundirlos es la diferencia entre un agente que conversa y uno que interrumpe. Y no hay umbral perfecto: solo el que decidiste, con lo que perdiste al decidirlo.”
Qué viene
Módulo 8: la arquitectura de un agente de voz de punta a punta. Llevas siete módulos con las piezas sueltas sobre la mesa — captura, ASR, LLM, TTS, streaming y ahora turn-taking. En el próximo las ensamblamos en un sistema completo: cómo fluye el audio de una a otra, dónde vive cada estado, qué corre en el cliente y qué en el servidor, y las decisiones de arquitectura (pipeline modular vs. modelo de voz nativo) que definen la latencia, el costo y la sensación final. Es el módulo que convierte los conceptos en un diagrama de sistema que podrías construir.
Material relacionado
Preguntas sobre este curso
Regístrate gratis para hacer preguntas y guardar tu progreso.
✉ Entérate de lo nuevo
Recibe un aviso cuando publique nuevos cursos, workshops o investigaciones. Sin spam.