--- language: - vi tags: - automatic-speech-recognition - sherpa-onnx - k2 - icefall - zipformer - int8 - 291m license: mit metrics: - wer - cer datasets: - Thienpkae/Tele_vi - doof-ferb/fpt_fosd - doof-ferb/vlsp2020_vinai_100h - cosrigel/vn_tts_medium_clean - undertheseanlp/uts2025_vietipa pipeline_tag: automatic-speech-recognition --- # Vietnamese Zipformer (Sherpa-ONNX / INT8) Repository này chứa model **Zipformer** đã được fine-tune cho tác vụ nhận dạng tiếng Việt, đặc biệt tối ưu cho môi trường thoại (telephony). Model đã được export sang định dạng **ONNX** (INT8 quantization) để tối ưu hóa tốc độ inference bằng thư viện [Sherpa-ONNX](https://github.com/k2-fsa/sherpa-onnx). ## Chi tiết Model - **Kiến trúc**: Zipformer (Transducer) - **Framework huấn luyện**: [icefall](https://github.com/k2-fsa/icefall) / [k2](https://github.com/k2-fsa/k2) - **Độ chính xác**: INT8 (Quantized từ FP32) - Giúp giảm kích thước và tăng tốc độ. - **Loại Model**: Streaming-compatible (Hỗ trợ Chunk-based) / Offline Transducer. - **Tổng số tham số**: ~291M (Encoder ~286M, Decoder ~2.3M, Joiner ~2M) ## Nguồn gốc và Tinh chỉnh (Origins & Refinements) ### Nguồn gốc (Original Work) Mô hình này được phát triển dựa trên kiến trúc **Zipformer** từ repository mã nguồn mở [k2-fsa/icefall](https://github.com/k2-fsa/icefall). Chúng tôi chân thành cảm ơn cộng đồng `k2-fsa` đã cung cấp các công cụ và pre-trained models xuất sắc. ### Các Tinh chỉnh của Hataphu (Our Refinements) Phiên bản này không chỉ là bản convert đơn thuần, mà đã bao gồm các tối ưu hóa chuyên sâu cho tiếng Việt và môi trường thực tế: 1. **Fine-tuning Đa nguồn**: Huấn luyện lại trên tập dữ liệu tổng hợp lớn (VLSP, FOSD, Infore, cuộc gọi tổng đài) để bắt được đa dạng giọng vùng miền. 2. **Thích nghi Môi trường Thoại (Telephony Adaptation)**: Tối ưu hóa đặc biệt với dữ liệu thoại, giúp model hoạt động tốt ngay cả với audio chất lượng thấp (8kHz, nhiễu). 3. **Tích hợp RNNLM Shallow Fusion**: Huấn luyện riêng một mô hình ngôn ngữ RNNLM trên dữ liệu văn bản từ các dataset, giúp giảm WER đạt chất lượng cao hơn bằng kỹ thuật Shallow Fusion. 4. **Sửa lỗi Export ONNX**: Đã patch lại logic export của Zipformer (`chunk_size` handling) để khắc phục lỗi broadcasting khi chạy inference với độ dài chuỗi động, đảm bảo tính ổn định khi deploy. ## Dữ liệu Huấn luyện Model được fine-tune trên tập dữ liệu tổng hợp từ Hugging Face bao gồm: - **Thienpkae/Tele_vi**: Dữ liệu thoại chuyên dụng (Telephony). - **doof-ferb/fpt_fosd**: FPT Open Speech Data. - **doof-ferb/vlsp2020_vinai_100h**: VLSP 2020 (VinAI). - **cosrigel/vn_tts_medium_clean**: Dữ liệu giọng đọc sạch. - **undertheseanlp/uts2025_vietipa**: Dữ liệu UTS2025 VietIPA. ## Lời cảm ơn (Acknowledgments) Chúng tôi xin gửi lời cảm ơn chân thành đến các đơn vị và cá nhân đã chia sẻ các bộ dữ liệu quý giá cho cộng đồng nghiên cứu tiếng Việt: - **VLSP** - **VINAI** - **FPT Smart Cloud** - **doof-ferb (Phan Tuấn Anh)** - **Tác giả Thienpkae** (Dataset `Tele_vi`) - **Tác giả cosrigel** (Dataset `vn_tts`) - **Tác giả undertheseanlp** (Dataset `vietipa`) Sự đóng góp của quý vị là nền tảng quan trọng để phát triển các mô hình nhận dạng tiếng Việt chất lượng cao. ## Hướng dẫn Sử dụng với Sherpa-ONNX ### 1. Cài đặt ```bash pip install sherpa-onnx soundfile ``` ### 2. Inference cơ bản (Nhanh nhất) ```python import sherpa_onnx import soundfile as sf def main(): recognizer = sherpa_onnx.OfflineRecognizer.from_transducer( tokens="tokens.txt", encoder="models/encoder.int8.onnx", # Hoặc encoder.onnx (FP32) decoder="models/decoder.int8.onnx", joiner="models/joiner.int8.onnx", num_threads=1, sample_rate=16000, feature_dim=80, decoding_method="greedy_search", ) audio, sample_rate = sf.read("path/to/your/audio.wav") s = recognizer.create_stream() s.accept_waveform(sample_rate, audio) recognizer.decode_stream(s) print(f"Kết quả: {s.result.text}") if __name__ == "__main__": main() ``` ### 3. Inference với RNNLM (Chính xác nhất) Để đạt độ chính xác cao hơn (giảm WER), hãy kích hoạt RNNLM rescoring bằng `modified_beam_search`: ```python # ... (bên trong hàm main) recognizer = sherpa_onnx.OfflineRecognizer.from_transducer( # ... các tham số model như trên ... decoding_method="modified_beam_search", lm="models/rnnlm.onnx", # Đường dẫn đến file RNNLM lm_scale=0.5, # Trọng số LM (thử nghiệm từ 0.3 đến 0.6) ) ``` **Chạy bằng dòng lệnh (Script có sẵn):** ```bash python inference.py path/to/audio.wav --decoding-method modified_beam_search --rnnlm-scale 0.5 ``` ## Kết quả Benchmark (Thực nghiệm) Kết quả đánh giá trên các tập dữ liệu chuẩn (sử dụng `sherpa-onnx`): | Dataset | Split | WER (%) | CER (%) | | :--- | :---: | :---: | :---: | | **VLSP2020-Test-T1** | test | **5.73** | **4.13** | | **VLSP2023-PublicTest** | test | **14.49** | **11.27** | | **GigaSpeech2** | test | **12.13** | **8.39** | | **Thienpkae/Vi_Tele_test** | test | **13.36** | **10.23** | *Cấu hình đánh giá: Modified Beam Search, RNNLM scale 0.3