Detecta picote, dropout e falha de áudio em gravações de chamadas por processamento de sinais — sem depender de transcrição.
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.



🔒 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.