Safetensors
hubert

Model Card: IndicTTS Deepfake Speech Detector

Model Details

  • Base model: ntu-spml/distilhubert
  • Architecture: HubertForSequenceClassification β€” DistilHuBERT encoder (frozen CNN feature extractor + fine-tuned transformer layers) with a linear binary classification head
  • Task: Binary audio classification β€” authentic human speech vs. AI-generated (TTS) speech
  • Language(s): Multilingual, Indic languages (see Training Data)
  • License: Inherits ntu-spml/distilhubert's license (Apache 2.0) for the base model; fine-tuned weights license is up to you to set
  • Fine-tuned by: [your name/org]
  • Fine-tuning date: [fill in]

Intended Use

Intended for: demonstrating automated detection of synthetic speech for educational/portfolio purposes, and as a starting point for further research into speech deepfake detection.

Not intended for: any decision with real-world consequences for a person β€” content moderation, legal/forensic evidence, authentication systems, or any setting where a false result could cause harm. See Limitations below.

Training Data

SherryT997/IndicTTS-Deepfake-Challenge-Data β€” Indic-language speech labeled is_tts (0 = authentic, 1 = synthetic).

  • Trained on a 10,000-sample random subset (seed=37) of the full ~16GB training split, with a 90/10 train/validation split (seed=42)
  • Audio standardized to 16kHz mono, 2-second (32,000 sample) windows, trimmed or zero-padded as needed
  • Class balance of the training subset: [fill in β€” see debug_check.py's printed class balance line]

Training Procedure

Optimizer AdamW
Learning rate 1e-4, 1,000 warmup steps
Weight decay 0.005
Epochs 7 (15,750 steps total)
Batch size 4
Precision fp32
Feature encoder Frozen
Model selection Best checkpoint by validation loss

Evaluation

Held-out internal validation split (10% of the 10k training subsample), best checkpoint by validation loss (step 8,500 of 15,750):

Metric Score
Accuracy 97.30%
Precision 97.44%
Recall 96.82%
F1 97.13%
ROC-AUC 0.9960

Scored 0.9761 on the IndicTTS Deepfake Challenge public leaderboard (competition test set, disjoint from training data).

Limitations

  • Training scale: fine-tuned on 10k samples out of a much larger dataset. Performance on the full data distribution, and on TTS systems/languages underrepresented in the subset, is unverified.
  • Fixed input length: every clip is trimmed or padded to exactly 2 seconds. Longer clips are truncated rather than analyzed in full; very short clips are zero-padded, which may reduce reliability on edge cases.
  • Distribution shift: trained and validated on audio from a single benchmark dataset. Real-world audio (background noise, compression artifacts, different microphones, TTS systems not represented in training) will likely perform worse than the reported metrics β€” observed anecdotally during demo testing, where out-of-distribution non-speech audio was classified with high but not necessarily meaningful confidence.
  • Confidence calibration: the model was trained with cross-entropy loss and no explicit calibration step. High reported confidence (e.g. 99–100%) should not be read as a calibrated probability of correctness, especially on inputs unlike the training distribution.
  • No quantization/compression applied β€” served as the raw fp32 fine-tuned checkpoint. See main README's "Known limitations" for planned optimization work.

Ethical Considerations

Speech deepfake detectors can be used both defensively (flagging synthetic media, protecting against voice-cloning fraud) and, if inverted, to help adversaries iterate against detection systems. This model is released for educational/demonstration purposes with modest training scale and unverified real-world robustness β€” it should not be relied on as a production safeguard against audio fraud without substantially more rigorous evaluation, adversarial testing, and domain-specific validation.

How to Use

from transformers import AutoModelForAudioClassification, AutoFeatureExtractor

model = AutoModelForAudioClassification.from_pretrained("path/to/model")
feature_extractor = AutoFeatureExtractor.from_pretrained("path/to/model")

See backend/predict.py in the main repo for the full inference pipeline (audio decoding, resampling, and classification).

Downloads last month
-
Safetensors
Model size
23.7M params
Tensor type
F32
Β·
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Dataset used to train Khon198/indictts-deepfake-detector