Kısaca
- balbal-v1, 45,4 milyon parametre saklayan ama ses karesi başına yalnızca 15,4 milyonunu kullanan bir CTC modeli.
- Mu-Bench'in resmi değerlendirmesinde %11,93 kelime hata oranı (WER) aldı. FLEURS Türkçe testinde %6,54.
- 8 işlemci çekirdeğinde, tek tek kliplerle, gerçek zamanın ~96 katı hızla çalışıyor.
- Neden küçük bir model
- Mimari
- Veri
- Eğitim
- Çözücü ve dil modeli
- Nasıl ölçtüm
- Sonuçlar
- Hız
- Hatalar ve dersler
- Sınırlar ve sonraki adımlar
- Kaynaklar
- Atıf
1Neden küçük bir model
Türkçe konuşma tanımada iki seçenek öne çıkıyor. Birincisi ticari API'ler: iyiler, ama ses dışarıya gidiyor ve dakika başı ücret ödeniyor. İkincisi büyük açık modeller (Whisper large-v3, Qwen3-ASR, omniASR): doğrulukları yüksek, ama bir milyardan fazla parametreleri var ve işlemcide gerçek zamana ancak yetişiyorlar.
Hedefim bu ikisinin arasındaki boşluktu. GPU gerektirmeyen, telefon görüşmesi gibi zor seslerde ticari API'lerle yarışabilen ve bir dizüstü bilgisayarda bile rahat çalışan bir model istedim. Bu yüzden her tasarım kararında doğruluğu hesaplama maliyetiyle birlikte tarttım.
2Mimari
Model üç parçadan oluşuyor.
Kodlayıcı: Conformer-CTC
16 kHz ses önce 80 kanallı log-mel spektrogramına çevriliyor. 16 katmanlı bir Conformer bunu işliyor (model boyutu 176, 4 dikkat başı, 31'lik evrişim çekirdeği) ve 40 milisaniyede bir çıktı karesi üretiyor. Başlangıç noktası NVIDIA'nın İngilizce stt_en_conformer_ctc_small modeliydi. Türkçe için 1024 parçalı bir SentencePiece (unigram) sözlüğüyle yeniden eğittim.
İyileştirici ve ürün-anahtarlı bellek
Kodlayıcının üstünde 2 katmanlı, 192 genişliğinde küçük bir iyileştirici var. Aynı ağırlıklarla üç kez çalışıyor; her geçişte çıktı biraz daha düzeltiliyor. İyileştiricinin içinde ürün-anahtarlı bir bellek (product-key memory) bulunuyor. İki adet 500'lük alt anahtar kümesinin çarpımı 250.000 bellek yuvası veriyor; her yuva 120 boyutlu bir vektör tutuyor. Bu tablo 30 milyon parametre ediyor, ama her ses karesi yalnızca 64 yuvaya bakıyor (4 baş × en iyi 16). Böylece model çok şey ezberleyebiliyor, ancak her kare için az hesap yapıyor.
| Parça | Saklanan | Kare başına kullanılan |
|---|---|---|
| Conformer kodlayıcı (16 katman) | 12,97 mn | 12,97 mn |
| CTC çıkış katmanı | 0,18 mn | 0,18 mn |
| İyileştirici (bellek hariç) | 2,2 mn | 2,2 mn |
| Bellek tablosu (250.000 × 120) | 30,0 mn | ≤ 0,02 mn (3 geçişte 23.040 değer) |
| Toplam | 45,4 mn | 15,4 mn |
Dil modeli
Çıktı, SentencePiece parçaları üzerinde eğitilmiş 6-gram bir KenLM dil modeliyle çözülüyor. Ayrıntılar 5. bölümde.
Bu mimariye nasıl vardım
Eylül sonunda düz bir Conformer-CTC (13,2 mn parametre) ile başladım. Her fikri aynı küçük düzenekte denedim: 200 saat veri, 3 epoch, aynı dil modeli. Aşağıdaki sayılar FLEURS ve iki başka Türkçe test kümesinin birleşik WER'i (15.610 klip), o dönemki eski puanlama kuralıyla. Bu yüzden yukarıdaki sonuçlarla doğrudan karşılaştırılamaz. Önemli olan aralarındaki farklar.
| Deney (200 saat, 3 epoch) | Birleşik WER | Karar |
|---|---|---|
| Düz Conformer-CTC | 23,78 | başlangıç |
| Self-conditioning CTC | 23,52 | küçük kazanç |
| Dikkat tabanlı çözücü (AED) | 23,90 | elendi |
| Yalnızca ürün-anahtarlı bellek (4 baş × 16) | 22,23 | umut verici |
| Döngülü iyileştirici, 3 geçiş | 22,18 | kaldı |
| 6 geçiş + derinlik koşullama | 22,02 | 3 geçişe değmedi |
| Döngü + iki görünüm tutarlılık kaybı | 20,43 | kaldı |
| Döngü + bellek + tutarlılık | 19,72 | kaldı |
| + Muon/AdamW optimizasyonu | 18,43 | temel mimari |
| + uzman karışımı (4 uzman, en iyi 2) | 18,37 | fark gürültüde, eklenmedi |
| + WavLM öğretmenden damıtma | 18,80 | elendi |
Yol boyunca öğrendiklerim:
- Bellek fikri Engram'dan geldi. Engram (Cheng ve ark., 2026), dil modellerine kelime parçalarının n-gramlarıyla adreslenen büyük bir arama tablosu ekliyor: hesaplama artmadan parametre sayısı artıyor. Bunu konuşma tanımaya uyarladım. Ara katmandaki CTC tahminlerinin ikili ve üçlü dizileri, toplam 30 mn parametrelik dört tabloya anahtar oldu. Üç deneme yaptım. Önceki Conformer modelimin üzerine 100 saatlik ince ayarda Engram'lı model DEV'de 30,06 WER verdi; aynı düzenekteki self-conditioning kontrolü (Nozaki ve Komatsu, 2021) 30,13, başlangıç noktası 30,18. Fark vardı ama küçüktü. 200 saatlik eğitimde makaledeki ayarı da denedim: tablolara 5 kat öğrenme oranı, ağırlık sönümü yok. Dil modeli ağırlıkları DEV'de ayarlandıktan sonra iki Engram modeli de test kümelerinde tutarlılık kaybıyla eğitilmiş düz modelin gerisinde kaldı. Belleği kapatınca neredeyse hiçbir şey değişmiyordu: 100 klipte 470 yerine 469 hata. Model tabloyu pek kullanmıyordu. Muhtemel neden, anahtarların modelin kendi gürültülü tahminlerinden gelmesiydi.
- Akustik sorguya geçince bellek işe yaradı. Anahtarı tahmin edilen parçalardan değil sesin kendisinden üretmeye karar verdim. Bunun için Lample ve arkadaşlarının ürün-anahtarlı belleğini (Lample ve ark., 2019) ardışık üç ses karesinden üretilen bir sorguyla kullandım. Değer tablosunun 5 kat öğrenme oranı ve sönümsüz eğitimi Engram'dan kaldı. İlk denemede erişim birkaç yuvaya çöktü: en çok kullanılan 100 yuva ağırlığın %95'ini alıyordu. Sorguya batch normalizasyonu ekleyince bellek dengeli kullanılmaya başladı. Aynı 100 klipte belleği kapatmak hata oranını 36,27'den 38,96'ya çıkarıyordu. Üstelik ucuzdu: parametre sayısını üç katına çıkarmasına rağmen aynı düzenekte eğitim adımı yalnızca yaklaşık %10 uzadı (güncelleme başına 1,00 yerine 1,10 saniye). Her karede tablonun tamamı değil, yalnızca seçilen 64 satır okunuyor ve güncelleniyor.
- Daha çok geçiş daha iyi değil. Çıkarım sırasında geçiş sayısını 2'den 10'a çıkardığımda DEV hatası düzenli olarak arttı (37,08'den 38,05'e). 6 geçişli bir eğitim de 3 geçişe göre anlamlı bir kazanç vermedi. Bu yüzden 3 geçişte kaldım.
- Optimizasyon, mimari kadar önemliydi. Muon'u denememin sebebi Qwen3.8-Next'in teknik raporuydu (Qiu ve ark., 2026). Qwen ekibi bu modelde Qwen3 ailesinin AdamW'sinden Muon'a geçmiş ve bunun daha yüksek öğrenme oranına izin verip eğitimi kararlı hale getirdiğini yazıyor. Muon'un kendisi Keller Jordan'ın modded-nanogpt speedrun'ında ortaya çıktı (Jordan, 2024). Yine de tamamen Muon'a geçmedim, karma bir düzen kurdum. Muon'un kendi yazısı da gömme ve çıkış katmanlarının en iyi sonuç için AdamW ile eğitilmesini öneriyor; son dönemde modeller de çoğunlukla bu karma düzenle, Muon gizli katmanlarda, AdamW geri kalanında olacak şekilde eğitiliyor. Son dönemde tüm parametreleri Muon'la eğitilen modellerin daha kolay yakınsadığını anlatan yazılar da çıktı, ama ben yaygınlaşan karma düzende kaldım. Bende dikkat katmanlarındaki Q/K/V (her baş ayrı) ve ileri beslemeli katmanların doğrusal ağırlıkları Muon ile, evrişimler, normalizasyonlar, çıkış katmanı ve bellek tablosu AdamW ile güncelleniyor. Aynı modelde bu geçiş tek başına hatayı %6,5 azalttı. Bu, eklediğim çoğu mimari parçadan daha büyük bir kazançtı.
- Sonradan sadeleştirdim. İki görünüm tutarlılık kaybı (CR-CTC, Yao ve ark., 2025) eğitimi yaklaşık 1,7 kat yavaşlatıyordu. Speedrun ölçümlerinde onsuz eğitimin aynı sürede daha iyi sonuç verdiğini görünce kaldırdım. Uzman karışımı, damıtma, SwiGLU ve birkaç başka ek de ya fayda vermedi ya da eğitimi bozdu.
Son modelde parçaların katkısını görmek için önceki sürümde (balbal-v2-beta) belleği ve döngüyü çıkarım sırasında kapattım. Bu, yeniden eğitilmiş bir karşılaştırma değil; yalnızca eğitilmiş modelin bu parçalara ne kadar dayandığını gösteriyor.
| balbal-v2-beta, WER (balbal-normalizer) | Tam model | Bellek kapalı | Döngü yok |
|---|---|---|---|
| FLEURS | 6,59 | 8,79 | 8,81 |
| Mu-Bench | 13,39 | 16,05 | 15,90 |
Dil modeliyle birlikte, belleği olmayan döngü neredeyse hiç döngü olmamasıyla aynı sonucu veriyor. Yani iyileştiricinin kazancı büyük ölçüde bellekten geliyor.
3Veri
Model, eğitimin başından sonuna kadar en az bir kez toplam 1.722 saat farklı ses gördü. Tekrarlarla birlikte bu yaklaşık 14.450 saat ediyor; 12.100 saati ilk Türkçe modelin 10 epoch'undan geliyor. Aynı ses birden fazla aşamada kullanıldıysa bir kez sayıldı (kod çözülmüş sesin özeti, yani hash ile). NVIDIA'nın İngilizce başlangıç modelinin ön eğitim verisi tabloda yok.
| Kaynak | Saat | Pay |
|---|---|---|
| Gerçek Türkçe konuşma (açık veri setleri ve web'den derlenmiş doğal konuşma) | 455,6 | %26,5 |
| Sentetik Türkçe konuşma (TTS) | 1.195,7 | %69,4 |
| Okunan web ve haber metinleri, kısa cümleler | 714,4 | %41,5 |
| Gündelik konuşma ve diyaloglar | 329,4 | %19,1 |
| Harf harf kodlama, e-posta | 50,0 | %2,9 |
| Sayılar, telefon numaraları, tutarlar | 40,7 | %2,4 |
| İsimler ve ekler | 24,5 | %1,4 |
| Çağrı merkezi diyalogları | 20,4 | %1,2 |
| Kısa cevaplar | 16,2 | %0,9 |
| Diğer | 70,5 | %4,1 |
| İngilizce konuşma (LibriSpeech) | 61,3 | %3,6 |
| Konuşma olmayan sesler (gürültü, müzik, sessizlik) | 9,3 | %0,5 |
| Toplam: 1.075.680 klip | 1.721,9 | %100 |
Son eğitim aşamasında yeni ses eklemedim. Daha önce görülmüş kayıtlardan 702 saatlik bir karışım kurdum ve gerçek konuşmanın payını %64'e çıkardım.
Sentetik konuşmayı açık TTS modelleriyle ürettim. Gerçek veride az bulunan durumlara ağırlık verdim: harf harf okunan kodlar, telefon numaraları, isimler ve kısa "evet / hayır / tamam" cevapları. Çağrı merkezi konuşmalarının asıl zorluğu bu durumlarda.
Gerçek kayıtları Moonshine gibi kesip birleştirdim
Son eğitim aşamasında gerçek kayıtları Moonshine'ın eğitim verisini hazırlama biçimine göre yeniden düzenledim (Jeffries ve ark., 2024). Moonshine, aynı kayıttaki ardışık parçaları aralarında en fazla 2 saniye boşluk kalacak şekilde birleştirip 4 ile 30 saniye arası örnekler oluşturuyor. Bu yüzden süre dağılımı iki tepeli: bir tepe 3–6 saniyede, diğeri 27–30 saniyede. Ben de gerçek kayıtları böyle birleştirdim. Kısa sentetik klipleri ve aşağıdaki kesitleri bilerek kısa bıraktığım için karışımın yalnızca %5,7'si 25–31 saniye aralığında (Moonshine'da %23).
Ayrıca gerçek kayıtlardan kısa kalıp ifadeler kestim. Eğitim metinlerinde "iyi günler", "kolay gelsin", "rica ederim" gibi 35 sık konuşma ifadesini buldum. Önceki modelin CTC hizalamasıyla bu ifadelerin seste nerede başlayıp bittiğini çıkardım, kelime sınırlarından 80 ms pay bırakarak kestim. Yalnızca modelin kesilmiş sesi tam olarak o ifade diye okuduğu kesitleri tuttum: 11.476 kesit, toplam 2 saat. Nadir ifadeler daha sık tekrarlansın diye her ifadeyi 3 ile 15 kat arasında çoğalttım. Amaç, çağrı merkezlerinde çok geçen ama uzun kayıtların içinde kaybolan kısa cevapları modele ayrı ayrı göstermekti.
Birkaç kural koydum:
- Etiketlerde rakam yok. Sayılar konuşulduğu gibi yazıyla yazılıyor ("sıfır beş yüz otuz iki"). Karışımda rakam içeren tek bir etiket bile yok. Bunun nedenini 9. bölümde anlatıyorum.
- Test verisi eğitime girmiyor. FLEURS'tan yalnızca eğitim bölümünü kullandım. Test kümeleriyle metin, ses dosyası ve ses özeti (hash) düzeyinde örtüşme olmadığını kontrol ettim. Mu-Bench'in hiçbir içeriği eğitime ya da dil modeline girmedi.
4Eğitim
balbal-v1 tek seferde eğitilmedi; birkaç aşamalık bir soy ağacının son halkası.
- İngilizce başlangıçNVIDIA
stt_en_conformer_ctc_small(Conformer-CTC, ~13 mn parametre). - İlk Türkçe modelRunPod'da, NVIDIA RTX PRO 4500 Blackwell üzerinde 10 epoch, yaklaşık 35,6 saat.
- Genel Türkçe modelİlk Türkçe modelden devam: 203 saatlik yeni veriyle 3 epoch.
- balbal-v1-betaAğırlık çorbası: genel Türkçe model %75, ilk Türkçe model %25.
- balbal-v2-betaİyileştirici ve ürün-anahtarlı bellek eklendi. E-posta ve harf harf kodlama verisiyle 27.024 güncelleme, ardından 0,6 oranlı ağırlık çorbası.
- balbal-v1v2-beta'dan başlayarak 702 saatlik karışımla 6000 güncelleme (yaklaşık 0,57 epoch). Yerel iGPU'da 5.024 saniye (84 dakika). Çorba yapılmadı; ham ağırlıklar kullanıldı.
Son aşamanın ayarları: batch 32; öğrenme hızı 1e-4 (bellek tablosu için 5e-4). Matris ağırlıklarında Muon, geri kalan ağırlıklarda AdamW kullandım.
Speedrun yaklaşımı
Eğitim değişikliklerini Keller Jordan'ın modded-nanogpt "speedrun" yaklaşımıyla değerlendirdim. Bir değişikliğin değeri, adım başına süreyle değil, sabit bir kalite hedefine ulaşma süresiyle ölçüldü. Hedef, ayrı tutulan kontrol kümelerinde Türkçe, İngilizce ve konuşma olmayan ses grupları için belirlenen eşiklerdi. Geliştirme kümesinde (DEV) gerileme olmaması şart koşuldu. İki model arasındaki farkları eşleştirilmiş bootstrap ile sınadım. Kontrol noktası seçimi yalnızca DEV ve kontrol kümelerine bakılarak yapıldı; test kümelerine ve Mu-Bench'e bakılmadı.
Donanım
İlk Türkçe model (10 epoch, yaklaşık 35,6 saat) RunPod'da kiraladığım bir NVIDIA RTX PRO 4500 Blackwell (32 GB) GPU'sunda eğitildi. Sonraki aşamaların hepsi kendi makinemde devam etti: tek bir AMD Ryzen AI Max+ 395, Radeon 8060S entegre GPU, ROCm ve 121 GB ortak bellek. Mimari denemelerin ve speedrun ölçümlerinin bir kısmı için de RunPod'dan RTX 5090 ve A40 kiraladım. Radeon'un kendine özgü sorunlarını 9. bölümde anlatıyorum.
5Çözücü ve dil modeli
CTC çıktısı, flashlight'ın sözlüksüz (lexicon-free) ışın aramasıyla çözülüyor. Dil modeli SentencePiece parçaları üzerinde çalışan 6-gram bir KenLM. 45 milyon parça üzerinde eğitildi ve 124 MB tutuyor. Dil modeli metni, bu modelin soy ağacındaki tüm eğitim metinlerinden oluşuyor. DEV, test ve kontrol cümleleri bu metinden çıkarıldı. Her model sürümü için dil modelini o sürümün gördüğü veriyle yeniden kuruyorum.
Çözücü ayarları DEV kümesinde kalibre edildi: dil modeli ağırlığı α = 0,75, kelime bonusu β = 1,5, sıcaklık 1,2, ışın genişliği 64, kare başına en iyi 12 parça, budama eşiği 8. Dil modeli FLEURS'ta WER'i %9,35'ten %6,54'e, Mu-Bench'te %13,86'dan %11,78'e indiriyor.
Çıktıda büyük harf ve noktalama var. Sayılar yazıyla çıkıyor; rakama çeviren bir son işlem (ITN) modelin içinde yok.
6Nasıl ölçtüm
Kendi ölçümlerimde tek bir puanlama kuralı kullandım (balbal-normalizer). Harf büyüklüğü ve noktalama yok sayılıyor. Sayılar rakam rakam karşılaştırılıyor; "doksan", "dokuz sıfır" ve "90" aynı sayılıyor. Bitişik yazılmış kodlar harf ve rakamlarına ayrılıyor. Kural yalnızca aynı kelimelerin farklı yazımlarını affediyor; farklı bir kelime her zaman hata. Tablodaki bütün açık modeller aynı klipler ve aynı kuralla puanlandı. Puanlama kodu GitHub'da: normalizer/metrics_v2.py. Normalizer, çıkarım ve eğitim kodunun tamamı da github.com/erayyap/balbal deposunda.
Mu-Bench için resmi değerlendirme düzeneğini de çalıştırdım (sierra-research/mu-bench, gpt-4.1 hakem). Gönderimden önce yazıyla çıkan sayılar rakama çevrildi (ITN). Ticari API'lerin puanları Mu-Bench'in kendi sonuç tablosundan alındı. Maliyeti azaltmak için bir önlem aldım: 846 cümlenin 342'sinde balbal-v1, balbal-v2-beta ile birebir aynı metni üretiyordu. Bunlar için v2-beta'nın hakem kararlarını tekrar kullandım; kalan 504 cümle yeniden değerlendirildi.
Mu-Bench yalnızca sonuç okumak için kullanıldı. Eğitim verisine, dil modeline ya da kontrol noktası seçimine hiçbir şekilde girmedi.
7Sonuçlar
Mu-Bench: ticari API'lerle karşılaştırma
Mu-Bench (Li ve Ray, 2026), 8 kHz kalitesinde müşteri hizmetleri görüşmelerinden 846 Türkçe cümle içeriyor. Resmi değerlendirmede balbal-v1'in WER'i %11,93, anlamı bozan hata oranı (significant WER) %25,18. Bu sonuçla Azure, Deepgram, OpenAI ve xAI'nin önünde, Google ve ElevenLabs'in arkasında yer alıyor. Anlamı bozan hatalarda Deepgram Nova-3 (%24,35) biraz daha iyi.
Diğer modellerle karşılaştırma
Açık ağırlıklı modellerin hepsini aynı klipler ve balbal-normalizer kuralıyla kendim çalıştırdım. Mu-Bench'te (balbal-normalizer, ITN'siz) balbal-v1 %11,78 ile hepsinin önünde. En yakın rakipler Qwen3-ASR 1.7B (%13,95) ve Whisper large-v3 (%14,92); ikisi de yüz kat büyük. FLEURS'ta durum farklı: Whisper large-v3 (%3,71) ve turbo (%4,07) açık ara önde. balbal-v1'in %6,54'ü Qwen3-ASR 1.7B (%6,52) ile aynı düzeyde. FLEURS temiz, okunmuş Wikipedia cümlelerinden oluşuyor ve büyük modellerin geniş dünya bilgisi burada daha çok işe yarıyor.
Sonradan bir model daha ekledim: Duyu-small. Türkçe ve İngilizce tanıyan, 19,3 milyon aktif parametreli açık ağırlıklı bir model. Model kartına göre kodlayıcı tasarımı (paylaşımlı geçişler ve seyrek akustik bellek) balbal'dan alınmış; üstüne dikkat tabanlı bir çözücü ve iki dilli bir sözlük eklenmiş. Aynı klipler ve balbal-normalizer kuralıyla Mu-Bench'te %15,39, FLEURS'ta %6,62 hata yapıyor. Resmi Mu-Bench değerlendirmesinde (GPT-4.1 hakemli) kelime hata oranı %15,70, ciddi hata oranı %35,22 (balbal-v1: %11,93 ve %25,18).
MihuAI'nin kendi testi
MihuAI, turkish-stt modeliyle birlikte 81 klipten oluşan bir test yayımladı. Kayıtlar TTS ile üretilmiş, 24 kHz. Bu testi MihuAI'nin kendi puanlama koduyla, hiçbir değişiklik yapmadan çalıştırdım. balbal-v1'in WER'i %7,94. MihuAI turkish-stt, kendi önerdiği ayarlarla aynı testte %15,20 alıyor (yayımladıkları değer %15,37).
Kategori bazında
Kategoriler Mu-Bench'in kendisinden gelmiyor. Freya'nın aynı ses ve metinleri içeren sierra-benchmark veri setindeki kategori etiketlerini kullandım. balbal-v1 telefon numaralarında (%3,96), adreslerde (%4,53) ve kod dizilerinde (%5,34) güçlü. İsimler (%24,84), harf harf okuma (%20,06) ve istek cümleleri (%19,98) hâlâ zayıf noktaları.
| Model | Tümü 846 | Kısa cevap 229 | Telefon 109 | E-posta 102 | İstek 85 | Kod dizisi 84 | Sohbet 65 | Soru 63 | İsim 55 | Harf harf 27 | Adres 21 | Tutar 5 | Tarih/saat 1 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Google Chirp 3 | 8,4 | 8,0 | 2,1 | 15,6 | 10,4 | 0,9 | 7,8 | 11,4 | 25,5 | 14,0 | 3,9 | 13,6 | 0,0 |
| ElevenLabs Scribe v2 | 8,7 | 12,4 | 2,8 | 10,4 | 12,0 | 3,1 | 9,5 | 14,3 | 23,6 | 12,2 | 2,1 | 11,4 | 0,0 |
| Google Gemini 3.5 Transcribe | 8,8 | 6,6 | 2,7 | 13,5 | 10,7 | 6,4 | 9,7 | 12,0 | 23,0 | 12,8 | 4,8 | 13,6 | 0,0 |
| Freya | 9,7 | 6,1 | 4,7 | 18,6 | 11,8 | 1,4 | 9,7 | 12,8 | 19,2 | 13,4 | 4,2 | 13,6 | 0,0 |
| PatientDesk Duyu | 10,0 | 9,6 | 4,3 | 17,6 | 13,5 | 4,1 | 11,0 | 11,9 | 18,0 | 10,3 | 3,9 | 9,1 | 0,0 |
| OpenAI GPT-4o Mini Transcribe | 11,3 | 15,7 | 3,0 | 14,9 | 16,0 | 7,7 | 12,9 | 16,0 | 30,6 | 11,6 | 3,6 | 4,5 | 0,0 |
| balbal-v1 | 11,8 | 12,2 | 4,0 | 12,5 | 20,0 | 5,3 | 13,1 | 18,6 | 24,8 | 20,1 | 4,5 | 18,2 | 0,0 |
| Deepgram Nova-3 | 12,4 | 11,4 | 2,7 | 27,0 | 14,8 | 10,0 | 7,8 | 13,5 | 26,1 | 14,0 | 4,8 | 11,4 | 0,0 |
| Qwen3-ASR 1.7B (Baseten) | 13,8 | 17,1 | 5,5 | 21,3 | 18,4 | 9,0 | 11,8 | 16,9 | 30,4 | 15,5 | 5,4 | 13,6 | 0,0 |
| Qwen3-ASR 1.7B (Modal) | 13,9 | 18,0 | 5,3 | 21,6 | 18,9 | 8,8 | 12,0 | 16,9 | 29,8 | 15,2 | 5,1 | 13,6 | 0,0 |
| Qwen3-ASR 1.7B | 13,9 | 17,5 | 5,5 | 22,4 | 18,1 | 8,3 | 11,8 | 16,5 | 31,1 | 15,5 | 6,3 | 13,6 | 0,0 |
| Whisper large-v3 | 14,9 | 13,6 | 4,3 | 40,0 | 14,0 | 4,5 | 12,2 | 16,0 | 21,7 | 10,9 | 5,5 | 9,1 | 0,0 |
| Duyu-small | 15,4 | 18,0 | 3,8 | 22,3 | 21,8 | 11,2 | 13,9 | 20,9 | 32,3 | 22,8 | 8,4 | 18,2 | 0,0 |
| xAI Grok STT | 15,7 | 27,9 | 5,8 | 18,7 | 18,9 | 12,4 | 15,8 | 20,0 | 28,6 | 20,1 | 7,2 | 15,9 | 0,0 |
| omniASR LLM 7B | 18,4 | 51,3 | 5,6 | 23,6 | 17,2 | 14,1 | 13,5 | 17,1 | 42,2 | 15,5 | 10,2 | 16,3 | 0,0 |
| Microsoft Azure Speech | 18,6 | 13,8 | 12,1 | 35,8 | 16,5 | 14,7 | 10,5 | 17,6 | 26,1 | 31,1 | 12,9 | 11,4 | 0,0 |
| omniASR LLM 3B | 19,2 | 38,3 | 6,9 | 22,8 | 23,1 | 11,2 | 14,1 | 25,0 | 55,3 | 18,2 | 12,7 | 20,4 | 0,0 |
| omniASR LLM 1B | 19,5 | 41,7 | 6,7 | 23,6 | 22,0 | 18,3 | 13,7 | 22,7 | 42,9 | 18,5 | 13,2 | 11,6 | 0,0 |
| MihuAI turkish-stt | 22,6 | 21,6 | 7,7 | 42,0 | 26,0 | 21,2 | 19,6 | 27,0 | 25,5 | 27,4 | 13,2 | 15,9 | 0,0 |
| omniASR CTC 3B | 24,0 | 50,5 | 8,0 | 40,8 | 26,4 | 11,4 | 14,9 | 25,0 | 46,9 | 20,7 | 14,2 | 13,9 | 28,6 |
| Whisper small | 24,7 | 28,3 | 10,4 | 38,1 | 28,6 | 19,8 | 22,2 | 32,8 | 38,5 | 28,0 | 17,2 | 13,6 | 57,1 |
| Whisper large-v3-turbo | 26,8 | 82,4 | 8,8 | 48,1 | 19,3 | 17,6 | 12,7 | 19,7 | 44,7 | 18,9 | 6,4 | 18,2 | 0,0 |
| omniASR CTC 7B | 27,6 | 50,0 | 13,9 | 41,3 | 24,0 | 23,7 | 20,2 | 24,8 | 61,5 | 26,4 | 22,8 | 16,3 | 14,3 |
| omniASR CTC 1B | 29,0 | 66,5 | 8,0 | 39,5 | 34,3 | 20,8 | 21,5 | 29,0 | 54,7 | 25,5 | 24,6 | 29,6 | 0,0 |
| Whisper medium | 33,5 | 21,2 | 51,6 | 54,4 | 23,3 | 9,0 | 18,4 | 25,9 | 34,2 | 31,9 | 12,4 | 13,6 | 57,1 |
| omniASR CTC 300M | 45,6 | 75,9 | 26,3 | 49,2 | 52,2 | 44,1 | 41,1 | 51,4 | 79,9 | 35,5 | 42,5 | 35,7 | 14,3 |
| Whisper base | 55,8 | 44,5 | 23,2 | 50,4 | 48,7 | 193,5 | 35,7 | 47,0 | 59,6 | 41,5 | 95,5 | 30,2 | 14,3 |
| Whisper tiny | 94,7 | 51,4 | 92,7 | 101,3 | 63,3 | 311,4 | 54,7 | 59,6 | 64,0 | 61,3 | 61,0 | 50,0 | 42,9 |
Mu-Bench'te puanladığım her model, kategori bazında WER (%, balbal-normalizer). Başlıklardaki küçük sayılar klip sayısı; her sütunun en iyisi altın renkte ve kalın (en küçük iki kategori hariç). Kategori etiketleri Freya'nın sierra-benchmark veri setinden. Tutar (5 klip) ve tarih/saat (1 klip) çok küçük; bu iki sütun gürültülü.
Tüm skorlar
Ölçtüğüm her model, Mu-Bench (846 klip) ve FLEURS Türkçe testi (743 klip) üzerinde. Bizim modellerden yalnızca en iyisini, balbal-v1'i koydum. Satırlar Mu-Bench WER'ine (balbal-normalizer) göre sıralı.
| Model | Mu-Bench WER (balbal-normalizer) | Mu-Bench LLM WER | Significant WER | FLEURS |
|---|---|---|---|---|
| Google Chirp 3 | 8,45 | 8,03* | 14,30* | — |
| ElevenLabs Scribe v2 | 8,72 | 9,43* | 19,15* | — |
| Google Gemini 3.5 Transcribe | 8,75 | 8,68* | 18,20* | — |
| Freya | 9,72 | 9,27 | 21,28 | 6,61 |
| PatientDesk Duyu | 10,02 | 10,94 | 25,30 | 3,62 |
| OpenAI GPT-4o Mini Transcribe | 11,30 | 12,82* | 28,61* | — |
| balbal-v1 | 11,78 | 11,93 | 25,18 | 6,54 |
| Deepgram Nova-3 | 12,37 | 13,37* | 24,35* | — |
| Qwen3-ASR 1.7B (Baseten) | 13,82 | 15,03* | 31,91* | — |
| Qwen3-ASR 1.7B (Modal) | 13,91 | 14,76* | 30,61* | — |
| Qwen3-ASR 1.7B | 13,95 | — | — | 6,52 |
| Whisper large-v3 | 14,92 | — | — | 3,71 |
| Duyu-small | 15,39 | 15,70 | 35,22 | 6,62 |
| xAI Grok STT | 15,69 | 15,94* | 34,04* | — |
| omniASR LLM 7B | 18,35 | — | — | 5,31 |
| Microsoft Azure Speech | 18,65 | 14,02* | 30,73* | — |
| omniASR LLM 3B | 19,21 | — | — | 6,49 |
| omniASR LLM 1B | 19,53 | — | — | 6,95 |
| MihuAI turkish-stt | 22,59 | 24,59 | 49,53 | 8,16 |
| omniASR CTC 3B | 24,02 | — | — | 8,30 |
| Whisper small | 24,72 | — | — | 12,17 |
| Whisper large-v3-turbo | 26,77 | — | — | 4,07 |
| omniASR CTC 7B | 27,57 | — | — | 7,71 |
| omniASR CTC 1B | 28,99 | — | — | 11,33 |
| Whisper medium | 33,51 | — | — | 6,29 |
| omniASR CTC 300M | 45,56 | — | — | 20,88 |
| Whisper base | 55,81 | — | — | 25,99 |
| Whisper tiny | 94,66 | — | — | 42,43 |
- Birim
- Kelime hata oranı (WER), yüzde; düşük olan daha iyi. "—": ölçülmedi.
- Mu-Bench WER (balbal-normalizer), FLEURS
- balbal-normalizer ile puanlama, ITN'siz. balbal-normalizer: harf büyüklüğünü ve noktalamayı yok sayan, sayıları rakam rakam karşılaştıran puanlama kuralı. Her modelin metnini aynı kuralla kendim puanladım. Ticari API'lerin Mu-Bench metinleri Mu-Bench deposundan; Freya ve PatientDesk'i kendim çağırdım.
- Mu-Bench LLM WER
- Resmi değerlendirme: gpt-4.1 referansı ve çıktıyı normalleştiriyor, WER ondan sonra hesaplanıyor.
- Significant WER
- gpt-4.1 hakeme göre anlamı bozan en az bir hata içeren cümlelerin oranı.
- Kaynak
- Son iki sütunu balbal-v1, Freya, PatientDesk Duyu ve MihuAI turkish-stt için resmi düzeneği kendim çalıştırarak hesapladım. * işaretli değerler Mu-Bench'in yayımladığı sonuç tablosundan.
8Hız
Hızı tüm modeller için aynı yöntemle ölçtüm. 100 klip kullandım (50 FLEURS, 50 Mu-Bench). Her model 8 işlemci çekirdeğinde, batch boyutu 1 ile, klipleri tek tek işledi. Ölçülen süre, ham sesin girmesinden metnin çıkmasına kadar geçen süre: öznitelik çıkarma, ağ ve (balbal için) dil modelli ışın araması dahil. Makinenin hızı günden güne değişebildiği için bütün modelleri aynı oturumda ölçtüm.
balbal-v1, ONNX Runtime (fp32) ile gerçek zamanın ~96 katı hızda çalışıyor; dört ayrı ölçüm 95,8× ile 97,3× arasında çıktı. Aynı koşullarda Whisper large-v3 0,91×, Qwen3-ASR 1.7B 0,84× hızda. Yani bu iki model işlemcide gerçek zamana bile yetişemiyor. Karşılaştırmanın tamamı yazının başındaki grafikte.
Duyu-small'yi sonradan, ayrı bir oturumda aynı yöntemle ölçtüm. Modelin önerdiği ayarlarla (fp32, dikkat tabanlı çözücü, ışın 5) gerçek zamanın 30 katı hızda çalışıyor. Aynı oturumda balbal-v1 108× çıktı; yani balbal-v1 yaklaşık 3,6 kat daha hızlı. Grafikte Duyu-small bu oranla diğer ölçümlerin oturumuna taşınmış halde (27×) yer alıyor.
9Hatalar ve dersler
"Doksan" → "9"
İlk karışımlarla eğitilen modeller, Mu-Bench'teki "sıfır doksan kırk beş" gibi telefon numaralarını "0 9 4 5" diye yazıyordu. Sorun etiketlerdeydi. Gerçek veri sayıları rakamla yazıyordu. Sentetik sayı setinde ise etiketler rakamları tek tek yazarken TTS sesi sayıları gruplar halinde okuyordu; bu setteki rakamlı satırların %66'sı yanlış etiketlenmişti. Çözüm iki adımdı: tüm etiketlerde sayıları konuşulduğu gibi yazıyla yazmak ve bir daha eğitime başlamadan önce veriyi sistemli olarak denetlemek.
MIOpen'i eğitimde kapatmak: %41 daha hızlı
Uzunlukları farklı kliplerle eğitim yaparken AMD'nin MIOpen kütüphanesi her yeni giriş boyutu için en iyi çekirdeği yeniden arıyordu. Bir epoch'taki adım süresinin %44'ü 5 saniyeden uzun süren güncellemelere gidiyordu. Eğitim adımlarında MIOpen'i kapatıp PyTorch'un kendi çekirdeklerini kullanınca güncelleme başına süre 2,37 saniyeden 1,40 saniyeye indi. Bu sorun tek bir süreç içinde yapılan karşılaştırmalarda görünmüyor, çünkü MIOpen aynı boyutları önbellekte tutuyor. Hız ölçümlerini bu yüzden her seferinde yeni bir süreçte yaptım.
Gürültü tabanını bilmek
Mu-Bench'te yaklaşık 0,6 puanlık farklar gürültü içinde kalıyor. Bu yüzden her karşılaştırmayı eşleştirilmiş bootstrap güven aralığıyla raporluyorum. Tek bir sayıya bakarak karar vermiyorum.
İşe yaramayanlar
Sinir ağı tabanlı bir dil modeliyle yeniden puanlama, birkaç modelin olasılıklarını birleştirme, ses seviyesi normalizasyonu ve CTC ön olasılık düzeltmesi ölçülebilir bir kazanç getirmedi. Kazanç en çok veriyi düzeltmekten ve ses biçimini test koşullarına uydurmaktan geldi.
10Sınırlar ve sonraki adımlar
- Sayılar yazıyla çıkar. Rakam isteyen uygulamaların ayrı bir ITN adımı eklemesi gerekiyor.
- Yalnızca Türkçe. Eğitimde bir miktar İngilizce (LibriSpeech) var, ama model İngilizce için ayarlanmadı ve bu yazıda İngilizce ölçülmedi.
- Uzun kayıtlar. Uzun ses 30 saniyelik sabit parçalara bölünüp her parça ayrı çözülüyor. Konuşma algılama (VAD) yok.
- İsimler ve harf harf okuma hâlâ en zayıf kategoriler. Bir sonraki veri turunun hedefi bunlar.
Kaynaklar
- X. Cheng ve ark. Conditional Memory via Scalable Lookup: A New Axis of Sparsity for Large Language Models (Engram). arXiv:2601.07372, 2026.
- G. Lample, A. Sablayrolles, M. Ranzato, L. Denoyer, H. Jégou. Large Memory Layers with Product Keys. NeurIPS, 2019.
- Z. Qiu ve ark. On the Design of Qwen3.8-Next Architecture: Evaluation, Efficiency, and Training Stability. arXiv:2608.30320, 2026.
- K. Jordan. Muon: An optimizer for hidden layers in neural networks. Blog yazısı, 2024. Ayrıca modded-nanogpt deposu.
- Z. Yao ve ark. CR-CTC: Consistency Regularization on CTC for Improved Speech Recognition. ICLR, 2025.
- J. Nozaki, T. Komatsu. Relaxing the Conditional Independence Assumption of CTC-based ASR by Conditioning on Intermediate Predictions. Interspeech, 2021.
- N. Jeffries, E. King, M. Kudlur, G. Nicholson, J. Wang, P. Warden. Moonshine: Speech Recognition for Live Transcription and Voice Commands. arXiv:2410.15608, 2024.
- A. Li, S. Ray. MU-Bench: A Multilingual Transcription Benchmark from Real Phone Calls. 2026. Veri seti, sonuç tablosu.
- A. Conneau ve ark. FLEURS: Few-shot Learning Evaluation of Universal Representations of Speech. IEEE SLT, 2022.
- Freya. sierra-benchmark veri seti. Mu-Bench kategori etiketleri buradan.
- KaanAydinli. Duyu-small. Hugging Face model kartı, 2026.
Atıf
balbal-v1'i bir çalışmada kullanırsan ya da ondan bahsedersen şöyle atıf verebilirsin:
Eray Yapağcı. balbal-v1: A Small Turkish Speech Recognition Model. 2026. erayy.com/balbal-blog
@misc{yapagci2026balbal,
author = {Eray Yapa{\u{g}}c{\i}},
title = {balbal-v1: A Small Turkish Speech Recognition Model},
year = {2026},
month = oct,
howpublished = {\url{https://erayy.com/balbal-blog}},
note = {Code: \url{https://github.com/erayyap/balbal}}
}