Inspiration
What it does
Inspiration
Synthetic voices are becoming increasingly realistic. As voice quality improves, detecting an AI-generated caller only through tone, frequency, or audible artifacts becomes more difficult.
This inspired us to approach the problem differently: instead of asking “How does the voice sound?”, Altur asks “How does the caller behave during a conversation?”
Our hypothesis is that synthetic callers may reveal patterns through response timing, interruptions, silence handling, turn duration, and conversational rhythm—even when their voices sound convincingly human.
What it does
Altur analyzes a stereo phone call and estimates whether the caller is human or synthetic.
The system receives an 8 kHz stereo WAV file where:
- Channel 0 contains the caller.
- Channel 1 contains the agent.
A Voice Activity Detector identifies when each participant is speaking. Altur then converts the conversation into 67 behavioral features, including:
- Response latency
- Turn duration
- Interruptions and overlapping speech
- Internal pauses
- Conversational rhythm
- Reaction to agent interruptions
- Behavior during long silences
These features are processed by a HistGradientBoosting machine-learning model that returns:
- A human or synthetic classification
- A confidence score
Altur does not transcribe the conversation and does not analyze its meaning. It focuses exclusively on temporal and conversational behavior. The model runs on CPU without requiring a GPU or an external AI inference service.
How we built it
We developed a complete inference pipeline:
- Validate and decode the WAV file.
- Separate the caller and agent channels.
- Detect speech segments using a frozen Voice Activity Detector.
- Merge segments into conversational turns.
- Extract behavioral and temporal features.
- Run the features through a HistGradientBoosting classifier.
- Return the result through a public REST endpoint.
We evaluated 540 VAD configurations using only the training split and selected the configuration that best reproduced the reference conversational turns.
Our dataset contained 353 calls:
- 282 training calls
- 71 validation calls
- Speaker-disjoint official splits
The classifier was trained exclusively on the training split to reduce identity leakage between training and validation.
We also conducted feature ablation experiments. We evaluated interruption recovery, silence recovery, consistency, temporal drift, and autocorrelation independently. Silence-recovery behavior provided the strongest improvement and added nine features to the original 58-feature baseline.
Challenges we faced
One of our biggest challenges was ensuring that offline experiments and the deployed API produced exactly the same predictions. We discovered that even very small floating-point differences could cross a decision-tree threshold. We corrected the pipeline so training and inference calculate features directly from the same in-memory representation.
Another important challenge was temporal robustness. Our adversarial stress tests showed that the deployed model could lose accuracy when all synthetic caller turns were shifted to simulate a faster voice engine.
Rather than hiding this limitation, we documented it and used it to guide robustness-oriented training with temporal augmentation. An experimental candidate improved the worst uniform temporal-stress scenario from 63.38% to 94.37%. We are keeping this candidate separate from the deployed model until it passes non-uniform timing perturbations and testing with previously unseen voice engines.
Accomplishments that we are proud of
On the complete 71-call validation split, the deployed 67-feature model achieved:
- 97.18% accuracy — 69 out of 71 calls
- 97.30% balanced accuracy
- 0.9905 AUC
- 35 out of 37 human calls correctly classified
- 34 out of 34 synthetic calls correctly classified
We also tested our public deployment using the official judge client without modifying it:
- 20 out of 20 valid API responses
- Zero HTTP or contract errors
- 19 out of 20 correct classifications
- 95% accuracy
- 95.45% balanced accuracy
The longest available call was 273.9 seconds and completed the full public request in approximately 6.7 seconds, leaving more than 23 seconds of margin before the 30-second timeout.
The API also handles malformed, missing, silent, mono, excessively long, or insufficient audio safely by returning an abstention instead of fabricating a high-confidence prediction.
What we learned
We learned that strong accuracy is not enough. A reliable machine-learning system also requires:
- Correct data separation
- Reproducible experiments
- Feature ablation
- Contract testing
- Deployment verification
- Adversarial stress testing
- Honest documentation of limitations
Most importantly, we learned that discovering how a model fails can be as valuable as improving its headline metric.
What's next for Altur
Our next steps are:
- Complete non-uniform temporal robustness validation
- Test previously unseen synthetic voice engines
- Evaluate noise, gain changes, compression, and partial calls
- Add acoustic signals that complement conversational behavior
- Improve probability calibration
- Measure concurrent performance and long-term availability
- Create configurable risk policies for different operational environments
Altur is not intended to make an automatic blocking decision by itself. It is designed as an explainable behavioral risk signal that can complement existing fraud-detection and call-center security systems.
How we built it
Challenges we ran into
Accomplishments that we're proud of
What we learned
What's next for detector de llamante sintetico
Built With
- activity
- analysis
- api
- audio
- behavioral
- detection
- flask
- histgradientboosting
- joblib
- learning
- machine
- numpy
- pandas
- pcm
- processing
- python
- render
- rest
- scikit-learn
- voice
- wav
Log in or sign up for Devpost to join the conversation.