NeuTTS-Air là một hệ thống chuyển văn bản thành giọng nói (text-to-speech) sử dụng mạng nơ-ron dựa trên Qwen 0.5B – một mô hình ngôn ngữ nhẹ nhưng có khả năng tối ưu hóa để hiểu và tạo văn bản – cũng như sự kết hợp mạnh mẽ của các công nghệ được thiết kế để mang lại hiệu quả và chất lượng, được thiết kế nhẹ đến mức có thể chạy trực tiếp trên máy tính hoặc điện thoại của bạn. Nó nhận đầu vào là chuỗi văn bản và tạo ra âm thanh tương ứng ngay trên thiết bị, không cần gọi đến bất kỳ API bên ngoài nào — nghĩa là toàn bộ quá trình tổng hợp giọng nói diễn ra cục bộ trên máy của bạn.
Vì mọi xử lý đều diễn ra trên thiết bị, dữ liệu văn bản của bạn không bao giờ rời khỏi máy — cực kỳ phù hợp cho ứng dụng nhạy cảm về bảo mật. Ngoài ra, nó hoạt động hoàn hảo khi không có Internet, lý tưởng cho thiết bị nhúng, IoT, hoặc ứng dụng ngoại tuyến.
NeuTTS-Air là mã nguồn mở hoàn toàn, cho phép bạn xem, hiểu và tùy chỉnh mã nguồn. Bạn có thể tinh chỉnh giọng nói cho một nhân vật trong game, hoặc tối ưu hóa hiệu năng cho phần cứng cụ thể — hoàn toàn theo ý mình.

Dưới đây là hướng dẫn đầy đủ – từng bước để chạy VieNeu-TTS (model + code + dataset) trên macOS 14–15 / Mac mini M4 / Python 3.10+ hoàn toàn local, không cần GPU NVIDIA.
1. Chuẩn bị môi trường
Cài Homebrew (nếu chưa có)
/bin/bash -c “$(curl -fsSL //raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)”
Cài Python 3.10+
brew install python@3.10
Tạo môi trường ảo:
python3 -m venv vienneu_env
source vienneu_env/bin/activate
Cài FFmpeg (bắt buộc cho xử lý audio)
brew install ffmpeg
brew install espeak-ng
2. Clone project
git clone //github.com/pnnbao97/VieNeu-TTS
cd VieNeu-TTS
Cấu trúc thư mục
VieNeu-TTS/
├── examples/
│ ├── infer_long_text.py # CLI for long-form synthesis (chunked)
│ └── sample_long_text.txt # Example paragraph for testing
├── gradio_app.py # Local Gradio demo
├── main.py # Basic batch inference script
├── output_audio/ # Generated audio (created when running scripts)
├── sample/ # Reference voices (audio + transcript pairs)
├── utils/
│ ├── __init__.py
│ └── normalize_text.py # Vietnamese text normalization pipeline
├── vieneu_tts/
│ ├── __init__.py
│ └── vieneu_tts.py # Core VieNeuTTS implementation
├── README.md
├── requirements.txt
└── pyproject.toml
3. Cài dependencies
Thư viện PyTorch đã hỗ trợ Apple Silicon + MPS, nên có thể chạy inference trên GPU của M4.
pip install -r requirements.txt
Hoặc: pip install torch transformers neucodec phonemizer librosa soundfile vinorm
Cài PyTorch cho Apple Silicon
pip install torch torchvision torchaudio
(MPS vẫn hoạt động trong bản CPU này vì PyTorch tự dò chip Apple)
Sau khi cài xong, kiểm tra:
python3 – << ‘EOF’
import torch
print(“PyTorch version:”, torch.__version__)
print(“MPS available:”, torch.backends.mps.is_available())
EOF
Kết quả mong đợi:
PyTorch version: 2.6.0
MPS available: True
Nếu như vậy → bạn đã sẵn sàng chạy VieNeu-TTS trên GPU của Mac M4.
Mac dùng GPU Apple Silicon, nên hoàn toàn không tương thích. đơn giản comment thêm dấu #
4. Chỉnh code
Tìm các file chạy main.py, gradio_app.py, examples\infer_long_text.py (chuyển file này ra bên ngoài) sửanội dung
device = “mps” if torch.backends.mps.is_available() else “cpu”
5. Chạy các file thử
Chạy thử
python main.py
Tập lệnh này chạy một số câu chuẩn hóa bằng giọng nói mẫu được đóng gói và ghioutput_*.wavcác tệp dưới dạngoutput_audio/.
web Gradio
python gradio_app.py
Sau đó mở //127.0.0.1:7860 ra:
Chọn một trong sáu giọng tham khảo. Tải lên bản ghi âm + bản ghi tham khảo của riêng bạn. Nhập tối đa 250 ký tự cho mỗi yêu cầu (khuyến nghị). Xem trước hoặc tải xuống âm thanh tổng hợp.
Trợ lý văn bản dài
infer_long_text.pychia các đoạn văn dài thành các phân đoạn ≤2 56 ký tự (ưu tiên ranh giới câu) và tổng hợp chúng theo trình tự.
python3 infer_long_text.py \
--text-file examples/sample_long_text.txt \
--ref-audio sample/id_0001.wav \
--ref-text sample/id_0001.txt \
--output output_audio/sample_long_text.wavLần đầu chạy, model sẽ được tải tự động từ:
//huggingface.co/pnnbao-ump/VieNeu-TTS
Để chạy không cần acti mô trường thì gọi: \thư mục venv\bin\python3 infer_long_text.py
Huấn luyện mô hình Text-to-Speech NeuTTS-Air cho tiếng Việt.
//github.com/iamdinhthuan/neutts-air-fintune
Thư mục loading
ls -la ~/.cache/huggingface/hub
dùng lệnh mở trực tiếp: open ~/.cache/huggingface/hub
Kiểm tra dung lượng/model tải về
du -sh ~/.cache/huggingface/hub/*
Xoá toàn bộ cache HuggingFace:
rm -rf ~/.cache/huggingface/hub
Tải model từ HuggingFace
Cài huggingface-cli: pip install huggingface_hub
Tải model:
huggingface-cli download pnnbao-ump/kani-tts-370m-vie –local-dir models/kani
Cấu trúc sau khi tải:
Kani-TTS-Vie/
└── models/kani/
├── config.json
├── preprocessor_config.json
├── model.safetensors
└── vocabulary.json
# Khởi tạo model
tts = KaniTTS(model_dir=”models/kani”)
text = “Xin chào! Đây là Kani Text to Speech đang chạy trên Mac M4.”
# Sinh giọng nói
audio = tts.tts(text)
# Lưu file WAV
sf.write(“kani_output.wav”, audio, 22050)
Xử lý văn bản thiếu dấu câu.
//huggingface.co/organizations/protonx-models/activity/all
//huggingface.co/protonx-models/protonx-legal-tc
Sửa lỗi văn bản pháp lý ProtonX (v1.2-NC)
Mộtmô hình hiệu chỉnh tiếng Việt chuyên biệtđược thiết kế đểxử lý hậu kỳ OCR có độ chính xác cao, đặc biệt làđể sửa lỗi đầu ra PaddleOCR bị nhiễu trong quy trình làm việc của doanh nghiệp và pháp lý. Xử lý 1 câu cho 1 lần chạy.
Chạy trên Mac thay
"cuda" if torch.cuda.is_available() else "cpu"đoạn âm thanh dài 60 phút
một mô hình chuyển đổi giọng nói thành văn bản thống nhất được thiết kế để xử lý các đoạn âm thanh dài 60 phút chỉ trong một lần xử lý. //github.com/microsoft/VibeVoice
VieNeu-TTS là một mô hình chuyển văn bản thành giọng nói (TTS) tiếng Việt tiên tiến trên thiết bị, với khả năng sao chép giọng nói tức thì và hỗ trợ song ngữ Anh-Việt .
OmniVoice
OmniVoice là một mô hình chuyển văn bản thành giọng nói (TTS) đa ngôn ngữ không cần huấn luyện tiên tiến, hỗ trợ hơn 600 ngôn ngữ. Được xây dựng trên kiến trúc mô hình ngôn ngữ khuếch tán mới, nó tạo ra giọng nói chất lượng cao với tốc độ suy luận vượt trội, hỗ trợ sao chép giọng nói và thiết kế giọng nói.
Phần mềm Voiceboxthu âm mã nguồn mở vừa biến hai công cụ SaaS trả phí thành tùy chọn
Chúng tôi đã trả tiền cho ElevenLabs để sử dụng TTS hoặc WisprFlow để đọc chính tả, hoặc cả hai, hoặc đang cân nhắc việc đó. Voicebox là ứng dụng mã nguồn mở cục bộ thực hiện cả hai chức năng, cung cấp chúng localhost và tích hợp máy chủ MCP để lập trình viên của chúng tôi có thể nói bằng bất kỳ giọng nói nào chúng tôi đã sao chép. Chỉ cần thêm vài giây âm thanh tham khảo, bạn có thể lưu hồ sơ giọng nói vào giao diện người dùng cục bộ của Voicebox hoặc chọn từ hơn 50 giọng nói cài sẵn thông qua Kokoro và Qwen CustomVoice.
Tạo giọng nói bằng 23 ngôn ngữ trên bảy công cụ chuyển văn bản thành giọng nói (TTS): Qwen3-TTS, Qwen CustomVoice, LuxTTS, Chatterbox Multilingual, Chatterbox Turbo, HumeAI TADA và Kokoro 82M.
Mỗi phần mềm đều có những điểm mạnh khác nhau, Chatterbox Turbo là phần mềm duy nhất xử lý được các thẻ phi ngôn ngữ như [laugh]và [sigh], Kokoro chạy trên CPU thời gian thực với VRAM không đáng kể, HumeAI TADA duy trì giọng nói mạch lạc trong hơn 700 giây đầu ra mà không bị lệch và tất cả đều có thể chuyển đổi giữa các thế hệ.
Đọc chính tả trên toàn hệ thống
Giữ phím tắt toàn cục ở bất kỳ đâu trên hệ thống, nói và thả ra.
Trên macOS, bản ghi đã được chỉnh sửa sẽ tự động dán vào trường văn bản đang được chọn.
Whisper đảm nhiệm việc phiên âm và một chương trình Qwen3 LLM đi kèm (chạy cục bộ) sẽ loại bỏ các từ thừa, dấu câu và lỗi khởi đầu trước khi dán.
Đây là phần WisprFlow của vòng tuần hoàn.
Máy chủ MCP cho tác nhân lập trình của chúng tôi
Đây là phần mà chúng ta, với tư cách là nhà phát triển, nên quan tâm.
Voicebox được tích hợp sẵn máy chủ MCP.
Chỉ cần một dòng cấu hình trong Claude Code, Cursor, Windsurf, Cline hoặc bất kỳ ứng dụng khách nào hỗ trợ MCP, và tác nhân có thể gọi voicebox.speakđể phản hồi lại chúng ta bằng bất kỳ giọng nói nào chúng ta đã sao chép.
Liên kết giọng nói riêng cho từng máy khách: Claude Code trong một giọng nói, Cursor trong giọng nói khác. Giao diện người dùng dạng viên thuốc nổi hiển thị mọi lời thoại do tác nhân khởi tạo, vì vậy chúng ta luôn thấy những gì đang phát ra từ máy của mình.
API REST đi kèm
Mỗi công cụ chuyển văn bản thành giọng nói (TTS) trở thành một điểm cuối HTTP trên localhost:17493. Không cần khóa API, không giới hạn số lượng và không tính phí trên mỗi ký tự.
Hai điểm cuối mà chúng ta sẽ sử dụng nhiều nhất:
POST /speak,Đối với các thông báo trạng thái ngắn được chuyển tiếp qua giao diện người dùng dạng viên thuốc trên màn hình:
curl -X POST //127.0.0.1:17493/speak \
-H “Content-Type: application/json” \
-H “X-Voicebox-Client-Id: my-script” \
-d ‘{ “text” : “Triển khai hoàn tất.” , “profile” : “Giọng nói của tôi” }’
Trường này profilechấp nhận tên hồ sơ giọng nói (không phân biệt chữ hoa chữ thường) hoặc UUID của nó, Voicebox sẽ phân giải chúng theo cùng thứ tự ưu tiên như công cụ MCP.
Phần X-Voicebox-Client-Idtiêu đề cho phép Voicebox liên kết một giọng nói mặc định cho mỗi tập lệnh hoặc ứng dụng.
Một lớp bao bọc Python tối thiểu trông như thế này:
import requests
def speak ( text, profile= “My Voice” , client_id= “build-script” ):
requests.post(
“//127.0.0.1:17493/speak” ,
json={ “text” : text, “profile” : profile},
headers={ “X-Voicebox-Client-Id” : client_id}
)
# Đặt nó vào bất kỳ đâu
run_tests()
speak( “Tests passed. 247 of 247.” )
Đó là sự tích hợp hữu ích nhỏ nhất: mười dòng lệnh biến thói quen nhấn Alt+Tab thành nhận thức môi trường xung quanh. (Thay thế “My Voice”bằng tên hồ sơ mà chúng ta đã tạo trong giao diện người dùng Voicebox.)
POST /generate,Để khôi phục các tệp âm thanh, với khả năng điều khiển công cụ và kiểu dáng:
curl -X POST //127.0.0.1:17493/generate \
-H “Content-Type: application/json” \
-d ‘{
“text” : “Chào mừng bạn đến với trò chơi, người chơi một.” ,
“profile_id” : “b3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d” ,
“engine” : “qwen_custom_voice” ,
“instruct” : “warm, slow, cinematic”
}’ \
–output line.wav
Lưu ý sự khác biệt giữa hai điểm cuối: điểm cuối này /generate nhận một UUID ( profile_id) thay vì tên, chấp nhận lựa chọn công cụ và hỗ trợ các hướng dẫn theo kiểu ngôn ngữ tự nhiên thông qua instruct.
Nó trả về các byte âm thanh mà chúng ta lưu vào một tệp. /speakđiểm cuối này dành cho vòng lặp hội thoại; /generateđiểm cuối này dành cho việc sản xuất nội dung.
Trao tiếng nói cho chuyên viên lập trình của chúng tôi
Máy chủ MCP chính là điểm khiến Voicebox trở nên thú vị đối với các nhà phát triển. Một lệnh trong Claude Code, được trích dẫn trực tiếp từ ghi chú phát hành phiên bản v0.5.0 của Voicebox:
claude mcp add voicebox –transport http \
–url //127.0.0.1:17493/mcp \
–header “X-Voicebox-Client-Id: claude-code”
Đối với các ứng dụng khách MCP khác (Cursor, Windsurf, Claude Desktop), cấu hình truyền tải HTTP chung hoạt động:
{
“mcpServers” : {
“voicebox” : {
“type” : “http” ,
“url” : “//127.0.0.1:17493/mcp”
}
}
}
Hãy đặt đoạn mã này vào .mcp.jsonthư mục gốc của dự án Claude Code, .cursor/mcp.jsonhoặc đường dẫn tương đương cho bất kỳ ứng dụng khách hỗ trợ MCP nào mà chúng ta đang sử dụng. Sau khi kết nối, tác nhân có thể gọi voicebox.speaktrực tiếp.
Kho lưu trữ Voicebox thậm chí còn cung cấp sẵn một bộ dây đã được đấu nối .mcp.json, việc chạy Claude Code bên trong quá trình tải xuống sẽ tự động nhận diện các công cụ.
Tính toán chi phí, tóm tắt
Voicebox là dịch vụ miễn phí, trong khi hai nhà cung cấp dịch vụ đám mây lâu năm mà nó thay thế thì không.
ElevenLabs hoạt động dựa trên hệ thống tín dụng, trong đó một tín dụng tương đương với một ký tự âm thanh được tạo ra.
Voicebox là phần mềm miễn phí. Sau lần tải xuống ban đầu, chi phí phát sinh duy nhất là tiền điện mà máy của chúng tôi đã sử dụng.
Đối với các nhà phát triển tích hợp tính năng giọng nói vào ứng dụng của mình, phí dịch vụ đám mây tính theo từng ký tự không còn là lựa chọn duy nhất nữa.
Đối với các nhóm sử dụng đọc chính tả làm phương pháp nhập liệu hàng ngày, gói đăng ký theo từng người dùng không còn là lựa chọn duy nhất. Vấn đề chi phí là hoàn toàn có cơ sở.
Nhưng thực tế, chi phí không phải là toàn bộ lý do khiến Voicebox trở nên thú vị.
Khi chức năng thoại trở thành API REST cục bộ localhost:17493, những thứ chúng ta có thể xây dựng sẽ thay đổi.
Một công cụ dòng lệnh (CLI) thông báo trạng thái trong khi hoạt động, lời thoại của NPC được tạo trên máy của người chơi bằng giọng nói do người chơi lựa chọn và một lớp hỗ trợ tiếp cận cho người không còn nói được bằng giọng của mình nhưng vẫn còn lưu giữ các bản ghi âm cũ.
Không có ý tưởng nào trong số này là mới, chúng chỉ bị khóa sau các API đám mây và việc tính phí theo từng ký tự.
Voicebox mở khóa chúng bằng cách biến giọng nói thành một thành phần cơ bản thay vì một dịch vụ. Cách thức tương tự localhost:5432cũng được áp dụng khi chúng ta sử dụng Postgres.
Điều thực sự còn thiếu là gì?
Dự án đang tiến triển nhanh chóng và điều đó thể hiện rõ. Hiện chưa có các tệp nhị phân dựng sẵn cho Linux, người dùng Linux phải tự biên dịch từ mã nguồn. Chất lượng sao chép giọng nói thay đổi đáng kể tùy thuộc vào công cụ; Qwen3-TTS có độ trung thực cao nhất, nhưng một vấn đề mở gần đây ( #515 ) đã báo cáo sự suy giảm tính nhất quán trong phiên bản v0.4.1 trên Apple Silicon.
Không có tính năng đồng bộ hóa đám mây nếu chúng ta làm việc trên nhiều máy khác nhau, mỗi cài đặt là một thế giới riêng biệt và mặc dù Voicebox tự gọi mình là “ưu tiên cục bộ”, một số mô hình (đặc biệt là Qwen3-TTS 1.7B trong các phiên bản trước đó) yêu cầu truy cập mạng để tra cứu siêu dữ liệu HuggingFace ngay cả sau khi tải xuống, vấn đề này đã được vá trong phiên bản v0.4.5. Tuy nhiên, điều này nhắc nhở chúng ta rằng “ưu tiên cục bộ” với các mô hình được huấn luyện trên đám mây vẫn có những hạn chế nhất định.
Yếu tố xe buýt rất quan trọng ở đây:
Voicebox chủ yếu được duy trì bởi một người, cũng chính là người đang duy trì Spacedrive. Giấy phép MIT cho phép chúng ta có thể tạo bản sao (fork) nếu cần, nhưng “có thể tạo bản sao” khác với “không cần thiết”. Đối với các nhà phát triển xem Voicebox như một thành phần chịu tải nặng trong môi trường sản xuất, rủi ro khi chỉ có một người duy trì là có thật.
Đối với các ứng dụng SaaS đa người dùng trong môi trường sản xuất, những điều này không quan trọng vì Voicebox không được thiết kế cho trường hợp sử dụng đó. Nó là một ứng dụng dành cho máy tính để bàn và một máy chủ cục bộ.
Nếu chúng ta đang triển khai các tính năng thoại cho người dùng trên quy mô lớn, API và cơ sở hạ tầng của ElevenLabs vẫn là giải pháp phù hợp. Voicebox thay thế các gói đăng ký riêng lẻ và cơ sở hạ tầng thoại dành cho nhà phát triển, chứ không phải cơ sở hạ tầng thoại cho các sản phẩm SaaS.
Đáng để dành cuối tuần
Đối với hầu hết các nhà phát triển đọc bài viết này, Voicebox đáng để dành một ngày cuối tuần để tìm hiểu. Hãy cài đặt nó, hướng Claude Code đến đó, nghe quá trình biên dịch hoàn tất bằng giọng nói mà chúng tôi đã chọn, và quyết định xem sự thay đổi quy trình làm việc này có hiệu quả hay không.
Nếu hiện tại chúng ta đang trả tiền cho ElevenLabs hoặc WisprFlow, hãy tính toán xem chi phí đó so với mức sử dụng thực tế của chúng ta như thế nào.
Nếu chúng ta đang xây dựng một thứ gì đó mà tính năng thoại chỉ là một tính năng bổ sung cho đến khi chúng ta thấy dự luật về API, thì cách tính toán đã thay đổi.
Nó sẽ không thay thế hoàn toàn ElevenLabs, và cũng không cần phải vậy. Nó chỉ cần đủ tốt cho một số ít trường hợp sử dụng mà việc chạy mô hình trên máy tính của chúng ta là lựa chọn đúng đắn, và đối với hầu hết những gì các nhà phát triển đang làm với các API này, việc chứng minh điều đó giờ đây đã dễ dàng hơn.
Voicebox có tại github.com/jamiepine/voicebox , được cấp phép theo giấy phép MIT.
Tải xuống cho macOS và Windows tại voicebox.sh .
Tài liệu hướng dẫn tại docs.voicebox.sh .

Bài viết liên quan: