Courses
Nhận dạng giọng nói tự động đã tiến bộ đáng kể trong những năm gần đây. Các mô hình chuyển giọng nói thành văn bản từng đòi hỏi GPU mạnh và cho kết quả không ổn định nay có thể cung cấp bản phiên âm chính xác trên các máy tính phổ thông.
Đồng thời, kích thước mô hình đã nhỏ hơn, suy luận trên CPU đã nhanh hơn, và hỗ trợ đa ngôn ngữ được mở rộng, mang đến sự kết hợp tốt hơn giữa chất lượng phiên âm, tốc độ, khả năng tiếp cận và quyền riêng tư.
VibeVoice-ASR-BitNet của Microsoft là một ví dụ điển hình cho tiến bộ này.
Runtime VibeASR.cpp được tối ưu hóa của nó cho phép chạy chuyển giọng nói thành văn bản đa ngôn ngữ cục bộ trên máy Windows, Linux hoặc macOS mà không cần phụ thuộc vào GPU chuyên dụng hay gửi bản ghi âm lên dịch vụ đám mây.
Trong hướng dẫn này, bạn sẽ học cách cài đặt và biên dịch VibeASR.cpp, tải mô hình đã lượng tử hóa, phiên âm tệp âm thanh từ dòng lệnh, chạy máy chủ truyền phát duy trì và sử dụng giao diện web Gradio để tải lên hoặc ghi âm giọng nói.
Microsoft VibeASR.cpp là gì?
VibeASR.cpp là runtime suy luận C++ chính thức của Microsoft cho VibeVoice-ASR-BitNet, một mô hình nhận dạng giọng nói tự động đa ngôn ngữ đã nén, được thiết kế để suy luận cục bộ hiệu quả trên CPU.
Thay vì là một mô hình giọng nói riêng biệt, VibeASR.cpp cung cấp động cơ được tối ưu hóa cần thiết để chạy mô hình, cho phép phiên âm thời gian thực mà không cần GPU chuyên dụng hay dịch vụ giọng nói trên đám mây.
Điều này khiến nó phù hợp với laptop, máy bàn, thiết bị biên và các hệ thống khác có tài nguyên tính toán hạn chế.

Nguồn: microsoft/VibeVoice-ASR-BitNet
Để việc triển khai trên CPU trở nên thực tế, Microsoft đã thay thế thành phần mô hình ngôn ngữ Qwen2.5-7B dùng trong kiến trúc VibeVoice-ASR gốc bằng mô hình Qwen2.5-1.5B nhỏ hơn nhiều.
Họ cũng áp dụng các phương pháp lượng tử hóa khác nhau cho hai thành phần chính:
I8_Scho bộ mã hóa âm thanh VAEI2_Scho mô hình ngôn ngữ, với embedding độ chính xác cao hơn
Những tối ưu hóa này giảm tổng kích thước mô hình từ khoảng 4,62 GB xuống 1,58 GB, giúp việc chạy trên laptop và máy bàn trở nên khả thi.
Bất chấp việc giảm kích thước đáng kể, mô hình nén chỉ tăng tương đối nhỏ khoảng 1–4 điểm phần trăm về tỷ lệ lỗi từ so với kiến trúc lớn hơn.
VibeASR.cpp sử dụng khung ggml, các lệnh CPU tùy chỉnh và hợp nhất toán tử để cải thiện tốc độ suy luận.
Theo các benchmark của Microsoft, nó có thể chạy nhanh hơn Whisper.cpp 1,6–2,3 lần ở kích thước mô hình tương đương và có thể đạt tốc độ nhanh hơn thời gian thực trên các CPU được hỗ trợ khi sử dụng đủ số luồng.
Trong benchmark CPU của Microsoft, mô hình đạt RTF 0,63 với bốn luồng và 0,42 với tám luồng, tương đương khoảng 1,59× và 2,38× tốc độ thời gian thực.
WER được báo cáo gồm 8,25% trên MLC English, 21,36% trên âm thanh tai nghe AMI, 25,87% trên âm thanh micro xa AMI và 2,41% trên LibriSpeech clean, cho thấy sự cân bằng tốt giữa độ chính xác phiên âm, kích thước mô hình và hiệu năng CPU.
1. Cài đặt các công cụ build cần thiết
VibeASR.cpp chạy hoàn toàn trên CPU, nên bạn không cần GPU chuyên dụng. Bạn chỉ cần máy tính Windows, Linux hoặc macOS được hỗ trợ, Python 3.9 trở lên, Git, bộ biên dịch C++ và khoảng 4 GB dung lượng đĩa trống cho mã nguồn, tệp build và mô hình.
Quy trình build cũng cần CMake và Ninja.
Trên Windows, cách dễ nhất là dùng w64devkit, cung cấp bộ biên dịch và công cụ build trong một terminal cấu hình sẵn.
Trên Linux, có thể cài trực tiếp các gói cần thiết qua trình quản lý gói của hệ thống.
Windows
Tải tệp .exe x64 mới nhất từ trang phát hành của w64devkit.

Tệp đã tải là một gói tự giải nén. Chạy và giải nén thư mục đến nơi đơn giản, chẳng hạn:
C:\w64devkit
Sau đó mở:
C:\w64devkit\w64devkit.exe
Thao tác này mở một terminal sẵn sàng sử dụng chứa GCC, CMake, Make và Ninja. Bạn có thể dùng terminal này cho các bước Windows còn lại mà không cần tự cấu hình biến môi trường.
Linux
Trên Ubuntu, Debian và các bản phân phối liên quan, có thể cài bộ biên dịch và công cụ build cần thiết với một lệnh duy nhất:
sudo apt update
sudo apt install build-essential cmake ninja-build git python3 python3-venv
Lệnh này cài bộ biên dịch GCC, CMake, Ninja, Git, Python và gói cần để tạo môi trường ảo Python.
macOS
Trên macOS, cài công cụ phát triển dòng lệnh của Apple:
xcode-select --install
Bạn cũng sẽ cần Git, Python 3.9 trở lên, CMake và Ninja. Cách dễ nhất để cài các công cụ còn lại là qua Homebrew:
brew install git python cmake ninja
2. Nhân bản VibeASR.cpp và thiết lập môi trường Python
Quy trình thiết lập sau đây giống nhau cho Windows, Linux và macOS.
Bước duy nhất phụ thuộc hệ điều hành là lệnh dùng để kích hoạt môi trường ảo Python.
Mở terminal, chuyển đến thư mục bạn muốn lưu dự án và nhân bản kho VibeASR.cpp:
git clone --recursive https://github.com/microsoft/VibeASR.cpp.git
cd VibeASR.cpp

Tùy chọn --recursive cũng tải submodule llama.cpp cần thiết. Thiếu nó, một số tệp cần để build runtime suy luận sẽ bị thiếu.
Tạo môi trường ảo Python bên trong thư mục dự án.
python -m venv .venv
Kích hoạt nó bằng lệnh tương ứng với hệ điều hành của bạn.
Windows dùng terminal w64devkit:
. .venv/Scripts/activate
Linux và macOS:
source .venv/bin/activate
Sau khi kích hoạt, terminal sẽ hiển thị (.venv) trước dấu nhắc lệnh. Xác nhận Python khả dụng:
python --version
Nâng cấp pip và cài các phụ thuộc của dự án:
python -m pip install --upgrade pip
pip install -r requirements.txt
Các phụ thuộc này gồm những gói Python dùng bởi script thiết lập, quy trình tải mô hình và giao diện web Gradio cục bộ.
3. Build VibeASR.cpp và tải mô hình
VibeASR.cpp bao gồm một script thiết lập xử lý cả quy trình build C++ và tải mô hình.
Nó biên dịch các tệp thực thi dòng lệnh và truyền phát, cài gói GGUF cần thiết và tải các tệp mô hình đã lượng tử hóa sẵn vào thư mục dự án.
Hãy đảm bảo môi trường ảo Python đang hoạt động trước khi chạy script thiết lập.
Trên Linux và macOS, chạy:
python setup_env.py
Trên Windows, chạy lệnh sau trong terminal w64devkit:
CMAKE_GENERATOR=Ninja python setup_env.py
Thiết lập CMAKE_GENERATOR=Ninja đảm bảo CMake dùng hệ thống build Ninja thay vì cố dùng Microsoft Visual C++, vốn không có trong môi trường w64devkit.
Script thiết lập sẽ:
- Cài gói Python
ggufcần thiết. - Cấu hình và biên dịch VibeASR.cpp.
- Build các tệp thực thi suy luận và truyền phát.
- Tải các tệp mô hình VibeASR đã lượng tử hóa sẵn.
- Lưu các mô hình đã tải trong
models/vibeasr.
Sau khi hoàn tất, tệp thực thi suy luận chính sẽ có ở vị trí sau.
Trên Windows:
build/bin/asr_infer.exe
Trên Linux và macOS:
build/bin/asr_infer
Xác minh tệp thực thi đã build thành công bằng cách hiển thị các tùy chọn dòng lệnh hiện có.
Trên Windows:
./build/bin/asr_infer.exe --help
Trên Linux và macOS:
./build/bin/asr_infer --help

4. Thử nghiệm phiên âm tệp và truyền phát
Giờ runtime và mô hình đã sẵn sàng, bạn có thể thử hai phương thức phiên âm.
Tệp thực thi suy luận tiêu chuẩn xử lý một tệp âm thanh và trả về bản phiên âm hoàn chỉnh, trong khi máy chủ truyền phát giữ mô hình được nạp và hiển thị phiên âm dần dần khi các token được tạo ra.
Trước tiên, tải một bản ghi mẫu ngắn từ trong thư mục dự án VibeASR.cpp:
curl -L "https://homepages.inf.ed.ac.uk/htang2/notes/speech-samples/103-1240-0000.wav" -o recording.wav
Tệp âm thanh sẽ được lưu thành recording.wav trong thư mục dự án hiện tại.
Phiên âm một tệp âm thanh
Lệnh suy luận tiêu chuẩn nạp bộ mã hóa âm thanh và mô hình ngôn ngữ, xử lý bản ghi và in bản phiên âm hoàn tất.
Trên Windows, chạy:
./build/bin/asr_infer.exe \
--vae-model models/vibeasr/vibeasr-vae-encoder-i8_s.gguf \
--lm-model models/vibeasr/vibeasr-lm-i2_s-embed-q6_k.gguf \
--audio recording.wav \
-t 6 \
--greedy
Trên Linux và macOS, dùng cùng lệnh nhưng không có đuôi .exe:
./build/bin/asr_infer \
--vae-model models/vibeasr/vibeasr-vae-encoder-i8_s.gguf \
--lm-model models/vibeasr/vibeasr-lm-i2_s-embed-q6_k.gguf \
--audio recording.wav \
-t 6 \
--greedy

Tùy chọn -t 6 gán sáu luồng CPU cho suy luận. Bạn có thể tăng hoặc giảm con số này tùy theo bộ xử lý của mình.
Tùy chọn --greedy chọn token có khả năng cao nhất ở mỗi bước giải mã, tạo ra kết quả phiên âm nhất quán.
Trên máy của tôi, bản ghi dài 14,085 giây mất khoảng 13,7 giây để xử lý:
RTF: 0.9726
Speed: approximately 1.03× real time
Hệ số thời gian thực, hay RTF, so sánh thời gian xử lý với độ dài âm thanh.
RTF dưới 1.0 nghĩa là bản ghi được phiên âm nhanh hơn thời lượng phát thực tế. Hiệu năng sẽ khác nhau tùy bộ xử lý, hệ điều hành, số luồng và độ dài bản ghi.
Thử truyền phát theo từng token
VibeASR.cpp cũng bao gồm một máy chủ truyền phát duy trì. Nó nạp hai tệp mô hình một lần và luôn hoạt động, cho phép bạn gửi nhiều bản ghi mà không cần khởi động lại và nạp lại mô hình mỗi lần.
Đầu ra hoạt động tương tự truyền phát từ mô hình ngôn ngữ lớn.
Thay vì chờ bản phiên âm hoàn tất, bạn bắt đầu thấy văn bản khi bộ giải mã tạo từng token.
Một số token có thể là từ hoàn chỉnh, một số khác là phần của từ hoặc dấu câu, nhưng chúng sẽ hiển thị dần cho đến khi bản phiên âm hoàn tất.
Trên Windows, khởi động máy chủ với:
./build/bin/asr_stream_server.exe \
--vae-model models/vibeasr/vibeasr-vae-encoder-i8_s.gguf \
--lm-model models/vibeasr/vibeasr-lm-i2_s-embed-q6_k.gguf \
-t 6 \
--greedy
Trên Linux và macOS, chạy:
./build/bin/asr_stream_server \
--vae-model models/vibeasr/vibeasr-vae-encoder-i8_s.gguf \
--lm-model models/vibeasr/vibeasr-lm-i2_s-embed-q6_k.gguf \
-t 6 \
--greedy

Chờ đến khi máy chủ nạp xong các mô hình và hiển thị:
---READY---
Nhập đường dẫn đến tệp âm thanh và nhấn Enter:
recording.wav
Phiên âm sẽ bắt đầu xuất hiện theo từng token. Khi bản ghi đã được xử lý xong, máy chủ sẽ hiển thị:
---END---

Bạn có thể nhập đường dẫn tệp âm thanh khác mà không cần nạp lại mô hình. Để dừng máy chủ, gõ:
exit
Quy trình duy trì này đặc biệt hữu ích khi phiên âm nhiều bản ghi hoặc kết nối VibeASR.cpp với ứng dụng khác cần đầu ra phiên âm tiến dần.
5. Khởi chạy và thử giao diện web
VibeASR.cpp bao gồm giao diện web Gradio cục bộ để tải tệp âm thanh hoặc ghi âm bằng micro của bạn. Quy trình giống nhau trên Windows, Linux và macOS, mặc dù Windows dùng tệp thực thi có đuôi .exe.
Các phụ thuộc cần cho giao diện, gồm Gradio, SoundFile và NumPy, đã được cài qua requirements.txt.
Trước hết, hãy đảm bảo môi trường ảo đang hoạt động.
Windows dùng terminal w64devkit:
. .venv/Scripts/activate
Linux và macOS:
source .venv/bin/activate
Trên Windows, khởi chạy giao diện với:
python demo/gradio_asr_demo.py \
--port 7860 \
--bin build/bin/asr_infer.exe \
--server-bin build/bin/asr_stream_server.exe
Trên Linux và macOS, đường dẫn mặc định tới tệp thực thi được tự động phát hiện:
python demo/gradio_asr_demo.py --port 7860
Đường dẫn mô hình đã được cấu hình sẵn trong script Gradio cho mọi hệ điều hành, nên bạn không cần đưa chúng vào lệnh.
Script cũng hỗ trợ đường dẫn riêng cho tệp thực thi suy luận tiêu chuẩn và máy chủ truyền phát.
Mở địa chỉ sau trong trình duyệt của bạn:
http://127.0.0.1:7860
Khám phá giao diện
Giao diện cho phép bạn:
- Chọn mô hình CPU.
- Chọn số luồng CPU.
- Chuyển giữa xử lý Online và Offline.
- Bật giải mã greedy hoặc điều chỉnh temperature và Top-p.
- Tải tệp âm thanh hoặc ghi trực tiếp từ micro của bạn.
- Thêm hotword tùy chọn, như tên riêng hoặc thuật ngữ kỹ thuật.
- Xem bản phiên âm, thời lượng âm thanh và hệ số thời gian thực.
Ở đây, chế độ Online không có nghĩa là âm thanh của bạn được gửi tới dịch vụ trực tuyến.
Nó xử lý các bản ghi dài theo từng khối một cách tiến dần và dùng asr_stream_server khi khả dụng.
Chế độ Offline xử lý toàn bộ tệp âm thanh trước khi hiển thị kết quả.

Thử một bản ghi ngắn
Ở bài thử đầu tiên, tôi ghi một câu ngắn trực tiếp qua micro và chọn chế độ Offline với bốn luồng CPU.

RTF 0,9584 nghĩa là mô hình cần khoảng 0,96 giây để xử lý mỗi giây âm thanh.
Tức khoảng 1,04× thời gian thực, vì vậy phiên âm hoàn tất hơi nhanh hơn so với thời lượng thực tế của bản ghi.
Thử một bản ghi dài hơn
Tôi cũng thử giao diện với một bản ghi dài hơn, chứa khoảng 109,7 giây lời nói. Mô hình đã tạo bản phiên âm đầy đủ và báo cáo:
RTF: 0.5305
Audio: 109.7s

Điều này có nghĩa mô hình cần khoảng 0,53 giây để xử lý mỗi giây âm thanh. Toàn bộ bản ghi mất khoảng 58 giây để phiên âm, cho tốc độ xấp xỉ 1,88× thời gian thực.
Tổng kết
Tôi ấn tượng với mức độ thực tiễn của nhận dạng giọng nói cục bộ hiện nay.
Ngay cả trên CPU cũ, VibeASR.cpp cũng có thể phiên âm âm thanh gần bằng hoặc nhanh hơn thời gian thực mà không cần GPU, nhiều bộ nhớ hay dung lượng lưu trữ lớn.
Tệp thực thi đã biên dịch cũng có thể tích hợp vào ứng dụng Python, bọc trong endpoint FastAPI hoặc dùng làm động cơ phiên âm cho một công cụ cục bộ lớn hơn.
Thiết lập chính cần cân nhắc là số luồng CPU gán cho tiến trình.
Bạn cũng cần chọn giữa chế độ online, truyền phát bản phiên âm dần dần, và chế độ offline, trả về bản phiên âm hoàn chỉnh sau khi xử lý âm thanh.
Việc thiết lập vẫn có thể dễ dàng hơn, đặc biệt trên Windows, Linux và macOS.
Vì dự án vẫn đang phát triển, tôi kỳ vọng cài đặt và hỗ trợ binary dựng sẵn sẽ được cải thiện theo thời gian. Khi có binary độc lập ổn định, tôi có thể sử dụng mô hình này trong nhiều dự án chuyển giọng nói thành văn bản cục bộ hơn nữa.
Tôi cũng khuyên bạn xem hướng dẫn GPT Live Transcribe API của chúng tôi.
FAQs
Mô hình VibeASR thực sự hỗ trợ những ngôn ngữ nào?
Mô hình VibeVoice-ASR hỗ trợ nguyên bản hơn 50 ngôn ngữ. Bao gồm tiếng Anh, Trung, Pháp, Ý, Hàn, Bồ Đào Nha và Tiếng Việt. Mô hình không yêu cầu đặt ngôn ngữ rõ ràng và có thể tự động xử lý "chuyển mã" (khi người nói tự nhiên trộn nhiều ngôn ngữ trong một câu).
Tôi có cần chuyển đổi tệp MP3 hoặc video trước khi phiên âm không?
Nếu bạn dùng trực tiếp tệp thực thi dòng lệnh asr_infer, nó yêu cầu tệp .wav (thường là mono 16kHz, 16-bit). Nếu bạn có âm thanh ở định dạng khác như MP3, M4A hoặc FLAC, bạn sẽ cần chuyển đổi sang WAV trước bằng công cụ như FFmpeg rồi mới truyền vào CLI.
Mô hình có thể nhận diện người nói khác nhau hoặc xuất dấu thời gian theo từng từ không?
Kiến trúc VibeVoice-ASR gốc được thiết kế rõ ràng để tạo đầu ra có cấu trúc chứa "Ai" (phân tách người nói), "Khi nào" (dấu thời gian) và "Nội dung" (nội dung) trong một lần chạy. Tuy nhiên, tệp thực thi suy luận C++ gọn nhẹ (VibeASR.cpp) hiện tập trung vào phiên âm văn bản thô theo tiến trình. Để nhận đầu ra JSON có cấu trúc đầy đủ với ID người nói và dấu thời gian, bạn thường cần chạy mô hình bằng thư viện Python transformers.
Là một nhà khoa học dữ liệu được chứng nhận, tôi đam mê tận dụng công nghệ tiên tiến để tạo ra các ứng dụng học máy đổi mới. Với nền tảng vững chắc về nhận dạng giọng nói, phân tích và báo cáo dữ liệu, MLOps, AI hội thoại và NLP, tôi đã rèn giũa kỹ năng phát triển các hệ thống thông minh có thể tạo ra tác động thực sự. Bên cạnh chuyên môn kỹ thuật, tôi cũng là một người truyền đạt tốt, có khả năng chắt lọc các khái niệm phức tạp thành ngôn ngữ rõ ràng, súc tích. Nhờ đó, tôi trở thành một blogger được nhiều người quan tâm trong lĩnh vực khoa học dữ liệu, chia sẻ góc nhìn và kinh nghiệm với cộng đồng các chuyên gia dữ liệu ngày càng lớn. Hiện tại, tôi tập trung vào sáng tạo và biên tập nội dung, làm việc với các mô hình ngôn ngữ lớn để phát triển nội dung mạnh mẽ và hấp dẫn, giúp doanh nghiệp và cá nhân tận dụng tối đa dữ liệu của mình.
