Quick start
Transcript with speakers (recommended)
hf download eek/whisper-turbo-ro-en transcribe.py requirements.txt requirements-speakers.txt --local-dir vorbacd vorbapip install -r requirements.txt # transcripts (faster-whisper)pip install -r requirements-speakers.txt # only for --speakers (PyTorch + NVIDIA NeMo) python transcribe.py interview.m4a # plain transcriptpython transcribe.py interview.m4a --speakers # [00:01.20] S1: ...python transcribe.py interview.m4a --speakers --srt out.srt --json out.jsonpython transcribe.py clip.mp4 --language auto --mode cover # detect language; dense speech
transcribe.py reads any audio or video file FFmpeg can decode, runs on a GPU when one is
available (otherwise on the CPU, slower), and downloads the models on first use. Options:
Table with columns: Option, Meaning| Option | Meaning |
|---|
--language ro|en|auto | force the language (default ro; Romanian also handles Romglish) or detect it |
--mode native (default) | Whisper's own 30 s seeking. Best for far-field speech, children, conversations |
--mode cover | windows that end in pauses, each prompted with the previous window's text. Best for clean, dense speech (videos, podcasts), and silent on music |
--speakers | add the diarization model; each word gets a speaker (needs NVIDIA NeMo, see requirements) |
--json, --srt | write words with times and speakers, or subtitles |
faster-whisper directly (long audio, fastest)
The folder ctranslate2-int8/ is a CTranslate2 int8 conversion.
from faster_whisper import WhisperModelfrom huggingface_hub import snapshot_download path = snapshot_download("eek/whisper-turbo-ro-en", allow_patterns=["ctranslate2-int8/*"]) + "/ctranslate2-int8"model = WhisperModel(path, device="cuda", compute_type="int8_float16") # CPU: device="cpu", compute_type="int8"segments, info = model.transcribe( "audio.wav", language="ro", beam_size=5, condition_on_previous_text=False, word_timestamps=True)for s in segments: print(f"[{s.start:6.2f} → {s.end:6.2f}] {s.text}")
Keep condition_on_previous_text=False: Whisper's default of prompting each window with the
previous text makes this model (like most fine-tunes) loop or skip on long recordings.
The repository root holds the model in Hugging Face format (fp16 safetensors).
import torchfrom transformers import pipeline asr = pipeline("automatic-speech-recognition", model="eek/whisper-turbo-ro-en", dtype=torch.float16, device="cuda:0")print(asr("clip.wav", generate_kwargs={"language": "ro", "task": "transcribe"})["text"])
For audio longer than 30 seconds prefer faster-whisper or transcribe.py.
Output conventions
- Verbatim, as a careful transcriber would write it: casing, punctuation, colloquial spellings
kept (
acuma, aicea, anu), numbers usually as digits.
[S1] … [S2] … marks speaker changes inside one 30 s window only. The labels restart in every
window, so strip them (re.sub(r"\[S\d+\]\s*", "", text)) or use the diarization model for
recording-level speakers. transcribe.py does the latter.
- The saved generation config un-suppresses the
[, [ and ] tokens (Whisper suppresses
them by default); keep it if you copy the model elsewhere, or the tags cannot be produced.
- With
suppress_blank=False (as transcribe.py --mode cover decodes) the model returns nothing
on music and silence instead of Whisper's classic "Mulțumesc pentru vizionare!".
Benchmarks
Word error rate (%), lower is better, normalized with Gladia's LLM_MARKDOWN_PROTECTED_25
preset plus a Romanian plug-in (diacritics folded, colloquial spellings kept distinct, spoken
numbers as digits).
Compared with other Romanian models
- Best average over nine public Romanian test sets: 7.9. The closest third-party model,
jackrabbit-110m-ro with its 4-gram LM, averages 9.7; OpenAI's Whisper large-v3 averages 12.1.
- Largest lead on spontaneous and conversational speech: Romanian films 13.8 (best
third-party model: 19.4), spontaneous online videos 13.3 (16.5) and a far-field household
conversation with children 15.7 (26.4).
- Best on parliament speech in ROMPAR (Romanian and Moldovan): 9.8, against 11.2 for the
closest third-party model.
- Romanian and English in one model: FLEURS English 5.5, near stock Whisper's 4.6. The
Romanian specialists that come closest on Romanian transcribe Romanian only.
- Read speech and the European Parliament remain jackrabbit's strength: Common Voice 1.9 vs
2.5, VoxPopuli 5.7 vs 7.2.
Table with columns: #, Model, Avg. (9 RO sets), FLEURS ro, FLEURS en, Films, Spontaneous, Common Voice, Household, ROMPAR, VoxPopuli, Podcasts, Audiobooks, Stories| # | Model | Avg. (9 RO sets) | FLEURS ro | FLEURS en | Films | Spontaneous | Common Voice | Household | ROMPAR | VoxPopuli | Podcasts | Audiobooks | Stories |
|---|
| 1 | This model | 7.9 | 5.8 | 5.5 | 13.8 | 13.3 | 2.5 | 15.7 | 9.8 | 7.2 | 8.3 | 4.9 | 5.5 |
| 2 | Previous version of this model (ft-w6) | 8.3 | 6.1 | 5.4 | 13.8 | 13.6 | 2.7 | 17.5 | 10.5 | 7.8 | 8.4 | 5.1 | 6.3 |
| 3 | Our Parakeet TDT 0.6B v3 fine-tune + 5-gram LM (unreleased) | 8.7 | 5.9 | 5.4 | 16.4 | 14.4 | 2.2 | 21.4 | 10.0 | 7.5 | 8.1 | 6.5 | 7.2 |
| 4 | surogate/jackrabbit-110m-ro, CTC + 4-gram LM | 9.7 | 6.1 | 96.8 | 19.8 | 16.5 | 1.9 | 30.3 | 11.2 | 5.7 | 10.4 | 7.1 | 8.4 |
| 5 | Our SpeD 110M fine-tune (unreleased) | 10.7 | 8.9 | 98.3 | 20.7 | 17.0 | 2.6 | 35.8 | 11.7 | 8.0 | 8.6 | 8.5 | 10.3 |
| 6 | surogate/jackrabbit-110m-ro, TDT | 10.9 | 8.2 | 98.1 | 22.3 | 18.2 | 2.0 | 32.5 | 11.6 | 6.3 | 10.4 | 9.1 | 9.8 |
| 7 | openai/whisper-large-v3 | 12.1 | 8.1 | 4.2 | 19.4 | 20.0 | 5.3 | 26.4 | 17.7 | 11.5 | 10.4 | 7.3 | 9.3 |
| 8 | IonGrozea/whisper-large-v3-turbo-ro | 12.1 | 9.3† | 9.5 | 22.6 | 14.2† | 3.2† | 40.6 | 17.8 | 11.5† | 12.1 | 8.5 | 10.0 |
| 9 | nvidia/canary-1b-v2 | 12.7 | 6.5 | 4.7 | 27.0 | 21.1 | 8.2 | 31.4 | 14.6 | 6.3 | 11.3 | 8.9 | 10.1 |
| 10 | BuzzASR/romanian (large-v3) | 12.9 | 9.0 | 4.6 | 23.6 | 19.8 | 4.1† | 29.0 | 17.9 | 10.5 | 10.9 | 8.3 | 12.1 |
| 11 | VMadalina/whisper-large-news-augmented2 | 13.4 | 11.5 | 41.9 | 25.6 | 19.9 | 5.6 | 31.4 | 16.8 | 10.9 | 9.3 | 10.6 | 10.1 |
| 12 | upb-nlp/ro-fast-conformer | 13.6 | 9.4 | 87.2 | 29.5 | 21.4 | 2.6 | 52.6 | 15.6 | 6.9 | 14.3 | 9.7 | 12.7 |
| 13 | SpeD ParakeetRomanian 110M, TDT | 13.8 | 10.0 | 99.3 | 27.3 | 21.7 | 3.2 | 79.2 | 13.9 | 10.4 | 13.4 | 10.9 | 13.3 |
| 14 | openai/whisper-large-v3-turbo | 14.3 | 9.0 | 4.6 | 25.2 | 25.9 | 10.9 | 28.8 | 17.1 | 12.9 | 10.5 | 7.4 | 9.5 |
| 15 | nvidia/parakeet-tdt-0.6b-v3 | 17.2 | 12.4 | 5.1 | 32.9 | 24.8 | 9.8 | 48.9 | 22.3 | 9.5 | 14.7 | 13.4 | 15.1 |
| 16 | TransferRapid/whisper-large-v3-turbo_ro | 18.6 | 17.9 | 12.5 | 31.8 | 27.6 | 0.7† | 63.8 | 25.6 | 18.0 | 18.4 | 13.8 | 13.9 |
| 17 | readerbench/whisper-ro (small) | 20.0 | 16.1 | 97.5 | 39.8 | 29.5 | 1.9 | 46.9 | 25.9 | 12.5 | 19.9 | 17.2 | 17.6 |
| 18 | facebook/mms-1b-all (ron) | 20.9 | 12.7 | 18.1 | 41.6 | 30.6 | 5.5 | 66.4 | 29.1 | 11.3 | 23.9 | 15.5 | 18.0 |
| 19 | VladS159/Whisper_medium_ro | 21.5 | 16.1 | 6.2 | 32.8 | 30.8 | 2.4† | 74.0 | 36.2 | 12.6 | 24.6 | 16.4 | 21.6 |
| 20 | gigant/whisper-medium-romanian | 21.8 | 16.3 | 6.9 | 33.4 | 30.0 | 2.2† | 76.4 | 36.4 | 12.8 | 29.6 | 16.3 | 19.0 |
| 21 | FraPiz/whisper-large-v3-turbo-moldovan-romanian | 21.8 | 14.1 | 9.0 | 35.2 | 23.4 | 6.2 | 195.2 | 44.7 | 11.7 | 32.3 | 14.7 | 13.7 |
| 22 | upb-nlp/ro-wav2vec2 (greedy) | 26.5 | 24.3 | 99.4 | 50.7 | 37.2 | 9.5 | 82.3 | 29.4 | 12.1 | 26.2 | 19.9 | 29.0 |
| 23 | Qwen3-ASR 1.7B | 26.9 | 18.9 | 3.2 | 45.8 | 34.2 | 19.3 | 49.6 | 30.8 | 16.6 | 21.8 | 27.1 | 27.7 |
| 24 | Omnilingual ASR CTC 300M | 30.1 | 25.7 | 18.6 | 51.6 | 38.4 | 21.4 | 65.1 | 36.4 | 15.6 | 25.2 | 26.7 | 29.6 |
| 25 | racai/wav2vec2-base-100k-voxpopuli-romanian | 35.2 | 33.6 | 99.7 | 61.8 | 44.9 | 14.7 | 95.2 | 40.9 | 15.3 | 35.6 | 29.0 | 40.8 |
| 26 | gigant/romanian-wav2vec2 (XLS-R, greedy) | 50.9 | 55.3 | 99.7 | 76.2 | 62.8 | 9.9† | 90.0 | 61.7 | 38.4 | 50.7 | 46.7 | 56.2 |
Every Romanian-capable model we could run, on every public Romanian test set with human
transcripts that can be downloaded without an access request, plus the household conversation
described below. Greedy decoding except where an n-gram LM is named; the language is forced to
Romanian (English for FLEURS en) where a model takes one. "Avg." is the unweighted mean of the
nine public Romanian sets (FLEURS en and the household conversation are not in it); the
household conversation is decoded in 28 s chunks cut at pauses. Clips longer
than 30 s are left out (6 in VoxPopuli, 27 in USPDATRO) because Whisper decodes one 30-second
window. Best comparable score in each column in bold. † The model's card says it was trained on
this set or on an overlapping Common Voice release, so that score is not comparable.
Table with columns: Set, Speech, Clips, Hours| Set | Speech | Clips | Hours |
|---|
| FLEURS test | read | 883 | 2.5 |
| RO-N3WS films | Romanian films, conversational | 4,723 | 8.3 |
| USPDATRO ("Spontaneous") | spontaneous and dialectal, from online videos | 2,610 | 3.7 |
| Common Voice 21.0 test (mirror) | read, crowd-sourced | 3,929 | 4.6 |
| VoxPopuli test | European Parliament | 1,377 | 4.2 |
| RO-N3WS podcasts | conversational | 1,723 | 3.4 |
| RO-N3WS audiobooks | read | 2,475 | 4.3 |
| RO-N3WS children's stories | narrated | 2,821 | 4.7 |
| ROMPAR test | Romanian and Moldovan parliament | 1,490 | 1.9 |
- jackrabbit (training data not disclosed) and our 110M model are strongest on read speech and
the European Parliament but fall behind on spontaneous speech (films, USPDATRO, the household
conversation), and they transcribe Romanian only (FLEURS en near 100%).
- ROMPAR's annotators reconstructed word endings cut off by its segmentation, in brackets; the
brackets are removed and the full words kept. This model's training text shares no 8-word
sequence with ROMPAR's test transcripts apart from three institutional phrases (such as the
name of a law).
- upb-nlp/ro-wav2vec2 and gigant/romanian-wav2vec2 ship an n-gram LM that was not used here, so
their published figures are lower.
- FraPiz's model loops on the household recording (195%).
- Not included: Echo (gated), the SpeD RSC/SSC/CDEP sets and SWARA (by request), and models that
need another runtime (moondream/parakeet-ultra).
Against stock Whisper turbo
"Private" sets are held-out conversational recordings that were never trained on; their
references are machine transcripts unless marked human.
Table with columns: Test set, Reference, Whisper turbo (stock), This model| Test set | Reference | Whisper turbo (stock) | This model |
|---|
| FLEURS Romanian test | human | 9.0 | 5.79 |
| FLEURS English test | human | 4.6 | 5.48 |
| Private Romanian conversational set, 19 h | machine | 10.6 | 3.82 |
| Private Romanian set from newer recordings, 10 h | machine | 9.8 | 3.61 |
| Same 19 h set, against independent third-party captions | captions | 16.7 | 12.7 |
| Private English conversational set, 4 h | machine | 3.7 | 2.80 |
| Romanian clips under 3 s | machine | 48.6 | 13.3 |
| English words inside Romanian speech | machine | 26.6 | 10.9 |
| Household conversation: one adult, two children, far-field, 5 min, 28 s chunks | human | 28.8 | 15.7 |
For scale: the machine references and the independent captions disagree with each other by
11.9%, and the best commercial system we tried scores 4.2 on the household conversation.
Household conversation decoded whole with --mode native: 13.5. Whole recordings of 30–600 s,
--mode cover: Romanian 4.00, English 1.71. Speaker-attributed WER (cpWER) on multi-speaker
recordings with the companion diarization model, --mode cover: 15.2 (Romanian) and 15.1
(English). On 132 Romanian and 29 English music-or-silence clips the model outputs 3 and 1
words in total in cover mode.
Languages it was not trained on
FLEURS test with the correct language token forced. Each round of Romanian training has
eroded these further (mean 54.9 for the previous version). Use stock Whisper for them:
Table with columns: Language, Whisper turbo (stock), This model| Language | Whisper turbo (stock) | This model |
|---|
| German | 4.56 | 22.91 |
| Spanish | 2.86 | 23.23 |
| French | 5.11 | 38.35 |
| Italian | 3.77 | 29.13 |
| Portuguese | 4.16 | 66.23 |
| Polish | 5.95 | 71.67 |
| Hungarian | 15.10 | 73.53 |
| Russian | 5.45 | 177.56 |
| Turkish | 6.97 | 108.06 |
| Ukrainian | 7.45 | 139.05 |
| Mean | 6.1 | 75.0 |
Training
Fine-tuned on a private dataset of Romanian and English speech, mostly conversational, in six
stages,
each continuing from the previous best (full fine-tune, bf16, AdamW, cosine schedule):
- Romanian segments plus about 10% English, lr 1e-5, one epoch.
- More and longer recordings, packed to 28 s, lr 5e-6.
- Conversation windows of up to 28 s with
[S#] speaker turns, timestamps on half the windows,
the previous window's text as prompt on half, speed perturbation, SpecAugment, and
no-speech windows with empty targets; lr 5e-6.
- A half pass at lr 3e-6 that also grows windows into their quiet surroundings and splices in
no-speech audio, so windows that open with music are transcribed correctly.
- One more full pass with stage 4's recipe at lr 5e-6 over a larger version of the dataset
(about 45% more Romanian): the previous version,
ft-w6.
- This model: one more full pass with the same recipe over a larger version again: about 30%
more conversational Romanian, plus about 400 hours of formal speech whose reference text was
reproduced word for word by a speech recognizer.
About 10% English throughout kept English from degrading.
Limitations
- Children, far-field microphones and overlapping speakers are much harder: on the household
conversation the error (15.7 in 28 s chunks) is several times that of the best commercial
system (4.2).
- The training references were not human-verified, so the model inherits some of their
conventions and mistakes.
- Read-speech English is slightly worse than stock Whisper (5.5 vs 4.6 on FLEURS).
- Use stock Whisper for other languages. Languages other than Romanian and English were
not trained and degraded badly, even with the correct language token: mean FLEURS WER over
German, Spanish, French, Italian, Portuguese, Polish, Hungarian, Russian, Ukrainian and
Turkish is 6.1 for stock Whisper and 75.0 for this model (54.9 for the previous version), and
output drifts into Romanian spelling.
- In
cover mode, English music-only windows still produce a few words now and then.
Licence
MIT, the same licence as the base model (OpenAI Whisper): use, modify and redistribute it
freely, commercial use included, keeping the notice in LLM_MARKDOWN_PROTECTED_33. This covers the
weights, the CTranslate2 conversion and transcribe.py. The fine-tuning data is private and is
not distributed.