EmbeddingGemma 2 ile Türkçe konuşma tanıma
EmbeddingGemma 2 aslında bir gömme modeli: metni, sesi ve görüntüyü aynı vektör uzayına yerleştiriyor. Bu repoda modelin iç katmanlarından Türkçe transkript okuyan küçük bir ağ eğittik. Gemma'nın kendi ağırlıkları değişmiyor; eğitilen kısım 27M parametrelik bir CTC okuyucu ve Gemma'ya takılan, ayrı dosyada duran 6M parametrelik bir LoRA eklentisi. Üstüne Türkçe web metninden kurulmuş bir 4-gram dil modeli ekleniyor.
FLEURS Türkçe test setinde dil modeliyle %7,35 WER alıyor. Fikir, EmbeddingGemma 2'yi İngilizce STT'ye çeviren şu paylaşımdan geliyor; burada Türkçe için ve harf düzeyinde uyguladık.
English: EmbeddingGemma 2 (base weights unchanged) plus a 27M-parameter character CTC reader, a detachable 6M-parameter LoRA adapter and a 4-gram KenLM, trained on 1,804 h of Turkish speech. 7.35% WER on FLEURS-TR test, 9.2% through a simulated telephone channel, 11.6% on MediaSpeech, 10.4% on Common Voice 17.
Sonuçlar
Dil modelinin ayarları sadece FLEURS dev setinde seçildi, test setleri yalnızca raporlama için kullanıldı.
| Test seti | Kayıt | Saat | Dil modelsiz | Dil modeliyle | v4 (dil modeliyle) |
|---|---|---|---|---|---|
| FLEURS test | 743 | 2,6 | %11,3 | %7,35 | %7,61 |
| FLEURS test, telefon kanalından geçirilmiş | 743 | 2,6 | %15,7 | %9,24 | %10,12 |
| Common Voice 17 test | 9.650 | 7,1 | %17,4 | %10,39 | %11,79 |
| MediaSpeech (haber yayını) | 2.513 | 10,0 | %15,4 | %11,58 | %12,55 |
| ISSAI test | 3.484 | 4,4 | %15,7 | %12,28 | %13,86 |
| Khan Academy test | 1.355 | 3,9 | %11,4 | %9,96 | %10,59 |
| YODAS test | 5.092 | 32,2 | %10,9 | %8,71 | %9,67 |
WER hesaplanmadan önce hem referans hem çıktı aynı şekilde normalize ediliyor: sayılar yazıya çevriliyor
("1923" → "bin dokuz yüz yirmi üç", normalizer-tr ile), her şey küçük harfe çevriliyor, noktalama siliniyor,
kesme işaretli kelimeler birleştiriliyor ("Ankara'da" → "ankarada").
Telefon testi gerçek bir çağrı kaydı değil. FLEURS sesleri 8 kHz'e indirilip 300–3400 Hz bandına sıkıştırılıyor ve G.711 μ-law'dan geçiriliyor; seda-v0.2'nin kullandığı tanımın aynısı. YODAS testinin referansları insan transkripti değil, Whisper large-v3-turbo çıktısı.
Kayıt kayıt çıktılar results/v5/ (ve önceki sürüm için results/v4/) altında. 2,7 kat daha büyük bir metinle
kurduğumuz 6,5 GB'lık bir dil modelini de denedik; sonuçları yalnızca 0,0–0,2 puan değiştirdiği için repoya koymadık
(config.json içinde results_bigger_lm_not_shipped).
Diğer Türkçe modellerle karşılaştırma
Aşağıdaki sayılar diğer modellerin kendi model kartlarından alındı (seda-v0.2 Whisper satırlarını da içeriyor, Duyu-small balbal ve mihuai'yi de içeriyor). Biz yeniden ölçmedik ve normalizasyon kuralları birebir aynı değil; yarım puanlık farkları ciddiye almamak gerekir.
| Model | Çalışırken parametre | FLEURS | Telefon | MediaSpeech |
|---|---|---|---|---|
| Whisper large-v3 | 1,55B | %4,6 | %5,3 | %11,4 |
| seda-v0.2 | 66M | %6,4 | %7,4 | %11,3 |
| Whisper medium | 769M | %6,6 | %8,6 | %16,1 |
| bu model (v5) | ~460M Gemma + 27M + 6M LoRA | %7,35 | %9,2 | %11,6 |
| Duyu-small | 49M | %7,9 | ||
| balbal | 45M | %8,0 | ||
| mihuai/turkish-stt | 66M | %9,6 | ||
| Whisper small | 244M | %11,9 | %15,2 | %23,3 |
Boyut konusunda dürüst olmak gerekirse: eğitilen kısım küçük ama çalışırken Gemma'nın ses kodlayıcısı ve metin
katmanları da çalışıyor, yani toplamda ~490M parametre. Sadece konuşma tanıma lazımsa seda-v0.2 hem daha doğru
hem de çok daha küçük, üstelik CPU'da canlı çalışıyor. Bu modelin anlamlı olduğu durum, EmbeddingGemma 2'yi zaten
arama ya da RAG için kullanıyor olmanız: STT size fazladan 33M parametreye mal oluyor. LoRA ayrı bir dosyada
durduğu için kapatılabiliyor (stt.set_lora(False)); kapalıyken model orijinal EmbeddingGemma 2 ile aynı gömmeleri
üretiyor. Açıkken ses gömmeleri belirgin şekilde değişiyor (orijinaliyle kosinüs benzerliği ~0,68), bu yüzden gömme için LoRA'yı kapatın; aynı ileri geçişten hem gömme hem transkript almak
istiyorsanız LoRA'sız --variant v4 daha uygun.
Kullanım
pip install torch "transformers>=4.57" "sentence-transformers>=5.1" soundfile scipy pillow torchvision \
huggingface_hub safetensors pyctcdecode "kenlm @ https://github.com/kpu/kenlm/archive/master.zip"
import sys
from huggingface_hub import snapshot_download
sys.path.insert(0, snapshot_download("mstkyvz/embeddinggemma2-turkish-stt", allow_patterns=["*.py"]))
from stt import TurkishSTT
stt = TurkishSTT.from_pretrained("mstkyvz/embeddinggemma2-turkish-stt")
print(stt.transcribe("kayit.wav"))
stt.set_lora(False) # gömme üretmeden önce: orijinal EmbeddingGemma 2
emb = stt.st.encode([{"audio": numpy_dizisi}])
stt.set_lora(True)
Komut satırından: python stt.py kayit.wav. Dil modeli (lm_v4/tr_4gram.bin) 2,8 GB; use_lm=False ya da
--no-lm verirseniz indirilmez, ama WER belirgin şekilde yükselir. Her örnekleme hızındaki ses 16 kHz'e
çevriliyor, 8 kHz telefon kayıtları da sorunsuz. Uzun kayıtlar 30 saniyelik parçalara bölünüyor. GPU varsa
kullanılıyor; 10–15 saniyelik bir kayıt dil modeliyle RTX 4090'da ~0,15, Apple M4 Pro'da ~0,2 saniyede çözülüyor.
Çıktı küçük harf ve noktalamasız, sayılar yazıyla geliyor ("iki bin yedi"). Rakam ve noktalama istiyorsanız ayrı bir biçimlendirme adımı eklemeniz gerekiyor.
Nasıl çalışıyor
Ses önce Gemma'nın ses kodlayıcısından geçiyor ve saniyede 25 ses token'ına dönüşüyor. Bu token'lar Gemma'nın metin transformer'ından geçerken dört noktadan (giriş, 8. katman, 16. katman ve son katman) çıktı alıp yan yana koyuyoruz; her token için 2304 boyutlu bir vektör oluyor. Okuyucu bunu iki kat zamansal çözünürlüğe açıyor, 8 katmanlı küçük bir transformer'dan geçiriyor ve her zaman adımı için 45 sembolden (Türkçe harfler, boşluk, rakamlar) birini tahmin ediyor. CTC ile eğitiliyor; çözümlemede KenLM 4-gram ile beam search yapılıyor.
Kelime yerine harf tahmin etmemizin sebebi Türkçenin eklemeli yapısı. "gel, geldim, gelemedim, gelemeyeceklermiş" gibi biçimlerin hepsini bir kelime listesine sığdırmak mümkün değil; harf düzeyinde bu sorun ortadan kalkıyor. Kelime düzeyindeki düzeltmeyi dil modeli yapıyor.
Yalnızca son iki katman yerine dört katman kullanmak ilk denemelerde dev WER'i %74'ten %59'a indirdi. Son katman daha çok anlamı taşıyor, ara katmanlar akustik ayrıntıyı.
Eğitim
Veri
| Kaynak | Ne tür | Saat |
|---|---|---|
| YODAS, Whisper etiketleriyle | YouTube | 1.500,5 |
| ISSAI Turkish Speech Corpus | okuma | 209,3 |
| Khan Academy Türkçe | ders anlatımı | 67,5 |
| Common Voice 17, sadece train | okuma | 19,1 |
| FLEURS | okuma | 7,8 |
| Toplam | 1.804,2 |
YODAS kısmı için atasoglu'nun (seda'nın yazarı) yayımladığı Whisper etiketlerini kullandık. Bu etiketler
videoların altyazılarıyla karşılaştırılıp filtrelenmiş, ama yine de makine çıktısı. Common Voice'tan yalnızca train bölümünü
aldık, çünkü validated bölümünde test konuşmacıları da olabiliyor.
Test setlerindeki herhangi bir cümleyle 8 kelimelik ortak bir dizi paylaşan eğitim cümlelerini çıkardık (4.556 kayıt). Aynı filtreyi dil modelinin metnine de uyguladık.
Okuyucu
8× RTX 4090 üzerinde 18.000 adım, yaklaşık 2,5 saat sürdü. 2.000 saatlik sesin özelliklerini diske yazmak 800 GB tutacağı için, her adımda donmuş Gemma'yı yeniden çalıştırıp özellikleri anlık hesapladık. Bu sayede ses üzerinde gerçek zamanlı artırma da yapabildik: hız değişimi, yapay yankı, arka planda başka konuşma, gürültü ve telefon hattı simülasyonu.
Okuyucu 512 boyutlu, 8 katmanlı, 8 kafalı bir transformer (26,96M parametre). AdamW, öğrenme oranı 8e-4, kosinüs takvim; GPU başına batch'te en fazla 320 saniye ses. Eğitim boyunca FLEURS dev WER'i düzenli düştü: 2.000. adımda %25,8 iken 18.000. adımda %17,1'e indi (bu ara ölçümler daha katı, kesme işaretli eski bir referans kuralıyla yapıldı).
v5: LoRA ve gerçek telefon codec'leri
v4'ün okuyucusundan devam ettik. Önce ISSAI'nin eksik kısmını ekleyip 4.000 adım daha eğittik (v5a; FLEURS %7,48). Ardından Gemma'nın ses kodlayıcısındaki attention ve feed-forward katmanlarına (rank 16) ve metin transformer'ının q/v katmanlarına (rank 8) LoRA ekleyip okuyucuyla birlikte 16.000 adım eğittik; en iyi dev sonucu 14.000. adımda geldi. Bu turda artırmaya gerçek telefon codec'leri de girdi: ffmpeg ile GSM, G.723.1, G.726, A-law, 8 kHz Opus ve Speex. 8× RTX 4090'da yaklaşık 2 saat sürdü.
LoRA dil modelsiz WER'i belirgin düşürdü (FLEURS'ta %12,4 → %11,3), ama dil modeliyle birleşince kazancın bir kısmı eridi: model daha emin olunca dil modelinin düzeltme payı küçülüyor. En çok fayda gürültülü ve çeşitli seslerde görüldü (Common Voice, ISSAI, telefon); FLEURS gibi temiz okuma seslerinde fark küçük.
Dil modeli
FineWeb-2 Türkçe'nin bir parçası, Türkçe Vikipedi ve eğitim transkriptleri: toplam 87,4 milyon cümle, 1,17
milyar kelime. Metin konuşma biçimine çevrildi, tekrarlar atıldı, test cümleleriyle örtüşenler çıkarıldı. KenLM
ile budanmış bir 4-gram kuruldu (lmplz -o 4 --prune 0 0 1 2), 8-bit nicemlenmiş ikili dosya 2,8 GB.
Tüm eğitim ve değerlendirme kodu training/v4/ ve training/v5/ altında; veri indirme, 8 GPU eğitimi, LoRA ve dil
modeli kurulumu dahil.
Sınırlamalar
- Gerçek çağrı merkezi kayıtlarında henüz ölçmedik; telefon sonucu simülasyona dayanıyor.
- Akış (streaming) desteği yok, kayıt bütün halinde işleniyor.
- En çok hata özel isimlerde ve yabancı kelimelerde çıkıyor (örneğin "Vichy" yerine "ve işi").
- YODAS etiketleri Whisper'dan geldiği için Whisper'ın bazı hataları ve yazım alışkanlıkları modele geçmiş olabilir.
- 30 saniyelik parçaların sınırına denk gelen kelimeler bozulabiliyor.
Önceki sürümler
İlk üç sürüm sadece FLEURS'un 8,3 saatlik eğitim verisiyle, bir MacBook'ta eğitildi. Hepsi hâlâ repoda duruyor
(--variant v4, v3, v2, v1); kodları training/ altında. Ölçüm protokolleri v4'ten biraz farklı olduğu için
sayıları birebir karşılaştırılamaz.
| Sürüm | Veri | Okuyucu | FLEURS test WER |
|---|---|---|---|
| v1 | 8,3 sa | 8,3M | %16,1 (dil modeliyle) |
| v3 | 8,3 sa + telefon simülasyonu | 8,3M | %15,5 (dil modeli + Zemberek) |
| v4 | 1.778 sa | 27M | %7,61 (dil modeliyle) |
| v5 | 1.804 sa | 27M + 6M LoRA | %7,35 (dil modeliyle) |
Lisans
Kod Apache 2.0. v4/v5 ağırlıkları ve dil modeli CC BY-SA 4.0, çünkü eğitim verisinin bir kısmı paylaşım-benzer lisanslı (dil modelinde Vikipedi; akustik veride, seda-v0.2'nin CC BY-SA olarak bildirdiği Khan Academy). Diğer kaynaklar: YODAS CC BY 3.0, ISSAI MIT, Common Voice CC0, FLEURS CC BY 4.0, FineWeb-2 ODC-By 1.0. Whisper yalnızca YODAS etiketlerini üretmek için kullanıldı. EmbeddingGemma 2 bu repoda yok, kendi lisansıyla ayrıca indiriliyor. v1–v3 okuyucuları yalnızca FLEURS ile eğitildiği için Apache 2.0.
Veri karışımı ve sızıntı filtresi kuralı için seda-v0.2'nin açıkça yayımladığı tariften yararlandık.
- Downloads last month
- 66
Model tree for mstkyvz/embeddinggemma2-turkish-stt
Base model
google/embeddinggemma-2Datasets used to train mstkyvz/embeddinggemma2-turkish-stt
google/fleurs
HuggingFaceFW/fineweb-2
Evaluation results
- Test WER, v5 + 4-gram LM on FLEURS (tr_tr), testtest set self-reported7.350
- Test WER, v5 greedy on FLEURS (tr_tr), testtest set self-reported11.260
- Test WER, v5 + LM, telephone channel (8 kHz, 300-3400 Hz, mu-law) on FLEURS (tr_tr), testtest set self-reported9.240
- WER, v5 + 4-gram LM on MediaSpeech (tr)self-reported11.580
- Test WER, v5 + 4-gram LM on Common Voice 17 (tr), testtest set self-reported10.390