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
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for mstkyvz/embeddinggemma2-turkish-stt

Finetuned
(128)
this model

Datasets used to train mstkyvz/embeddinggemma2-turkish-stt

Evaluation results