2 คะแนน โดย kdrkdrkdr 7 시간 전 | ยังไม่มีความคิดเห็น | แชร์ทาง WhatsApp

เป็นโปรเจกต์ที่ทำขึ้นเอง

  • เป็นไลบรารีที่นำรันไทม์ของ 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

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น