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ı.
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 = trueile çı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-Origingö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.coiseAccess-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
- Canlı siteyi açın.
- Metni yazın, Sesi Üret‘e basın.
.wavolarak indirin.
🔢 Not: Bu sürümde otomatik sayı/tarih okunuşu yok — orijinal
normalizer-trpaketi tarayıcıda değil,app.jsyalnızca küçük harf + alfabe filtresi yapıyor.1.250.000 TLgibi 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
- Model ve ağırlıklar: Canberk Aslan (canberk7/ema-lightning), Apache-2.0 (ticari kullanım dahil).
- Orijinal metin normalleştirme: Erdem Tuna (normalizer-tr).
- Tarayıcı reaktivitesi: Gea (
@geajs/core). - Bu repodaki kod: Apache-2.0 © 2026 fr0stb1rd.
Kodu incelemek ve katkıda bulunmak için: fr0stb1rd/ema-lightning-web
