← Tüm projeler

Telaffuz Testi

Okunan cümleyi telefonda analiz edip her ses için ayrı bir güven skoru veren bir uygulama. Kelimenin doğru sayılıp sayılmasından çok, hangi sesin nasıl çıktığını gösteriyor; kayıt cihazdan çıkmıyor.

Dönem
Temmuz – Ağustos 2026
Alan
Yapay Zekâ / ML, Full-Stack & Mobil
Rol
Tek kişilik proje: tasarım, kod, test, değerlendirme
Teknoloji
Kotlin, Android, wav2vec2, CTC, ONNX Runtime, INT8, CMUdict
Kod
github.com/l4NGEL/telaffuz-app
38İngilizce fonem, ARPABET
~120 MBINT8 model, belleğe eşlenmiş
0ağ izni
Uygulamanın ana ekranı; okunacak cümle ve kayıt düğmesi
Şekil 1Uygulamanın ana ekranı; okunacak cümle ve kayıt düğmesi

Neden farklı

Çoğu telaffuz uygulaması konuşmayı metne çevirip hedef cümleyle karşılaştırıyor. Bu da ancak “kelime doğru mu” düzeyinde, kaba bir sonuç veriyor. Ben metne çevirmeyi atlayıp akustik modelin ham fonem olasılıklarıyla çalışmak istedim.

Nasıl çalışıyor

ses (16 kHz) → wav2vec2 (ONNX, INT8) → kare başına fonem olasılıkları
                                                  │
hedef cümle → CMUdict → beklenen fonem dizisi     │
                                                  ▼
                        CTC forced alignment (Viterbi, Kotlin)
                                                  │
                                                  ▼
                   fonem başına güven skoru + "duyulan" ses
  1. Akustik model: wav2vec2 tabanlı, CTC ile eğitilmiş bir fonem modeli, her ~20 ms’lik kare için 38 fonem üzerinde olasılık dağılımı üretiyor.
  2. Beklenen sesler: Okunacak cümle, ~130 bin kelimelik açık telaffuz sözlüğü CMUdict ile fonem dizisine çevriliyor.
  3. Hizalama: Olasılık matrisi ile beklenen fonem dizisi, Viterbi dinamik programlamasıyla zaman ekseninde hizalanıyor. Algoritmayı önce Python / torchaudio ile referans alıp doğruladım, sonra cihazda çalışması için Kotlin’de sıfırdan yazdım.
  4. Skor: Her fonemin hizalandığı aralıktaki ortalama olasılık 0 – 100 arası bir skora dönüşüyor. Kullanıcının aslında ne söylediğini göstermek için fonetik olarak yakın seslerden “karışma grupları” tanımladım; model yalnızca bu küçük aday havuzunda seçim yaptığı için gürültüden anlamsız bir fonem uydurmuyor. Modelin bilinen kör noktaları (cümle başı ve sonu, tek karelik patlamalı sesler) kullanıcıya hata gibi gösterilmiyor.

Cihazda çalıştırma

Model INT8’e nicemlenip ONNX’e aktarıldı ve Android’de ONNX Runtime ile çalışıyor. ~120 MB’lık model dosyasını ilk denemede Java heap’ine okumaya çalıştım ve bellek taşması aldım; dosyayı belleğe eşleyerek (memory-mapped) yüklemeye geçtim. Uygulamanın internet izni bile yok.