Accurate Azerbaijani transcription that runs on your own GPU.
Whisper Turbo AZ is a full fine-tune of Whisper large-v3-turbo for Azerbaijani speech-to-text. It continues from LocalDoc/azerbaijani-whisper-turbo, which was already strong, and lowers its word error rate on FLEURS-az test from 13.11% → 10.90%. That is a 16.9% relative reduction.
It writes cased, punctuated text. It was trained to use the previous sentence as context, which helps on long recordings such as meetings, lectures and podcasts. It also has a CTranslate2 / faster-whisper export that transcribes about 28× faster than real time on a laptop RTX 4070.
Table | |
|---|
| Use it for | Interviews, meetings, lectures, podcasts, voice notes, subtitles, voice interfaces |
| Input | 16 kHz mono audio, any length (long audio is chunked in 30 s windows) |
| Output | Azerbaijani text in Latin script, cased and punctuated |
| Formats | 🤗 Transformers (this repo) · CTranslate2 fp16 for faster-whisper (whisper-turbo-az-ct2) · ONNX for transformers.js / WebGPU (whisper-turbo-az-onnx) |
| Try it | Live browser demo: runs on your own device, no upload |
Results
FLEURS-az test, all 921 utterances. Every model was scored with the same script: faster-whisper, fp16, beam 5, no VAD, language="az". Text is normalised the same way as in the LocalDoc evaluation: NFC, lowercase, punctuation removed.
Table with columns: Model, WER ↓, CER ↓, Relative WER| Model | WER ↓ | CER ↓ | Relative WER |
|---|
| LocalDoc/azerbaijani-whisper-turbo (starting point) | 13.11% | 3.39% | — |
| Whisper Turbo AZ v1 (filtered data + context training) | 11.72% | 3.06% | −10.6% |
| Whisper Turbo AZ v2 (this model) | 10.90% | 2.86% | −16.9% |
Head-to-head with a commercial API
This comparison uses the first 200 FLEURS-az test clips with the same normalisation. OpenAI gpt-transcribe was called through its API.
Table with columns: Model, WER ↓, CER ↓, Where it runs| Model | WER ↓ | CER ↓ | Where it runs |
|---|
| OpenAI gpt-transcribe | 10.70% | 3.14% | Paid cloud API |
| Whisper Turbo AZ v2 | 11.64% | 2.85% | Your GPU, offline, free |
| Whisper Turbo AZ v1 | 12.35% | 2.99% | Your GPU, offline, free |
| LocalDoc turbo | 13.42% | 3.24% | Your GPU, offline, free |
On character error rate, v2 makes 9% fewer errors than gpt-transcribe. Its word error rate is within one point of the API. The low CER suggests that many of the remaining word errors are small spelling or suffix differences, not missing words.
Sample transcriptions (FLEURS-az test)
Table with columns: Text | Text |
|---|
| Reference | sundarban 1966-cı ildən bəri vəhşi təbiət qoruğudur ərazidə indi 400 benqal pələnginin … |
| LocalDoc turbo | sundurban 1966-cı ildən bəri vəhşi təbiət qorxmuşdur ərazidə indi 400 benqal pələnginin … |
| v2 | sundarban 1966-cı ildən bəri vəhşi təbiət qoruğundur ərazidə indi 400 benqal pələnginin … |
| Reference | … ev pişiklərinin böcəklər gəmiricilər kərtənkələlər və quşlar kimi … |
| LocalDoc turbo | … ev pişiklərinin böcəklər gəmircilər kərtənkələrlər və quşlar kimi … |
| v2 | … ev pişiklərinin böcəklər gəmiricilər kartankələrlər və quşlar kimi … |
Quick start
import torchfrom transformers import pipeline asr = pipeline( "automatic-speech-recognition", model="hasan0v/whisper-turbo-az", torch_dtype=torch.float16, device="cuda:0", # or "cpu") result = asr( "audio.wav", generate_kwargs={"language": "az", "task": "transcribe"}, chunk_length_s=30, # long-form audio batch_size=8,)print(result["text"])
⚡ faster-whisper (recommended for production)
from faster_whisper import WhisperModel model = WhisperModel("hasan0v/whisper-turbo-az-ct2", device="cuda", compute_type="float16") segments, info = model.transcribe( "audio.wav", language="az", beam_size=5, vad_filter=True, # skip silence condition_on_previous_text=True, # the model was trained to use this context)for s in segments: print(f"[{s.start:6.1f} → {s.end:6.1f}] {s.text}")
On CPU, use device="cpu", compute_type="int8". For high throughput on long files, use faster_whisper.BatchedInferencePipeline.
How it was built
- Label cleaning. The starting model transcribed all 345,643 clips (329.6 h) of
LocalDoc/azerbaijani_asr. Clips whose reference disagreed with that transcript by more than 30% CER were dropped: 11,733 clips, or 5.4 h. Most of them were sub-2-second fragments with broken alignments.
- Context packing. Consecutive segments from the same source recording were merged into windows of up to 29.5 s. In 30% of samples, the previous window's text was given as a
<|startofprev|> prompt. The result was 70,407 windows totalling 338.4 h, with a median length of 17 s. About 20% of windows were cut to shorter random lengths so the model still handles short utterances well.
- Training v1. A full fine-tune on one H100 for 2,200 steps.
- Extra data. v1 was used as a teacher:
- Audiobooks (
asmarhajizada/azerbaijani-audiobooks): only segments where v1 agrees with the book text (CER ≤ 0.2) were kept, giving 25.1 h. The previous text comes from the same book chapter.
- YODAS2
az000: v1 pseudo-labelled the audio with VAD and beam 5. Segments passed only if avg_logprob > −0.5, no_speech_prob < 0.5 and compression_ratio < 2.2, and any output in Cyrillic script was rejected. This gave 10.9 h.
- FLEURS-az train: 9.25 h.
- Training v2. Continued from v1's best checkpoint for 900 steps, with the new data repeated twice.
- Leak check. Every training window was compared against all 491 normalised FLEURS test and dev sentences. 0 matches were found in any source.
The early rise in dev WER during v1 is the usual effect of learning-rate warm-up on a model that is already strong. v1 passes the starting point at around step 1,300 and keeps improving. v2 picks up from v1's best checkpoint and reaches 11.99% dev WER.
Hyperparameters
Table with columns: v1, v2 | v1 | v2 |
|---|
| Initialisation | LocalDoc/azerbaijani-whisper-turbo | v1 best checkpoint |
| Data | LocalDoc ASR (filtered, packed) | v1 data + audiobooks, YODAS2, FLEURS train (×2) |
| Steps | 2,200 | 900 |
| Effective batch | 64 (16 × 4 grad. accumulation) | 64 |
| Peak LR / schedule | 1e-5, cosine, 220 warm-up | 5e-6, cosine, 90 warm-up |
| Optimiser | AdamW (β = 0.9 / 0.98, wd 0.01), grad-clip 1.0 | same |
| Precision | bf16 autocast | bf16 autocast |
| Augmentation | SpecAugment (time 0.05, freq 0.05) | same |
| Context prompt | previous text, p = 0.3, ≤ 200 tokens | same |
| Checkpoint selection | best FLEURS-az dev WER, evaluated every 250 steps | same |
| Hardware | 1 × NVIDIA H100 80 GB, about 1.6 s/step | same |
The whole project cost under $10 of cloud GPU. That covers data filtering, packing, pseudo-labelling and both training runs.
Limitations
- The model is tuned for Azerbaijani in Latin script. Other languages, and Azerbaijani written in Cyrillic or Arabic script (South Azerbaijani), are out of scope.
- Heavy dialects, strong code-switching with Russian, Turkish or English, and noisy far-field audio will have higher error rates than FLEURS read speech.
- Numbers may come out as digits or as words, depending on context.
- Like every Whisper model, it can occasionally hallucinate text during long silences or music.
vad_filter=True in faster-whisper avoids most of this.
- Do not use it as the only source for high-stakes decisions, such as legal or medical transcripts, without human review.
Training data and licences
The model weights are released under Apache 2.0, the same licence as the base model. Please check each dataset's own terms if you use this model commercially.
Azərbaycanca
Whisper Turbo AZ Azərbaycan dilində nitqi mətnə çevirən modeldir. O, Whisper large-v3-turbo əsasında qurulub və LocalDoc modelindən davam etdirilib. FLEURS-az test dəstində WER 13.11%-dən 10.90%-ə endirilib. Model mətni böyük-kiçik hərflə və durğu işarələri ilə yazır. Uzun audioda əvvəlki cümləni kontekst kimi istifadə edir. Öz GPU-nuzda, internetsiz və pulsuz işləyir. Sürətli inference üçün whisper-turbo-az-ct2 versiyasını faster-whisper ilə istifadə edin.
Citation
@misc{hasanov2026whisperturboaz, title = {Whisper Turbo AZ: Azerbaijani Speech Recognition with Whisper large-v3-turbo}, author = {Hasanov, Ali}, year = {2026}, howpublished = {\url{https://huggingface.co/hasan0v/whisper-turbo-az}}}
Thanks to LocalDoc for the base model and datasets, to the FLEURS, YODAS2 and Azerbaijani audiobooks contributors, and to OpenAI for Whisper.