Ak Kula kanatlarını açtığında…
balbal-v2
A small Turkish speech recognition model that runs fast on a CPU (45M parameters, 15M outside the memory table): Conformer-CTC with the balbal looped refiner and a product-key acoustic memory, decoded with a 6-gram token KenLM. Trained on about 5,000 hours of audio.
- Fast on a CPU: 236× faster than real time on 8 threads.
- Phone calls: 9.46% WER / 18.44% sigWER on Mu-Bench Turkish (official harness, GPT-4.1 judge), down from 11.93 / 25.18 for balbal-v1.
- Read speech: 5.22% WER on FLEURS Turkish test (balbal-v1: 6.54).
Larger and more accurate sibling: balbal-v2-manas (313M parameters, Turkish and English). Code (Apache 2.0): https://github.com/erayyap/balbal
Model page, benchmarks, browser demo and Android app: erayy.com/balbal · Türkçe
Model
| Part | Details |
|---|---|
| Acoustic model | Conformer-CTC, 16 layers, d_model 176, 80 mel, 4x subsampling (40 ms frames) |
| Looped refiner | 2-layer Transformer refiner (width 192) on top of the encoder output, 3 passes (each pass takes the previous CTC distribution as input) |
| Acoustic memory | Product-key memory: 500×500 subkeys, 4 heads, top-16, value dim 120, 3-frame context |
| Vocabulary | SentencePiece 1,024 pieces + CTC blank |
| Language model | 6-gram token KenLM over the SentencePiece pieces |
| Parameters | 45.4M, of which 30.0M are the memory table (only a few of its rows are read per frame) |
Output is cased, punctuated text with per-word timestamps. Numbers come out as digits through the inverse text normalization in the code
(--no-itn keeps the spoken words). Audio longer than 30 s is cut into 30 s chunks. balbal-v2 is a Turkish model; it also transcribes
English, at a lower accuracy (below).
Results
Turkish
FLEURS tr test (743 clips) and Mu-Bench tr-TR (846 phone-call clips); balbal models with KenLM decoding, the other open models with their default inference. FLEURS is scored with balbal-normalizer
(balbal/normalizer in the code repository); Mu-Bench with its official harness and GPT-4.1 judge. sigWER is the share of utterances with
at least one meaning-changing error. CPU speed: seconds of audio per second of processing, same 100 clips, batch 1, 8 threads of an AMD Ryzen
AI Max+ 395.
| Model | Parameters | Mu-Bench WER | Mu-Bench sigWER | FLEURS WER / CER | CPU speed |
|---|---|---|---|---|---|
| balbal-v2-manas | 313M | 8.20 | 14.89 | 4.06 / 1.21 | 123× |
| balbal-v2 | 45M | 9.46 | 18.44 | 5.22 / 1.52 | 236× |
| Mihu AI STT-v2 | 66M | 10.91 | 21.16 | 5.26 / 1.62 | 16× |
| balbal-v1 | 45M | 11.93 | 25.18 | 6.54 / 1.85 | 96× |
| Qwen3-ASR 1.7B | 1.7B | 14.76 | 30.61 | 6.52 / 1.71 | 0.8× |
| Duyu-small | 49M | 15.70 | 35.22 | 6.62 / 1.88 | 30× |
| UfakZeka Kulak | 32M | 17.87 | 38.18 | 6.72 / 1.98 | 152× |
| Seda v0.2 | 66M | 17.92 | 34.52 | 6.20 / 1.96 | 19× |
| omniASR LLM 7B | 7B | 21.10 | 44.68 | – | – |
| Whisper large-v3-turbo | 809M | 24.65 | 47.04 | 4.07 / 1.18 | 1.6× |
| Whisper large-v3 | 1.55B | – | – | 3.71 / 1.08 | 0.9× |
| omniASR CTC 7B | 7B | – | – | 7.71 / 1.91 | 2.4× |
English
The 8 English Open ASR Leaderboard test sets (168 hours), scored with the leaderboard's English normalizer, KenLM decoding. WER %.
| Model | LibriSpeech clean | LibriSpeech other | AMI | Earnings-22 | VoxPopuli | GigaSpeech | SPGISpeech | TED-LIUM | Average |
|---|---|---|---|---|---|---|---|---|---|
| balbal-v2 | 10.32 | 19.35 | 31.52 | 30.86 | 18.18 | 23.43 | 16.17 | 14.96 | 20.60 |
| balbal-v2-manas | 2.97 | 6.45 | 13.31 | 15.61 | 7.82 | 12.30 | 5.73 | 5.20 | 8.67 |
Files
model.json {"model": "balbal-v2"}
model.pt PyTorch weights (175 MB)
tokenizer/ SentencePiece model, vocab
lm/model.binary 6-gram token KenLM, no KIRAAT text (482 MB)
lm/tokenizer.model same SentencePiece model
onnx/model.onnx (+ .data) fast CPU graph: balbal custom operators (102 MB)
onnx/model-plain.onnx (+ .data) same model, standard onnxruntime operators only (187 MB)
This folder is the MODEL_DIR the code expects. Both ONNX graphs match PyTorch within 0.04 WER points on our Turkish dev set.
The KenLM in lm/ is built without KIRAAT text. Removing it does not cost accuracy; on our Turkish dev set (721 clips), WER / CER %:
| KenLM | balbal-v2-manas | balbal-v2 |
|---|---|---|
| with KIRAAT text | 7.16 / 2.79 | 8.85 / 3.38 |
| without KIRAAT text (released) | 7.13 / 2.79 | 8.74 / 3.33 |
Usage
Linux x86-64, Python 3.11 or 3.12:
pip install balbal
balbal run speech.wav # downloads this model on the first run
balbal run --json speech.wav # text + per-word timestamps
import balbal
model = balbal.load("balbal-v2")
print(model.transcribe("speech.wav")["text"])
The balbal library ships the fast graph's custom operators and the native beam decoder prebuilt.
From source (Linux x86-64, Python 3.12):
git clone https://github.com/erayyap/balbal && cd balbal
pip install -r requirements/cpu.txt
python inference/build_native.py # KenLM beam decoder
inference/kernels/build.sh # custom operators of the fast graph
huggingface-cli download erayyapagci/balbal-v2 --local-dir balbal-v2
python inference/transcribe.py --model-dir balbal-v2 speech.wav
--runtime onnx runs the plain graph (standard onnxruntime only), --runtime torch runs PyTorch, --hotwords "Eray,Hasan" biases the
decoder toward given words. Streaming (WebSocket server, browser microphone demo) is in inference/streaming/. See the code repository
for the Python API and training.
Limitations
- Short clips: very short clips (a word or two) carry little context: errors are more frequent, and Turkish and English words can get mixed up.
- Long recordings: offline transcription cuts long audio into 30-second chunks; there is no speaker diarization.
License
The weights, tokenizer and language model in this repository are released under the balbal Community License 1.0 (see LICENSE):
- Free for research and any non-commercial use, including fine-tuning and sharing adapted versions.
- Free for small businesses' commercial use: under US$500k revenue in the last 12 months, fewer than 25 people and under US$250k raised from outside investors. You may use it to run your own business, including on your own customer calls.
- Not covered, at any size: selling or providing speech recognition, transcription, voice agents or other voice AI to others (as a product, API or platform) built on balbal-v2. The license grants no rights beyond the uses above.
The code in github.com/erayyap/balbal is licensed separately under Apache 2.0.
The acoustic encoder descends from NVIDIA's stt_en_conformer_ctc_small (CC BY 4.0), through balbal-v1.
Acknowledgements
- KIRAAT: https://huggingface.co/datasets/serdarcaglar/kiraat
- YODAS: https://huggingface.co/datasets/espnet/yodas
Citation
@misc{yapagci2026balbalv2,
author = {Eray Yapa{\u{g}}c{\i}},
title = {balbal-v2: Turkish Speech Recognition on a CPU},
year = {2026},
month = oct,
howpublished = {\url{https://erayy.com/balbal}},
note = {Code: \url{https://github.com/erayyap/balbal}}
}
Türkçe özet
balbal-v2, CPU'da hızlı çalışan küçük bir Türkçe konuşma tanıma modeli: Conformer-CTC, 3 geçişli döngülü düzeltici ve ürün-anahtar akustik bellek; 6-gram token KenLM ile çözülür. Yaklaşık 5.000 saat ses üzerinde eğitildi, 45M parametre.
Kurulum: pip install balbal, sonra balbal run ses.wav (model ilk çalıştırmada iner).
- 8 CPU thread'inde gerçek zamanın 236 katı hız (balbal-v1: 96 kat).
- Mu-Bench Türkçe (resmi puanlama, GPT-4.1 hakem): %9,46 WER / %18,44 sigWER (balbal-v1 %11,93 / %25,18; balbal-v2-manas %8,20 / %14,89).
- FLEURS Türkçe test: %5,22 WER (balbal-v1 %6,54; balbal-v2-manas %4,06).
lm/ içindeki KenLM, KIRAAT metni olmadan kuruldu; bu doğruluğa mal olmadı (DEV WER 8,85 → 8,74).
Çok kısa kliplerde (bir iki kelime) bağlam az: hatalar daha sık, Türkçe ve İngilizce kelimeler karışabiliyor.
Ağırlıklar balbal Community License 1.0 ile lisanslıdır (LICENSE): araştırma ve ticari olmayan her kullanım serbest; küçük
işletmeler (son 12 ayda 500 bin dolardan az gelir, 25 kişiden az çalışan, dış yatırımcıdan 250 bin dolardan az yatırım) modeli kendi
işlerinde ticari olarak da ücretsiz kullanabilir. Modelle başkalarına konuşma tanıma, transkripsiyon ya da sesli asistan ürünü, API'si
veya platformu sunmak ise şirketin boyutu ne olursa olsun lisansın kapsamı dışındadır. Kod ayrı olarak Apache 2.0 lisanslıdır:
github.com/erayyap/balbal.
- Downloads last month
- -
Model tree for erayyapagci/balbal-v2
Base model
nvidia/stt_en_conformer_ctc_smallSpace using erayyapagci/balbal-v2 1
Collection including erayyapagci/balbal-v2
Evaluation results
- Test WER on Mu-Bench (tr-TR phone calls)test set self-reported9.460
- Test sigWER on Mu-Bench (tr-TR phone calls)test set self-reported18.440
- Test WER on FLEURS (Turkish)test set self-reported5.220
- Test CER on FLEURS (Turkish)test set self-reported1.520
- Test WER on LibriSpeech (clean)test set self-reported10.320
- Test WER on LibriSpeech (other)test set self-reported19.350
- Test WER on AMI (Meetings test)test set self-reported31.520
- Test WER on Earnings-22test set self-reported30.860