Post

EMA Lightning Web: 36 MB'da Yıldırım Hızında Çevrimdışı Türkçe TTS

🇹🇷 Yalnızca ~36 MB modelle yıldırım hızında çalışan, sunucusuz ve gizlilik odaklı çevrimdışı Türkçe TTS uygulaması.

EMA Lightning Web: 36 MB'da Yıldırım Hızında Çevrimdışı Türkçe TTS

Tarayıcıda çalışan Türkçe TTS işine devam ediyorum. Antalia Mini Web projesinin kardeşi olarak bu kez daha hafif ve hızlı bir modeli, EMA Lightning’i web’e taşıdım.

Karşınızda EMA Lightning Web: metni sunucuya göndermeden, onnxruntime-web + WebAudio ile tamamen tarayıcıda sese dönüştüren açık kaynaklı uygulama. | 🇬🇧 English

▶️ Canlı Demo: fr0stb1rd.github.io/ema-lightning-web | 💻 Repo: github.com/fr0stb1rd/ema-lightning-web

EMA Lightning Web Nedir?

EMA Lightning Web, canberk7/ema-lightning (Canberk Aslan) modelinin tarayıcı portudur: 8,6M parametre (~34 MB), Apache-2.0, Freya-TR-Eval’de %0,92 WER. Orijinal PyTorch hattı (ema-lightning paketi) üç ONNX aşamasına bölünerek akışlı (streaming) çalışır: ilk cümle hazır olur olmaz çalmaya başlar, kalanı arkada üretilir.

İlk açılışta modeller bir kez iner (~36 MB), sonra 1 gün boyunca tarayıcı önbelleğinden sıfır trafikle çalışır. Sesiniz ve metniniz cihazdan çıkmaz.

✨ Öne Çıkan Özellikler

  • Hafif ve hızlı: ~36 MB toplam model; masaüstü CPU Python ~6× gerçek zamanlı, WASM’da kısa cümlelerde ~1–2×. Uzun metin parça parça üretilirken ilk parça çalar.
  • Akışlı mimari: text_stage → plan (JS) → sound_stage (4 adımlı DiT → 25 Hz gizli temsil) → decoder (HiFi-GAN → 48 kHz).
  • Donmayan arayüz: ort.env.wasm.proxy = true ile çıkarım worker’da koşar, kurulamazsa ana thread yedeği devreye girer. Sağlayıcılar ['webgpu', 'wasm'].
  • Akıllı önbellek: Modeller Cache Storage’da cache-first (ema-lightning-web-v1, 1 gün TTL). vocab.json (778 bayt) siteyle aynı-origin’dan gelir.
  • Geçmiş + kilit ekranı: Üretimler bellekte, meta localStorage‘da; Media Session API ile kilit ekranı kontrolleri.
  • HuggingFace Hub notu: Ağırlıklar neden Hub’da? GitHub Releases Access-Control-Allow-Origin göndermediği için tarayıcı indirmeyi reddeder (ölçüldü); repo içine gömmek her exportta ~36 MB’ı git tarihine gömer. *.cdn.hf.co ise Access-Control-Allow-Origin: * gönderir.

🏗️ Mimari

flowchart LR
    A["Türkçe metin"] --> B["app.js önyüz\nparçalama + alfabe"]
    B --> C["text_stage.onnx\nharfler → öznitelik + süre"]
    C --> D["plan (JS)\nsüreler → kare zaman çizelgesi"]
    D --> E["sound_stage.onnx\n4 adımlı DiT → 25 Hz gizli temsil"]
    E --> F["decoder.onnx\nHiFi-GAN → 48 kHz ses"]
    F --> G["WebAudio ile çalma\n.wav indirme"]
Aşama Girdi Çıktı
text_stage.onnx ids [B,L], mask [B,L] h [B,L,224], dur [B,L]
plan (JS, engine.py portu) dur, kelime haritası fw [T], fp [T]
sound_stage.onnx h, dur, maskeler, haritalar, gürültü latents [B,T,64]
decoder.onnx z [B,64,T] audio [B,S] @48 kHz

Kare planlama matematiği (süre yuvarlama, repeat_interleave, kelime-içi konumlar) ve pencereli çözücü (8 kare bağlamlı 1 sn ilk pencere + 4 sn pencereler) engine.py‘den birebir port edildi.

🚀 Kullanım

  1. Canlı siteyi açın.
  2. Metni yazın, Sesi Üret‘e basın.
  3. .wav olarak indirin.

🔢 Not: Bu sürümde otomatik sayı/tarih okunuşu yok — orijinal normalizer-tr paketi tarayıcıda değil, app.js yalnızca küçük harf + alfabe filtresi yapıyor. 1.250.000 TL gibi girdiler rakam rakam okunur; sayıları yazıyla yazın (bin iki yüz elli lira). Sayı okuma gerekiyorsa Antalia Mini Web projesine bakın.

🛠️ Geliştirici Notları

Derleme akışı tam otomatik: Actions → export-onnx → Run workflow. export_onnx.py (torch.export, dynamo=True) modelleri üretir, --check her aşamayı onnxruntime ile sayısal doğrular (metin+süre 1e-4, gizli temsil 1e-3, ses 1e-4), push_hf.py Hub’a yükler, pages.yml workflow_run ile yayınlar.

Ön koşul (bir kez): Hub’da ema-lightning-web-onnx deposu + repo Settings → Secrets → Actions altına HF_TOKEN.

⚠️ Sınırlamalar

  • Sayı/tarih okunuşu yok (yukarıya bakın).
  • Seed uyumu yok: tarayıcı kendi PRNG’sini kullanır, aynı metin geçerli ama bit-bit aynı olmayan ses üretir.
  • Tek ses, yalnızca Türkçe — orijinal modelin limitleri aynen geçerli.

📄 Lisans ve Teşekkür

Kodu incelemek ve katkıda bulunmak için: fr0stb1rd/ema-lightning-web

This post is licensed under CC BY 4.0 by the author.