Kendi yaptığım bir proje.
- FastEnhancer-Medium’un (48 kHz akışlı ses iyileştirme modeli) çalışma zamanını saf C ile yeniden gerçekleştiren bir kütüphane
- Orijinal model: https://github.com/aask1357/fastenhancer (Ahn ve diğerleri, 2025)
- Orijinal repo, makaleden (16 kHz) sonra ayrıca yayımladığı 48 kHz ağırlıklarını olduğu gibi kullanıyor. Yeniden eğitim, fine-tuning veya calibration set yok
- Model ve ağırlıklar orijinal yazarlara ait; optimize edilen kısım çalışma zamanı tarafı
■ Performans
- Apple M2’nin tek çekirdeğinde real-time factor 0.069 çıkıyor. Aynı makinede aynı grafiği ONNX Runtime ile çalıştırınca 0.230 olduğundan 3,3 kat daha hızlı
- Galaxy S23+’ta (Snapdragon 8 Gen 2) 0.096
- Kalite düşüşü neredeyse yok. VoiceBank-DEMAND’deki 824 konuşma örneğinde fp32 modele göre yalnızca -0.006 PESQ. Duyarak ayırt edilebilecek düzeyde değil
■ Uygulanan optimizasyonlar
3 kat hızlanma tek bir teknikle gelmedi; birden fazla katman ayrı ayrı elden geçirildi.
- Kuantizasyon: Aktivasyon aralığı her karede yeniden hesaplanıyor. Bu yüzden bir calibration set ayarlamaya veya birlikte dağıtmaya hiç gerek yok; girdi dağılımı değişse bile bozulmuyor
- Evrişim: k=3 conv için Winograd F(2,3) uygulanıyor; ardından gelen epilog (dequant + bias + SiLU + fp16 write) da aynı pasa katılarak ara tampon kaldırılıyor
- Özyineleme: GRU, her tier için tek bir kernel olacak şekilde tamamen birleştirildi. Girdi tarafı matris çarpımı, hidden tarafı matris çarpımı, r/z/n üç kapısı ve hidden güncellemesi tek kernel içinde bitiyor; böylece int32 akümülatör belleğe sızmıyor
- Attention: softmax, int32 skorları doğrudan alıp işliyor. fp32 skor matrisi hiç oluşturulmadığından o kadar bellek gidiş gelişi ortadan kalkıyor
- Bellek: cross-stage durumlar (GRU hidden, encoder skip) fp16 olarak tutuluyor; kareler arası bant genişliği yarıya iniyor
- Kernel: ISA’ya göre 6 farklı int8 GEMM kerneli doğrudan yazıldı ve başlatma sırasında otomatik seçiliyor (ARM NEON/DOTPROD/I8MM, x86 AVX2/AVX-VNNI/AVX-512)
- Kalan optimizasyon listesi proje Github’ında görülebilir
■ Gerçek zamanlı kararlılık
- 37 saniyelik tek bir benchmark ile yetinilmedi; gerçek ses callback döngüsüyle 30 dakika kesintisiz çalıştırılarak doğrulandı
- M2, 30 dakika boyunca kare bütçesinin içinde kaldı (p99 0.56)
■ Diğer
- Dış bağımlılık yok. cmake + make ile derleniyor ve statik kütüphane 162 KiB
- Genel API 4 fonksiyondan oluşuyor (fe_init / fe_run / fe_reset / fe_free)
- Ağırlık blob’u 565 KB, parametre sayısı 511.754
- MIT lisansı
Henüz yorum yok.