เป็นโปรเจกต์ที่ทำขึ้นเอง
- เป็นไลบรารีที่นำรันไทม์ของ FastEnhancer-Medium (โมเดลปรับปรุงเสียงพูดแบบสตรีมมิง 48 kHz) มาเขียนใหม่ด้วย C ล้วน
- โมเดลต้นฉบับ: https://github.com/aask1357/fastenhancer (Ahn และคณะ, 2025)
- ใช้น้ำหนัก 48 kHz ที่รีโปต้นฉบับเผยแพร่เพิ่มเติมหลังจากงานวิจัย (16 kHz) ตามเดิม ไม่มีการฝึกใหม่, fine-tuning หรือ calibration set
- ตัวโมเดลและน้ำหนักเป็นของผู้เขียนต้นฉบับ ส่วนที่ปรับแต่งคือฝั่งรันไทม์
■ ประสิทธิภาพ
- บน Apple M2 1 คอร์ ได้ real-time factor 0.069 บนเครื่องเดียวกันถ้ารันกราฟเดียวกันด้วย ONNX Runtime จะได้ 0.230 จึงเร็วกว่า 3.3 เท่า
- บน Galaxy S23+ (Snapdragon 8 Gen 2) ได้ 0.096
- คุณภาพแทบไม่ลดลงเลย จาก 824 utterances ของ VoiceBank-DEMAND เทียบกับโมเดล fp32 แล้วได้เพียง -0.006 PESQ ซึ่งไม่ใช่ระดับที่ฟังแล้วแยกออกได้
■ การปรับแต่งที่ใช้
ไม่ได้เร็วขึ้น 3 เท่าจากเทคนิคเดียว แต่เป็นการปรับหลายชั้นแยกกัน
- Quantization: คำนวณช่วงของ activation ใหม่ทุกเฟรม จึงไม่จำเป็นต้องจัด calibration set หรือแจกจ่ายมาพร้อมกัน และไม่พังแม้การกระจายของอินพุตจะเปลี่ยนไป
- Convolution: ใช้ Winograd F(2,3) กับ k=3 conv และพับ epilogue ที่ตามมา (dequant + bias + SiLU + fp16 write) เข้าไปใน pass เดียวกันเพื่อตัด intermediate buffer
- Recurrence: ฟิวส์ GRU ทั้งหมดให้เหลือเคอร์เนลเดียวต่อ tier จบทั้งเมทริกซ์มัลติพลายฝั่งอินพุต, เมทริกซ์มัลติพลายฝั่ง hidden, 3 gates r/z/n และการอัปเดต hidden ภายในเคอร์เนลเดียว ทำให้ตัวสะสม int32 ไม่รั่วออกไปยังหน่วยความจำ
- Attention: ให้ softmax รับและประมวลผลคะแนน int32 โดยตรง ไม่สร้างเมทริกซ์คะแนน fp32 ขึ้นมาเลย จึงลดการไปกลับของหน่วยความจำส่วนนั้น
- Memory: เก็บ cross-stage state (GRU hidden, encoder skip) เป็น fp16 เพื่อลดแบนด์วิดท์ระหว่างเฟรมลงครึ่งหนึ่ง
- Kernel: เขียน int8 GEMM kernel เอง 6 แบบตาม ISA และเลือกอัตโนมัติตอนเริ่มต้น (ARM NEON/DOTPROD/I8MM, x86 AVX2/AVX-VNNI/AVX-512)
- รายการการปรับแต่งอื่น ๆ ดูได้ใน GitHub ของโปรเจกต์
■ ความเสถียรแบบเรียลไทม์
- ไม่ได้จบแค่การเบนช์มาร์ก 37 วินาทีครั้งเดียว แต่ทดสอบรันต่อเนื่อง 30 นาทีตามรอบ audio callback จริง
- M2 อยู่ภายในงบประมาณต่อเฟรมตลอด 30 นาที (p99 0.56)
■ อื่น ๆ
- ไม่มี external dependency ใด ๆ บิลด์ด้วย cmake + make และ static library มีขนาด 162 KiB
- API ที่เปิดเผยมี 4 ฟังก์ชัน (fe_init / fe_run / fe_reset / fe_free)
- weight blob 565 KB, พารามิเตอร์ 511,754 ตัว
- MIT License
ยังไม่มีความคิดเห็น