Diarizzazione dei parlanti in tempo reale su larga scala
July 20, 2025
•min read
Ingegneria
Figura 1: separazione dei flussi audio in tempo reale
Il problema del “cocktail party”
Gli esseri umani sono bravissimi a concentrarsi su una sola voce in una stanza rumorosa. I computer fanno fatica.
In una chiamata VoIP mono-canale (comune nella telefonia legacy), l’agente e il cliente sono mescolati in un unico flusso.
Per costruire un agente IA che sa quando interrompere, occorre sapere chi sta parlando.
L’architettura
1. Embedding a livello di frame
Suddividiamo l’audio in finestre da 500 ms e le facciamo passare attraverso un codificatore leggero (SpeechBrain ECAPA-TDNN).
Output: un vettore a 192 dimensioni che descrive il “timbro” di quel segmento.
2. Architettura ibrida
Ci siamo allontanati da una diarizzazione puramente interna all’app (Pyannote) verso un approccio ibrido:
- Diarizzazione esterna: acquisiamo segmenti già diarizzati da API ad alto throughput (come Google speech-to-text o OpenAI).
- Verifica interna: eseguiamo localmente la nostra verifica ECAPA-TDNN a 192 dimensioni per “ricontrollare” e associare le identità a profili vocali noti.
3. Vincoli di latenza
Le API cloud gestiscono la mappa “Chi ha parlato e quando?”.
IdentityCall gestisce la verifica “È l’agente X?”.
- Budget: 50 ms di tempo di elaborazione per frame per la verifica.
- Ottimizzazione: eseguiamo il codificatore in ONNX Runtime su GPU, quantizzato a INT8.
Gestione della sovrapposizione
La parte più difficile è il “parlato sovrapposto” (circa il 10-15% di una chiamata).
I modelli standard scelgono il parlante “più forte”.
Usiamo la diarizzazione multi-etichetta, assegnando due etichette di parlante a un singolo intervallo temporale se l’embedding suggerisce una mescolanza.
Conclusione
Una buona diarizzazione è il presupposto per una buona trascrizione. Se si attribuisce il “Pronto” dell’agente al cliente, l’intero contesto parte già compromesso.
Tags: