2 poin oleh kdrkdrkdr 7 jam lalu | Belum ada komentar. | Bagikan ke WhatsApp

Ini proyek yang saya buat sendiri.

  • Library yang mengimplementasikan ulang runtime FastEnhancer-Medium (model peningkatan kualitas suara streaming 48 kHz) dalam C murni
  • Model asli: https://github.com/aask1357/fastenhancer (Ahn dkk., 2025)
  • Menggunakan apa adanya bobot 48 kHz yang dirilis tambahan oleh repo asli setelah makalah (16 kHz). Tidak ada pelatihan ulang, fine-tuning, maupun calibration set
  • Model dan bobot adalah milik penulis asli; yang dioptimalkan adalah sisi runtime

■ Performa

  • Di satu core Apple M2, real-time factor mencapai 0,069. Jika graf yang sama dijalankan dengan ONNX Runtime di mesin yang sama, hasilnya 0,230, jadi 3,3 kali lebih cepat
  • Di Galaxy S23+ (Snapdragon 8 Gen 2), hasilnya 0,096
  • Penurunan kualitas nyaris tidak ada. Pada 824 utterance VoiceBank-DEMAND, hanya -0,006 PESQ dibanding model fp32. Bukan pada tingkat yang bisa dibedakan dengan pendengaran

■ Optimasi yang diterapkan

Hasil 3x ini bukan dari satu teknik saja, melainkan dari perbaikan pada beberapa lapisan.

  • Kuantisasi: rentang nilai aktivasi dihitung ulang setiap frame. Jadi sama sekali tidak perlu menyesuaikan atau mendistribusikan calibration set, dan tidak rusak meski distribusi input berubah
  • Konvolusi: menerapkan Winograd F(2,3) pada conv k=3, lalu menggabungkan epilog berikutnya (dequant + bias + SiLU + write fp16) ke pass yang sama sehingga buffer perantara dihilangkan
  • Rekurensi: GRU sepenuhnya digabung menjadi satu kernel per tier. Perkalian matriks sisi input, perkalian matriks sisi hidden, tiga gate r/z/n, hingga pembaruan hidden selesai dalam satu kernel sehingga akumulator int32 tidak bocor ke memori
  • Attention: softmax memproses skor int32 secara langsung. Karena matriks skor fp32 sama sekali tidak dibuat, round-trip memori sebesar itu hilang
  • Memori: status cross-stage (GRU hidden, encoder skip) disimpan sebagai fp16 sehingga bandwidth antar-frame berkurang setengah
  • Kernel: menulis sendiri 6 jenis kernel GEMM int8 per ISA dan memilih otomatis saat inisialisasi (ARM NEON/DOTPROD/I8MM, x86 AVX2/AVX-VNNI/AVX-512)
  • Daftar optimasi lainnya bisa dilihat di GitHub proyek

■ Stabilitas real-time

  • Tidak berhenti pada satu benchmark 37 detik; juga diuji dengan menjalankannya terus-menerus selama 30 menit pada siklus callback audio nyata
  • M2 tetap berada dalam anggaran frame sepanjang 30 menit (p99 0,56)

■ Lain-lain

  • 0 dependensi eksternal. Dibangun dengan cmake + make, dan library statisnya 162 KiB
  • API publik terdiri dari 4 fungsi (fe_init / fe_run / fe_reset / fe_free)
  • Blob bobot 565 KB, 511.754 parameter
  • Lisensi MIT

Belum ada komentar.

Belum ada komentar.