-
-
Independently verified with the organizer's official test client, 71 of 71 calls answered, 0.958 balanced accuracy, 0.998 AUC, zero errors.
-
Live classification of a real call from our deployed app, correctly flagged as human with 84.1 percent confidence in 2 seconds.
-
Nuestro proyecto para el reto de Altur en HackMTY26, equipo Envueltos Poblanos.
-
El problema que atacamos y cómo lo resolvemos con un API en tiempo real.
-
Arquitectura del sistema, dos modelos independientes combinados en un solo puntaje.
-
Resultados verificados con el script oficial de Altur, 353 llamadas y cero errores.
Inspiration
Banks still authenticate callers with PINs and security questions. None of that checks whether the voice on the other end is actually human. As voice deepfakes get more convincing, that gap becomes a real path to account takeover and fraud. We wanted to close it with something a bank could actually plug into a real call flow.
What it does
Our system takes a recorded call, a stereo WAV file with the caller on one channel and the bank agent on the other, and classifies the caller's voice as human or synthetic in real time. It returns a confidence score through a simple API, and we built a browser frontend so anyone can drag in a call and see the result directly.
How we built it
We combine two independent models that each score the caller's channel. One analyzes the conversational timing between caller and agent, since synthetic voices tend to produce timing patterns that differ subtly from natural human rhythm. The other extracts acoustic features directly from the audio, pitch, MFCCs, spectral centroid, flatness, and rolloff, using librosa, then classifies with a trained scikit learn model. We average the two scores into one final confidence value. The whole thing runs behind a Flask API, deployed on a Vultr VPS with Gunicorn, and the frontend is a dependency free HTML, CSS, and JS app served directly by Flask.
Challenges we ran into
Getting the two models to agree on a single, well calibrated confidence score took real tuning, since each one fails differently on edge cases. On the deployment side, librosa's pitch tracking functions are JIT compiled by numba, so the very first request after a fresh server start could take twenty to thirty seconds. We fixed that by warming up the model at startup, directly exercising the compiled functions before any real request arrives, which brought production latency down to one to three seconds.
Accomplishments that we're proud of
Our ensemble hits 95.8 percent accuracy, and we didn't just trust our own benchmark. We ran the organizer's own official test client directly against our live deployed server and got a 0.958 balanced accuracy and a 0.998 AUC across 71 calls with zero errors, using the exact request and response contract the real judging system uses.
What we learned
We learned that combining two very different signals, timing behavior and acoustic features, catches cases that either model misses alone, since they tend to fail on different kinds of audio. We also learned to think about cold starts as a real production problem, not just a training time concern, since a numba JIT compilation delay on a live server behaves very differently than it does in a notebook.
What's next for Altur Voice Deepfake Detector
We want to let the model keep improving after today, by letting a bank contribute new labeled call audio through the same interface and retrain the model without touching the code, so accuracy keeps climbing as more real world data comes in.
Built With
- audio
- css3
- dsp
- flask
- gunicorn
- html5
- javascript
- librosa
- ml
- numpy
- pandas
- python
- scikit-learn
- scipy
- vultr
Log in or sign up for Devpost to join the conversation.