CzechSpeech by Moravian AI

CzechSpeech: Czech speech to text on the device

CzechSpeech is Whisper large-v3-turbo fine-tuned on Czech speech by Moravian AI. It transcribes parliamentary speech, read speech and speech in noise more accurately than the open models we tried. Quantised to 4 bits it fits in 452 MiB and runs offline on a laptop and on an ordinary phone: 6.9 s of speech in 2.7 s on a Pixel 9a, on the processor alone.

Dual licence: free for non-commercial use under CC BY-NC 4.0; a commercial licence is available from Moravian AI: info@moravian.ai.

Accuracy against open models

Word error rate (WER, lower is better) on the same segments with the same text normalisation and greedy decoding for every model, laptop with an RTX 4050. Numbers: share of numeric entities transcribed correctly. Legal terms: share of legal terms from our list transcribed correctly. Both on the parliamentary set.

model parameters parliament FLEURS noise numbers legal terms
CzechSpeech 0.81 B 1.8 % 7.3 % 6.5 % 99.3 % 99.5 %
NVIDIA Canary-1b-v2 0.98 B 7.5 % 8.4 % 22.4 % 94.8 % 94.2 %
Whisper large-v3, fine-tuned on Czech Common Voice 13 1.55 B 8.0 % 9.6 % 29.1 % – –
Whisper large-v3 1.55 B 8.1 % 10.2 % 27.8 % – –
Whisper large-v3-turbo (the starting point) 0.81 B 9.5 % 11.4 % 29.5 % 96.5 % 96.3 %
NVIDIA Parakeet-TDT-0.6b-v3 0.6 B 10.3 % 11.9 % 25.8 % 94.6 % 92.1 %
  • Parliament: the test split of ParCzech4Speech, 729 segments (106 min): random segments, segments with numbers and segments with legal terms. The speakers of the test and validation splits were removed from training.
  • FLEURS: the Czech test set, 723 sentences (147 min).
  • Noise: the parliamentary segments with reverberation and crowd babble at 10 dB signal-to-noise ratio.
  • Parliamentary speech is the training domain of CzechSpeech and the FLEURS training split was in its training data too. The least favourable comparison is therefore FLEURS: 7.3 % against 8.4 % for Canary-1b-v2.
  • CzechSpeech in whisper.cpp without timestamps (8-bit file); Whisper large-v3 and its Czech fine-tune in whisper.cpp; Canary-1b-v2 and Parakeet-TDT-0.6b-v3 in ONNX (fp32). –: not measured.

Files

file for size WER parliament / FLEURS / noise
model.safetensors + config and tokenizer transformers, 16-bit 1.5 GiB 1.8 / 7.6 / 6.4 % (transformers, greedy)
ggml-czechspeech-q5_0.bin whisper.cpp on a laptop or desktop (GPU or CPU) 547 MiB 1.8 / 7.4 / 6.6 %
ggml-czechspeech-q4_0.bin whisper.cpp on phones and ARM CPUs 452 MiB 1.9 / 7.7 / 6.8 %

The whisper.cpp files are GPTQ quantisations with Czech calibration data (512 segments from the training mix) onto the q5_0 and q4_0 grids: 5 bits lose nothing against 8 bits, 4 bits lose 0.1 to 0.3 points of WER. On ARM CPUs with the i8mm instructions q4_0 is about 4× faster than q5_0, because ggml repacks q4_0 weights for them.

device file memory speed
Pixel 9a phone, processor only, 4 threads q4_0 0.83 GB RAM at the peak 6.9 s of speech in 2.7 s
Laptop with an RTX 4050 (6 GB) q5_0 0.89 GB GPU memory 0.33 s per segment (median), about 25× faster than real time

Usage

transformers:

import torch
from transformers import WhisperForConditionalGeneration, WhisperProcessor

processor = WhisperProcessor.from_pretrained("moravianai/CzechSpeech")
model = WhisperForConditionalGeneration.from_pretrained("moravianai/CzechSpeech", dtype=torch.float16).to("cuda")

# audio: a float32 array, 16 kHz, mono, up to 30 s
features = processor(audio, sampling_rate=16000, return_tensors="pt").input_features.to("cuda", torch.float16)
ids = model.generate(features, language="cs", task="transcribe")
print(processor.batch_decode(ids, skip_special_tokens=True)[0])

whisper.cpp:

whisper-cli -m ggml-czechspeech-q5_0.bin -l cs -nt -f recording.wav
  • Decode without timestamps (-nt in whisper.cpp). CzechSpeech was trained without timestamps; with timestamps whisper.cpp sometimes starts the transcript with a stray word.
  • Short utterances: the encoder can process only the recorded speech instead of the fixed 30-second window (audio_ctx in whisper.cpp: ceil(samples / 320) + 32 frames, rounded up to a multiple of 16). CzechSpeech keeps its accuracy without retraining (parliament 1.81 %, FLEURS 7.57 %, noise 6.87 % with this margin) and the encoder work drops in proportion to the length of the speech; this is what makes the phone faster than real time.
  • Recordings longer than 30 s need to be split, as with any Whisper model.

Training

  • Base model: openai/whisper-large-v3-turbo.
  • Data: ParCzech4Speech 1.0, unsegmented variant (1 336 h, CC BY 4.0), YODAS-Granary Czech (65 h, twice, CC BY 3.0), FLEURS cs_cz train (8.4 h, three times, CC BY 4.0) and VoxPopuli Czech (5.8 h, twice, CC0); 1 503 h in total, segments of 1 to 30 s, without timestamps. The speakers of the evaluation splits were removed.
  • Compute: 24 968 steps on the LUMI supercomputer.

Limitations

  • Most of the training data is parliamentary speech: a formal register with many numbers and legal terms. Spontaneous conversation, dialects and telephone audio were not measured.
  • Transcription only: no translation, speaker separation or timestamps; no analysis of emotions or tone of voice.
  • Numbers are written mostly as digits, following the ParCzech transcripts.

Licence and attribution

  • CzechSpeech weights, dual licence: © 2026 Jan Rosecký (Moravian AI).

  • Base model: Whisper large-v3-turbo, © 2022 OpenAI, MIT licence (see NOTICE.md).

  • Training data: ParCzech4Speech 1.0 (Stankov, Kopp et al., ÚFAL MFF UK, arXiv 2509.06675), YODAS-Granary (ESPnet, NVIDIA Granary), FLEURS (Google, arXiv 2205.12446) and VoxPopuli (Meta).

  • Header painting: © Jan Bébar, used with the author's permission.

Acknowledgements

We acknowledge the EuroHPC Joint Undertaking for awarding this project access to the EuroHPC supercomputer LUMI, hosted by CSC (Finland) and the LUMI consortium.

Results and details: moravian.ai/czechspeech · contact: info@moravian.ai

Downloads last month
-
Safetensors
Model size
0.8B params
Tensor type
F16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for moravianai/CzechSpeech

Finetuned
(675)
this model

Datasets used to train moravianai/CzechSpeech

Papers for moravianai/CzechSpeech