Voice Activity Detection · agente de voz em telefonia
A decisão é probabilística, feita por um modelo pequeno com 32 milissegundos de contexto, e não existe ajuste que a acerte sempre. O desafio é medir o impacto e quando ele erra.
O essencial, em seis linhas
Qualidade percebida por um ouvido humano e impacto sobre um modelo são grandezas diferentes.
"Perceived audio quality and machine impact are different things: a call that sounds acceptable to a human reviewer can still derail STT, and vice versa." ai-coustics, ao lançar um modelo cujo único trabalho é prever, antes do VAD, se um áudio vai quebrar a etapa seguinte1
Melhorar o áudio para o ouvido pode piorar o resultado da máquina
Um realce de voz que melhora as métricas de qualidade percebida mais que dobra a frequência com que o modelo de linguagem entende a intenção errada (0,318 contra 0,135). A correlação entre métrica de qualidade e falha real fica entre −0,07 e −0,47. "Perceptually Better, Semantically Worse", 202615
No benchmark do próprio fabricante, o detector confunde ruído com fala
Em gravações que contêm só ruído, o detector que usamos acerta 87% num conjunto público e 71% num privado: cerca de 3 em cada 10 áudios sem nenhuma voz o confundem. Silero VAD · métricas de qualidade do fabricante2
Pessoas e máquinas degradam em ritmos diferentes
Modelar a percepção humana não prevê o desempenho do reconhecedor: são dois sistemas distintos ouvindo o mesmo sinal. JASA Express Letters · humano vs. automático em ruído8
A consequência. "A ligação estava boa" e "o agente conseguiu ouvir" são afirmações diferentes, e a primeira não sustenta a segunda. A seção 4 mostra isso numa gravação real deste canal.
A ligação nasce em G.729 a 8 kHz. Uma reunião em Zoom trafega a 48 kHz. Ou seja, seis vezes a taxa, com banda útil quinze vezes maior.
| Canal | Amostragem | Banda útil | Perdas acumuladas |
|---|---|---|---|
| Telefonia do agente | 8 kHz | 0,3 – 3,4 kHz | G.729 → G.711, transcodificação, jitter e perda de pacotes |
| Telefonia G.711 ponta a ponta | 8 kHz | 0,3 – 3,4 kHz | preserva a forma de onda, teto de banda é o mesmo do G.729 |
| Telefonia HD (G.722) | 16 kHz | 0,05 – 7 kHz | compressão leve |
| Zoom / Teams / Meet | 48 kHz | 0,02 – 20 kHz | rede, sem estreitamento de banda |
| Assistente de voz no celular | 24–48 kHz | até 20 kHz | captura direta do microfone |
Um agente que atende telefone não é comparável a uma demonstração feita com headset.
Papel 1 · recorte
A transcrição só vê o que o VAD entregar. Áudio não entregue não vira palavra errada — vira palavra inexistente, e o agente segue como se o cliente estivesse calado. No sentido oposto, trecho sem voz também custa: transcritores inventam texto quando não há fala6.
Papel 2 · ritmo
É o VAD que manda o agente parar quando o cliente fala por cima, e que autoriza a resposta quando ele termina. Com transcrição em lote não há sinal de fim de turno vindo do transcritor: a qualidade do VAD é a qualidade da conversa.
| Produto | O que a documentação expõe |
|---|---|
| OpenAI voz em tempo real |
Detecção de turno por VAD com threshold, prefix_padding_ms e
silence_duration_ms — os botões da seção 54. |
| Deepgram streaming |
O endpointing "depende de um Voice Activity Detector"; vad_events emite o
início de fala para detectar interrupção11. |
| Google Cloud Speech-to-Text v2 |
enable_voice_activity_events devolve eventos de início e fim de fala, com
tempos-limite configuráveis12. |
| AssemblyAI Universal Streaming |
Limiar de confiança do VAD por quadro (padrão 0,4), com a recomendação de aumentá-lo em ambientes ruidosos — o mesmo trade-off13. |
| faster-whisper Whisper em produção |
Embarca o Silero VAD no próprio pacote e liga o filtro por padrão, com os mesmos quatro parâmetros14. |
Não dá para desligar. Sem VAD, ou a transcrição recebe a ligação inteira — inviável em custo, latência e sem sinal de fim de turno — ou o agente nunca sabe quando falar. É padrão da indústria para decider onde a fala começa e termina.
O modelo que olha 32 milissegundos por vez e devolve um número entre 0 e 1. Ele usa três parâmetros principais e os transformam numa decisão.
Recall é quanta fala do cliente o detector pega; precisão é quanto do que pegou era mesmo fala. Subir um baixa o outro.
A mesma forma aparece nos benchmarks publicados pelos próprios fabricantes2: um joelho, e depois um preço cada vez mais caro por ponto de recall. Nenhuma curva toca o canto superior direito — é lá que viveria o detector perfeito, e ele não existe em nenhum fornecedor.
É esta a decisão, e ela é de negócio antes de ser técnica. Para a direita na curva: mais ruído e mais voz de terceiros tratados como cliente. Para a esquerda: mais cliente falando sem ser ouvido.
Duas razões independentes, ambas propriedades da tecnologia: o modelo não sabe quando erra, e o erro é difícil de medir.
São cerca de 270 mil parâmetros. Quando o modelo devolve 0,31, ele não diz "tenho 31% de certeza" — diz apenas que as multiplicações que aprendeu dão 0,31 aqui. Não há dentro dele nenhuma noção de "acertei" ou "errei".
Saber quando ele erra exigiria um modelo exato do que é fala — e é porque essa função não existe que se treina um modelo estatístico. Um detector capaz de identificar os próprios erros seria, por definição, um detector melhor.
Não há botão "explique esta decisão". A decisão vem da interação de centenas de milhares de pesos, não de uma condição legível.
O gabarito é humano. Para dizer que o detector errou, alguém precisa dizer antes onde havia fala — e pessoas discordam sobre onde uma palavra começa e termina.
Não existe "um" erro. Perder fala, ativar no vazio, emendar turnos, capturar terceiros e picotar são falhas qualitativamente diferentes. Qualquer número único é uma taxa de câmbio arbitrária entre elas.
É a pergunta certa. Dá para medir; o que não existe é uma medida ao mesmo tempo exata, contínua e barata.
| Como medir | O que entrega | Onde falha |
|---|---|---|
| Gatilhos que o agente já emite frase de inatividade · interrupção desfeita |
De graça, em 100% das ligações, e cobrem as duas direções do erro. A frase de inatividade — "você ainda está na linha?" — dispara quando o agente acha que ninguém falou, inclusive quando o cliente falou e não foi ouvido. A interrupção que a plataforma desfaz marca o falso positivo. Cada disparo vem com hora exata: é um ponteiro para o trecho que vale ouvir. | Nenhum dos dois é taxa de erro — a frase de inatividade também dispara quando o cliente estava mesmo calado, distraído ou sem sinal. Serve de alarme e de gatilho de amostragem, nunca de medida. |
| Auditoria humana alguém ouve e marca onde o cliente falou |
A única medida sem viés. Dirigida pelos gatilhos acima — ouvir os 30 s antes de cada frase de inatividade — custa uma fração da amostragem aleatória, porque escuta onde o erro provavelmente está. | Dirigida por gatilho, responde "quantos desses episódios foram culpa do VAD" — não a taxa geral. Para a taxa geral é preciso amostra aleatória, e aí o esforço muda de ordem: dezenas de horas de escuta só para saber onde estamos, e centenas de horas, de cada lado da comparação, para provar que um ajuste melhorou a taxa em um ponto percentual. |
| Re-transcrever o canal do cliente hipótese a pilotar, não recomendação |
Em tese apontaria fala perdida sem humano nenhum: transcrever o canal do cliente inteiro — só ele importa; o canal do agente é irrelevante aqui — e comparar com o que o agente de fato recebeu. | Risco alto de não se pagar. O transcritor inventa texto justamente em ruído e silêncio6 — que é exatamente onde essa comparação olha. Cada alucinação vira um falso alarme de "fala perdida". Só faz sentido com filtro pela probabilidade de não-fala que o próprio transcritor devolve, e depois de um piloto pequeno que meça a taxa de alarme falso. |
| Segundo detector em paralelo | Contínuo e barato: sinaliza quando um VAD mais sensível ouve fala e o de produção não. | Os dois erram nas mesmas gravações. As perdas que importam são as que ambos deixam passar — invisíveis por construção. Dá um piso, nunca o total. |
| Modelo de risco do áudio ex.: Tyto, da ai-coustics |
Estima, antes do VAD, a chance de o áudio quebrar a etapa seguinte. Roda local em CPU, barato para 100% das ligações. Serve para triar17. | Prevê risco, não mede erro. Janelas fixas de 5 s não apontam qual fala de 0,4 s se perdeu. E a documentação avisa: construído com fala em inglês, e "enunciados curtos carregam contexto insuficiente" — o que mais perdemos. |
O arranjo que funciona. Os gatilhos que o agente já emite como alarme contínuo e como ponteiro; a auditoria humana indo direto aos trechos que eles apontam.
Roda do mouse dá zoom, arrastar move a janela, e a faixa de cima navega a ligação inteira. Aqui os cinco parâmetros do detector estão expostos, e os dois botões carregam os valores reais de produção: o inicial e o que o agente aplica sozinho quando espera e não ouve nada.
Fontes
vad_events expõe o início de fala para detecção de interrupção.Os áudios, formas de onda e probabilidades desta página vêm de gravações reais deste canal telefônico, processadas pelo mesmo detector e com o mesmo ajuste que o agente usa em produção.
Não dá para medir o erro do detector em produção. O que dá é medir a condição em que a decisão foi tomada, e é isso que o agente agora envia junto de cada turno.
Leia como sinal de risco, não como erro. Nenhum destes números diz "o VAD errou aqui". Eles dizem "aqui a decisão foi apertada" ou "aqui algo mudou". Servem para dois usos: perceber padrões de comportamento e apontar quais ligações merecem escuta humana. Nenhum substitui ouvir.
O detector decide comparando uma probabilidade com um limiar. O que mais prevê problema não é o valor da probabilidade, é quanta folga existe entre a fala e essa linha.
| Sinal | Unidade | Como é obtido | O que acender indica |
|---|---|---|---|
| Confiança e folga · todos saem da mesma probabilidade de fala que o detector produz a cada 32 ms — e usam o pico dela, porque o que dispara a detecção é o valor mais alto sustentado, não o valor médio | |||
| Confiança na fala vad_prob_peak · vad_prob_p50 |
0 a 1 | vad_prob_peak é o maior valor do trecho — é ele que alimenta a margem e a separação abaixo. vad_prob_p50 é o mediano, e não é a "confiança típica": o trecho vai até um segundo depois da fala terminar, então o mediano cai quanto mais curto o que foi dito. Só compare turnos de duração parecida. | Pico caindo ao longo do tempo: o áudio que chega piorou. |
| Piso de ruído vad_noise_p90 |
0 a 1 | O percentil 90 dos valores fora da fala — só enquanto o agente está escutando, para não misturar o eco da própria voz dele. | Subindo: risco de o agente ouvir coisa onde não há ninguém. |
| Margem até o corte vad_margin |
0 a 1 | Subtração: vad_prob_peak − limiar. | Perto de zero: a fala passou raspando na linha de decisão. |
| Separação vad_separation |
0 a 1 | Subtração: vad_prob_peak − vad_noise_p90. | O indicador mais importante. Encolhendo, nenhum ajuste de limiar resolve: fala e ruído ficaram parecidos demais. |
| Ajuste em vigor vad_activation_threshold · vad_threshold_mode |
0 a 1 · texto | O limiar que valia no turno, e se era o normal ou o afrouxado automaticamente. | Contexto: sem ele, comparar turnos com ajustes diferentes engana. |
| Tempo · medido pelo relógio do áudio, não pelo do servidor | |||
| Tempo até reagir vad_onset_ms |
ms | Do primeiro instante acima do limiar até o detector confirmar que é fala. | Subindo: interrupção mais lenta, agente mais "teimoso". |
| Ocupação da escuta vad_active_ms · vad_listening_ms |
ms · ms | Soma dos trechos ativos, e a janela de escuta que os contém — o diagrama acima. A razão entre os dois é a ocupação. | Alta com pouca transcrição: ruído contínuo segurando o detector aberto. |
| Espera sem resposta vad_detected_after_ms |
ms | Da pergunta "você ainda está na linha?" até o cliente ser finalmente detectado. | Detecção logo depois da pergunta sugere que ele já estava falando e não foi ouvido antes. |
| Contagens do turno | |||
| Trechos por turno vad_segments_in_turn |
contagem | Quantos trechos de fala foram abertos até o turno fechar. | Vários: frase picotada chegando à transcrição. |
| Trechos sem texto vad_empty_segments |
contagem | Trechos abertos que não produziram nenhuma palavra. | Subindo: áudio sem voz sendo mandado para transcrição. |
| Detecção com o agente falando vad_segments_while_agent_speaks |
contagem | Trechos abertos fora da janela de escuta, enquanto o agente falava. | Pode ser interrupção legítima ou eco da voz do agente — não é prova de ruído. |
| Saúde da medição · servem para desconfiar dos demais | |||
| Atraso de processamento vad_event_lag_ms |
ms | Distância entre o relógio do áudio e o do servidor no momento do evento. | Alto: o servidor estava atrasado; os números do turno merecem desconfiança. |
| Falha de transcrição stt_error |
0 ou 1 | Se a transcrição daquele turno falhou por erro técnico. | Separa falha de infraestrutura de falha de detecção. |
| Sinal | Unidade | Como é obtido | O que acender indica |
|---|---|---|---|
| Parada à toa vad_false_interruption |
contagem | Vezes que o agente parou de falar por ter detectado alguém — e não veio fala nenhuma. | Falso disparo do detector durante a fala do agente. |
| Fala ignorada de propósito vad_interrupt_suppressed |
contagem | Vezes que uma detecção foi descartada por regra enquanto o agente falava. | É decisão de projeto, não defeito — mas em excesso indica regra apertada demais. |
| Pergunta de inatividade vad_retry_attempt |
nº da tentativa | Qual tentativa de "você ainda está na linha?" aquela fala representa. | Repetidas: ou o cliente não está sendo ouvido, ou não está mais lá. |
O que isso não entrega. Continua não existindo o painel com "quantos clientes o agente deixou de ouvir hoje" — para esse número é preciso alguém ouvindo uma amostra, como descrito na seção 7. O que estes sinais fazem é dizer onde ouvir, e avisar quando o terreno mudou.