Ein selbst erstelltes Projekt.
- Eine Bibliothek, die die Runtime von FastEnhancer-Medium (48-kHz-Streaming-Modell zur Sprachverbesserung) in reinem C neu implementiert
- Originalmodell: https://github.com/aask1357/fastenhancer (Ahn et al., 2025)
- Verwendet unverändert die 48-kHz-Gewichte, die das ursprüngliche Repo nach dem Paper (16 kHz) zusätzlich veröffentlicht hat. Kein Retraining, kein Finetuning, kein Calibration Set
- Modell und Gewichte stammen von den ursprünglichen Autoren; optimiert wurde die Runtime
■ Performance
- Auf einem einzelnen Apple-M2-Core erreicht es einen Real-Time Factor von 0,069. Wenn derselbe Graph auf derselben Maschine mit ONNX Runtime ausgeführt wird, sind es 0,230, also 3,3-mal schneller
- Auf einem Galaxy S23+ (Snapdragon 8 Gen 2) sind es 0,096
- Praktisch keine Qualitätsverluste. Bei 824 Äußerungen aus VoiceBank-DEMAND liegt es nur bei -0,006 PESQ gegenüber dem fp32-Modell. Das ist kein hörbar unterscheidbarer Bereich
■ Angewandte Optimierungen
Die 3-fache Beschleunigung kommt nicht von einer einzelnen Technik; mehrere Ebenen wurden jeweils überarbeitet.
- Quantisierung: Der Wertebereich der Aktivierungen wird in jedem Frame neu berechnet. Dadurch muss kein Calibration Set abgestimmt oder mit ausgeliefert werden, und es bricht auch bei veränderter Eingabeverteilung nicht
- Faltung: Auf k=3 conv wird Winograd F(2,3) angewendet, und der nachfolgende Epilog (dequant + bias + SiLU + fp16 write) wird in denselben Pass integriert, sodass Zwischenpuffer entfallen
- Rekurrenz: Die GRU wird pro Tier vollständig zu einem Kernel fusioniert. Eingangsmatrixmultiplikation, Hidden-Matrixmultiplikation, die drei Gates r/z/n und das Hidden-Update werden in einem Kernel abgeschlossen, sodass der int32-Akkumulator nicht in den Speicher ausweicht
- Attention: Softmax verarbeitet int32-Scores direkt. Da gar keine fp32-Score-Matrix erzeugt wird, entfallen die entsprechenden Speicher-Roundtrips
- Speicher: Cross-Stage-Zustände (GRU hidden, Encoder-Skips) werden als fp16 gespeichert, wodurch sich die Bandbreite zwischen Frames halbiert
- Kernel: Sechs int8-GEMM-Kernel wurden ISA-spezifisch selbst geschrieben und bei der Initialisierung automatisch ausgewählt (ARM NEON/DOTPROD/I8MM, x86 AVX2/AVX-VNNI/AVX-512)
- Die übrige Optimierungsliste ist auf GitHub des Projekts zu finden
■ Echtzeitstabilität
- Es blieb nicht bei einem einzelnen 37-Sekunden-Benchmark; geprüft wurde mit dem tatsächlichen Audio-Callback-Takt über 30 Minuten am Stück
- Der M2 blieb während der gesamten 30 Minuten innerhalb des Frame-Budgets (p99 0,56)
■ Sonstiges
- 0 externe Abhängigkeiten. Build mit cmake + make; die statische Bibliothek ist 162 KiB groß
- Die öffentliche API besteht aus 4 Funktionen (fe_init / fe_run / fe_reset / fe_free)
- Gewichts-Blob 565 KB, 511.754 Parameter
- MIT-Lizenz
Noch keine Kommentare.