Egyptian Ammiya Whisper (Whisper-small)
Fine-tune of OpenAI Whisper-small (400M params) for Egyptian Arabic (Ammiya / colloquial) transcription.
Out-of-the-box Whisper performs poorly on Egyptian colloquial Arabic because it was trained mostly on Modern Standard Arabic and other dialects. This model was fine-tuned end-to-end on a large Egyptian Ammiya corpus and runs entirely on-device (tested on a single RTX 4070 Super, 16 GB).
Training data
Trained on MAdel121/arabic-egy-cleaned — a merged and cleaned corpus of Egyptian Arabic speech:
- 82,881 audio–transcript pairs (~13 GB), 16 kHz mono
- Sources: ~75.1k Egyptian Arabic speech lines (90.6%), ~4.7k Egyptian Arabic wav recordings, ~2.5k YouTube-collected Egyptian clips, ~630 scripted Egyptian audio clips
- All clips ≤ 30 s (average ~2.5 s), duration-filtered with sanity-checked transcripts
- 98/2 split → ~81.2k train / ~1.7k validation
Training details
| Base model | openai/whisper-small |
| Hardware | Single NVIDIA RTX 4070 Super (16 GB VRAM) |
| Epochs | 3 per 10k-sample subset, 9 sequential subsets (~244k sample views) |
| Batch size | 32 / device + 2 gradient accumulation steps |
| Learning rate | 1e-5, 5% warmup |
| Precision | bf16/fp16 mixed precision, TF32 |
| Memory | Gradient checkpointing, checkpoints every 500 steps |
Because of limited local VRAM, the dataset was divided into 9 subsets of 10k samples and trained sequentially with resumable checkpoints.
Final validation loss: 0.488.
Usage
from transformers import WhisperProcessor, WhisperForConditionalGeneration, pipeline
import torch
processor = WhisperProcessor.from_pretrained(
"adelnazmy2002/egyptian-ammiya-whisper",
language="arabic",
task="transcribe",
)
model = WhisperForConditionalGeneration.from_pretrained(
"adelnazmy2002/egyptian-ammiya-whisper"
)
asr_pipe = pipeline(
"automatic-speech-recognition",
model=model,
tokenizer=processor.tokenizer,
feature_extractor=processor.feature_extractor,
device=0 if torch.cuda.is_available() else -1,
)
result = asr_pipe(
"data/Recording_4.mp3",
generate_kwargs={"language": "arabic", "task": "transcribe"},
)
print(result["text"])
Or via faster-whisper / whisper pipelines — any standard Whisper inference path works, since this is a standard Whisper model checkpoint.
Notes
- Best on Egyptian colloquial (Ammiya) speech; accuracy degrades on other Arabic dialects (expected).
- Optimized for short utterances (the corpus clips average ~2.5 s).
- Trained locally on consumer hardware — see the project write-up for the hardware-limits story.
License
MIT