Downloads · 30 days
39
2% of all-time downloads
diabolic6045/GitaWhisper-tiny
GitaWhisper-tiny is a automatic speech recognition model from diabolic6045. Use it when you need speech turned into text. It is set up for transformers. The card lists the license as apache-2.0.
Fine-tuned Whisper-tiny model for Sanskrit śloka transcription with IAST transliteration output.
Downloads · 30 days
39
2% of all-time downloads
All-time downloads
1.8K
Public
Parameters
37.8M
151 MB on disk
Likes
3
Public
Click a slice to open those files.
.safetensors151 MB · 96%
From the Hugging Face model README
Fine-tuned Whisper-tiny model for Sanskrit śloka transcription with IAST transliteration output.
This model is a fine-tuned version of openai/whisper-tiny specifically trained for transcribing Sanskrit ślokas (verses) into IAST (International Alphabet of Sanskrit Transliteration) format.
📖 For detailed technical information, training methodology, and comprehensive analysis, see the Technical Report.
| Metric | Original OpenAI Model | Fine-tuned Model | Absolute Improvement | Relative Improvement |
|---|---|---|---|---|
| WER | 140.96% | 91.81% | -49.15% | 34.9% reduction |
| CER | 43.84% | 22.19% | -21.65% | 49.4% reduction |
The original OpenAI Whisper-tiny model was trained on multilingual data but struggles with Sanskrit:
Our fine-tuned model:
Reference:
siddhiṃ prāpto yathā brahma tathāpnoti nibodha me samāsenaiva kaunteya niṣṭhā jñānasya yā parā
OpenAI Whisper-tiny (Original):
sidhim praptu yatha bramhan tathap notini budhami samas enai vakanteya nishthag nyanasiyayā para
❌ Missing diacritics (ā, ṃ, ṭhā)
❌ Incorrect word segmentation
❌ Poor Sanskrit phonetics recognition
Fine-tuned Model:
siddhimprāpto yathā brahmān tathaapnoti nibodha me samāsenaiva kaunteya niṣṭhā jñānasyayā parāmīr
✅ Correct diacritics (ā, ṃ, ṭhā, jñā)
✅ Better word recognition
✅ Accurate Sanskrit phonetics
Reference:
ahaṃkāraṃ balaṃ darpaṃ kāmaṃ krodhaṃ parigraham vimucya nirmamaḥ śānto brahmabhūyāya kalpate
OpenAI Whisper-tiny (Original):
ahaṁ karam balandarpam kāmam kurodham parigraham vimu chyanir mamah shantū bramhab huyaya kalpate
❌ Missing diacritics (ṃ, ā, ḥ)
❌ Incorrect word boundaries
❌ Phonetic errors (kurodham vs krodhaṃ)
Fine-tuned Model:
ahaṃ kāraṃ balandarpaṃ kaamakrodhaṃ parigraham vi mucyanirmamaḥ śānto brahma bhūyāya kalpate
✅ Correct diacritics (ṃ, ā, ḥ)
✅ Better word segmentation
✅ Accurate phonetics
Reference:
buddhyā viśuddhayā yukto dhṛtyātmānaṃ niyamya ca śabdādīnviṣayāṃstyaktvā rāgadveṣau vyudasya ca
OpenAI Whisper-tiny (Original):
buddha vishuddhaya yuktu, dhrityatmanam miyam yachan. shabdhādin vishayān tiktvah raga dhyeshav vudasya chak
❌ Missing diacritics (yā, ś, ṣ, ṭ, vā)
❌ Incorrect punctuation
❌ Poor word recognition
Fine-tuned Model:
buddhyā viśuddhayā yukto dṛtyātmānammyaṃya ca śabdādiṃ vyṣayāntyaktvā rāgadveśau vyu daśya ca
✅ Correct diacritics (yā, ś, ṣ, ṭ, vā)
✅ No punctuation (as expected)
✅ Much better word recognition
Character-Level Accuracy (CER):
Word-Level Accuracy (WER):
Diacritic Accuracy:
Text Generation:
pip install transformers torch librosa soundfile
works best with audio length less than ~25-30 seconds
from transformers import WhisperProcessor, WhisperForConditionalGeneration
import torch
import librosa
import numpy as np
# Load model and processor
model_name = "diabolic6045/GitaWhisper-tiny" # Replace with your HF username
processor = WhisperProcessor.from_pretrained(model_name)
model = WhisperForConditionalGeneration.from_pretrained(model_name)
# Disable forced decoder ids for clean output
model.config.forced_decoder_ids = None
model.config.suppress_tokens = []
device = "cuda" if torch.cuda.is_available() else "cpu"
model.to(device)
model.eval()
# Load and preprocess audio (must be 16 kHz mono)
audio_path = "path/to/your/audio.wav"
audio, sr = librosa.load(audio_path, sr=16000, mono=True)
# Process audio
inputs = processor.feature_extractor(
audio,
sampling_rate=16000,
return_tensors="pt"
).input_features.to(device)
# Generate transcription with repetition penalty
with torch.no_grad():
generated_ids = model.generate(
inputs,
max_length=448,
repetition_penalty=1.2, # Prevents repetitive text
no_repeat_ngram_size=3, # Prevents 3-gram repetition
length_penalty=1.0,
)
# Decode
transcription = processor.tokenizer.batch_decode(
generated_ids,
skip_special_tokens=True
)[0]
print(transcription.strip().lower())
from transformers import WhisperProcessor, WhisperForConditionalGeneration
import torch
import librosa
import numpy as np
def transcribe_sanskrit_audio(audio_path, model, processor, device):
"""
Transcribe Sanskrit audio to IAST transliteration.
Args:
audio_path: Path to audio file
model: Loaded Whisper model
processor: WhisperProcessor
device: torch device
Returns:
str: IAST transliteration text
"""
# Load audio
audio, sr = librosa.load(audio_path, sr=None, mono=False)
# Convert stereo to mono if needed
if len(audio.shape) > 1:
audio = np.mean(audio, axis=0)
# Resample to 16 kHz (Whisper requirement)
if sr != 16000:
audio = librosa.resample(audio, orig_sr=sr, target_sr=16000)
# Process audio
inputs = processor.feature_extractor(
audio,
sampling_rate=16000,
return_tensors="pt"
).input_features.to(device)
# Generate transcription
with torch.no_grad():
generated_ids = model.generate(
inputs,
max_length=448,
repetition_penalty=1.2,
no_repeat_ngram_size=3,
length_penalty=1.0,
)
# Decode
transcription = processor.tokenizer.batch_decode(
generated_ids,
skip_special_tokens=True
)[0]
return transcription.strip().lower()
# Usage
model_name = "diabolic6045/GitaWhisper-tiny"
processor = WhisperProcessor.from_pretrained(model_name)
model = WhisperForConditionalGeneration.from_pretrained(model_name)
model.config.forced_decoder_ids = None
model.config.suppress_tokens = []
device = "cuda" if torch.cuda.is_available() else "cpu"
model.to(device)
model.eval()
# Transcribe
result = transcribe_sanskrit_audio("your_audio.wav", model, processor, device)
print(result)
from transformers import pipeline
import torch
# Create ASR pipeline
asr = pipeline(
"automatic-speech-recognition",
model="diabolic6045/GitaWhisper-tiny",
device=0 if torch.cuda.is_available() else -1,
)
# Transcribe audio
result = asr(
"path/to/audio.wav",
generate_kwargs={
"max_length": 448,
"repetition_penalty": 1.2,
"no_repeat_ngram_size": 3,
}
)
print(result["text"].strip().lower())
The transliteration text underwent normalization:
.X → X|)Example:
Original: dhṛtarāṣṭra uvāca .dharmakṣetre kurukṣetre
Cleaned: dhṛtarāṣṭra uvāca dharmakṣetre kurukṣetre
siddhimprāpto instead of siddhiṃ prāpto)The model was trained using the following workflow:
Data Preparation (prepare_data.py):
Training (train.py):
Evaluation (evaluate.py):
Comparison (compare_models.py):
📚 For complete training details, hyperparameters, and technical implementation, refer to the Technical Report.
If you use this model, please cite:
@misc{GitaWhisper,
title={Whisper-tiny Fine-tuned for Sanskrit Transliteration},
author={Your Name},
year={2024},
howpublished={\url{https://huggingface.co/diabolic6045/GitaWhisper-tiny}}
}
This model is released under the MIT License, same as the base Whisper model.
For questions or issues, please open an issue on the model repository.