Đâ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.