Análise de Qualidade de Chamadas por Processamento de Sinais

← voltar ao portfólio

07/2026 – atual · 3 meses

Detecta picote, dropout e falha de áudio em gravações de chamadas por processamento de sinais — sem depender de transcrição.

Python 3.14NumPyFFTITU-T G.107FlaskSQLite WALfaster-whisperllama.cppONNX RuntimeffmpegDockergunicornDNSMOS P.835NISQASQUIM

O problema

Quando o cliente reclama que "a ligação estava picotando", não há prova: a operação só tem a gravação e a percepção de quem ouviu. Transcrever tudo com IA é caro, lento e não mede qualidade de áudio, mede palavra.

A arquitetura

Todo o DSP é NumPy: energia RMS por frame de 20 ms com hop de 10 ms convertida em dBFS, janelas deslizantes vetorizadas, e estimativa de ruído de fundo por percentil — que é o discriminador que separa picote de pausa natural na conversa. A análise espectral usa FFT para spectral flatness. O E-model da ITU-T G.107, que converte fator R em MOS, foi implementado do zero. O decodificador de áudio é o ffmpeg, escolhido em vez da libsndfile por preservar os canais separados, o que é essencial para detectar áudio em uma via só. Onde há IA, ela roda local em CPU: faster-whisper em int8 e um LLM GGUF via llama.cpp, sem mandar áudio de cliente para fora. A decisão de não usar rede neural para a nota de qualidade não foi por preferência: foi medida. Um corpus real de telefonia em 8 kHz foi rotulado em quatro categorias — chamada boa, picote, queda e ruído — e quatro modelos foram comparados pela separação que cada um produz entre a categoria boa e cada categoria ruim. O painel é Flask com SQLite em modo WAL e uma SPA em JavaScript puro, sem build.

O resultado

Ferramenta multi-tenant com isolamento físico por cliente, rodando em Docker com gunicorn e systemd. A validação é por injeção: o selftest insere picote e clipping em sinal sintético e confere se a detecção pega, o que testa o DSP sem depender do PABX. O comparativo de modelos neurais expôs duas coisas. A primeira é técnica: os modelos neurais são cegos a silêncio, porque avaliam a qualidade da fala presente e não penalizam um trecho mudo — por isso o E-model próprio separa queda por 3,39 contra 0,17 do melhor neural. A segunda é de licenciamento: o NISQA é o melhor detector de picote medido, com separação 1,00, e mesmo assim não pode entrar no produto porque os pesos são CC BY-NC. Escolher modelo aqui foi decisão técnica e jurídica ao mesmo tempo, e ficou registrada.

Relatório de análise: eventos de picote e dropout por chamada
Relatório de análise: eventos de picote e dropout por chamada
Detalhe da chamada, com as métricas de sinal
Detalhe da chamada, com as métricas de sinal
O comparativo que decidiu a arquitetura: qual modelo detecta o quê, e qual pode ir para o produto
O comparativo que decidiu a arquitetura: qual modelo detecta o quê, e qual pode ir para o produto

🔒 Código-fonte

git clone https://git.programandosolucoes.com.br/git/repos/analisador-chamadas.git

Código-fonte privado. As credenciais de leitura são liberadas sob solicitação — me chame para conversar sobre o projeto.

Carlos Alberto — carlosalberto4ti@gmail.com · +55 11 2615-2880