Diarização de locutores em tempo real à escala
July 20, 2025
•min read
Engenharia
Figura 1: separação de fluxos de áudio em tempo real
O problema da “festa de cocktail”
Os humanos são ótimos a concentrar-se numa voz numa sala ruidosa. Os computadores têm dificuldade.
Numa chamada VoIP de canal mono (comum na telefonia legada), o agente e o cliente estão misturados num único fluxo.
Para construir um agente de IA que sabe quando interromper, é preciso saber quem está a falar.
A arquitetura
1. Embedding ao nível de frame
Dividimos o áudio em janelas de 500 ms e passamo-las por um codificador leve (SpeechBrain ECAPA-TDNN).
Saída: Um vetor de 192 dimensões que descreve o “timbre” desse segmento.
2. Arquitetura híbrida
Afastámo-nos da diarização puramente na aplicação (Pyannote) para uma abordagem híbrida:
- Diarização externa: Ingerimos segmentos pré-diarizados de APIs de alto débito (como o speech-to-text da Google ou a OpenAI).
- Verificação interna: Executamos localmente a nossa verificação ECAPA-TDNN de 192 dimensões para “confirmar” e associar identidades a perfis de voz conhecidos.
3. Restrições de latência
As APIs na cloud tratam do mapa “quem falou e quando?”.
A IdentityCall trata da verificação “isto é o agente X?”.
- Orçamento: 50 ms de tempo de processamento por frame para verificação.
- Otimização: Executamos o codificador em ONNX Runtime na GPU, quantizado para INT8.
Lidar com a sobreposição
A parte mais difícil é a “fala sobreposta” (aproximadamente 10-15% de uma chamada).
Os modelos padrão escolhem o locutor “mais alto”.
Usamos diarização multirrótulo, atribuindo dois rótulos de locutor a um único intervalo de tempo se o embedding sugerir uma mistura.
Conclusão
Uma boa diarização é o pré-requisito para uma boa transcrição. Se atribuir o “Olá” do agente ao cliente, todo o seu contexto começa quebrado.
Tags: