2 điểm bởi kdrkdrkdr 7 giờ trước | Chưa có bình luận nào. | Chia sẻ qua WhatsApp

Đây là dự án tự làm.

  • Thư viện hiện thực lại runtime của FastEnhancer-Medium (mô hình tăng cường giọng nói streaming 48 kHz) bằng C thuần
  • Mô hình gốc: https://github.com/aask1357/fastenhancer (Ahn và cộng sự, 2025)
  • Dùng nguyên bộ trọng số 48 kHz mà repo gốc công bố thêm sau bài báo (16 kHz). Không retraining, fine-tuning hay calibration set
  • Mô hình và trọng số là của tác giả gốc; phần được tối ưu là phía runtime

■ Hiệu năng

  • Trên 1 lõi Apple M2, real-time factor đạt 0.069. Chạy cùng đồ thị trên cùng máy bằng ONNX Runtime là 0.230, tức nhanh hơn 3.3 lần
  • Trên Galaxy S23+ (Snapdragon 8 Gen 2) là 0.096
  • Chất lượng gần như không giảm. Trên 824 utterance của VoiceBank-DEMAND, chỉ giảm -0.006 PESQ so với mô hình fp32. Mức này không thể phân biệt bằng nghe

■ Các tối ưu đã áp dụng

Không phải chỉ một kỹ thuật là đạt 3 lần, mà nhiều tầng đã được chỉnh riêng.

  • Lượng tử hóa: phạm vi activation được tính lại ở mỗi frame. Vì vậy hoàn toàn không cần khớp hay phát hành kèm calibration set, và cũng không bị vỡ khi phân phối đầu vào thay đổi
  • Tích chập: áp dụng Winograd F(2,3) cho conv k=3, đồng thời gộp cả epilogue phía sau (dequant + bias + SiLU + fp16 write) vào cùng một pass để bỏ buffer trung gian
  • Đệ quy: GRU được fusion hoàn toàn thành một kernel cho mỗi tier. Từ nhân ma trận phía input, nhân ma trận phía hidden, 3 gate r/z/n đến cập nhật hidden đều kết thúc trong một kernel, nên bộ tích lũy int32 không bị tràn ra bộ nhớ
  • Attention: softmax xử lý trực tiếp điểm int32. Không hề tạo ma trận điểm fp32, nên loại bỏ chừng đó lượt qua lại bộ nhớ
  • Bộ nhớ: trạng thái cross-stage (GRU hidden, encoder skip) được lưu ở fp16 để giảm một nửa băng thông giữa các frame
  • Kernel: tự viết 6 loại kernel int8 GEMM theo từng ISA và tự động chọn lúc khởi tạo (ARM NEON/DOTPROD/I8MM, x86 AVX2/AVX-VNNI/AVX-512)
  • Danh sách các tối ưu còn lại có thể xem trên Github của dự án

■ Độ ổn định thời gian thực

  • Không chỉ kết thúc bằng một lần benchmark dài 37 giây, mà đã xác nhận bằng cách chạy liên tục 30 phút theo đúng chu kỳ audio callback thực tế
  • M2 luôn nằm trong ngân sách frame suốt 30 phút (p99 0.56)

■ Khác

  • Không có phụ thuộc bên ngoài. Build bằng cmake + make, và thư viện tĩnh có kích thước 162 KiB
  • API công khai gồm 4 hàm (fe_init / fe_run / fe_reset / fe_free)
  • Blob trọng số 565 KB, 511,754 tham số
  • Giấy phép MIT

Chưa có bình luận nào.

Chưa có bình luận nào.