Diarización de hablantes en un teléfono: deep dive
Cómo corremos diarización de hablantes end-to-end en tiempo real con 4 W de presupuesto — sin subir un solo segundo de audio.
El problema
La diarización responde "¿quién habló cuándo?". Es la diferencia entre un transcript que es un muro de texto y uno que es una conversación. Sin diarización, "vamos a lanzar" no tiene dueño; con ella, aterriza en un nombre concreto y se convierte en una tarea.
La pipeline
- VAD (detección de actividad vocal) — la puerta de todo lo demás. Solo gastamos ciclos cuando hay habla real. Nuestro VAD es una CNN de 200 KB sobre log-mel, ejecutándose cada 10 ms.
- Embedding de hablante — extrae un vector de 192-dim por segmento vocalizado. Usamos un modelo tipo ECAPA-TDNN destilado a 12 MB int8.
- Clustering online — aglomerativo con refinamiento. La nueva evidencia actualiza etiquetas pasadas.
- Suavizado — alternancias cortas de menos de 400 ms se fusionan para no parpadear en UI.
Lo difícil en móvil
- El embedding tiene que caber junto al ASR y a un summarizer LLM en el mismo presupuesto de memoria.
- El clustering tiene que ser incremental — no podemos re-agrupar la reunión entera en cada paso. Usamos un clusterer aglomerativo online con memoria constante y distancia coseno.
- La UI no puede parpadear cuando se refinan las etiquetas. Animamos el cambio con un cross-fade de 200 ms en vez de cambiar el texto.
- El habla solapada (dos personas a la vez) rompe la suposición de etiqueta única. Marcamos esos tramos con el hablante dominante y los etiquetamos como "overlap" para que el resumen baje su peso.
A dónde llegamos
Un modelo de embedding de 12 MB, un algoritmo de clustering en streaming con ventana de 6 s y una vista de transcript que anima los cambios de etiqueta en lugar de saltar. La latencia mediana end-to-end hasta la primera etiqueta es 950 ms en iPhone 15 Pro y 1.6 s en Pixel 8a.
Lo que aún duele
- Voces parecidas — mismo registro, mismo acento, mismo género — confunden al embedding los primeros 30 s. Lo exponemos como un aviso "aún aprendiendo voces" en la UI.
- El cross-talk en salas ruidosas degrada bruscamente. Estamos probando una pre-etapa diminuta de separación de fuentes en el dispositivo.