Tự host Whisper và Piper trên VPS CPU
Chạy Whisper transcription và Piper TTS trên VPS của bạn, xem chi phí CPU, dung lượng model và cách mở endpoint tương thích OpenAI qua HTTP.
Tóm tắt về speech to text và TTS tự host
Speech to text và TTS (text to speech) tự host là loại AI có chi phí thấp nhất mà bạn có thể chạy trên server của mình. Công cụ transcription chạy Whisper thông qua runtime faster-whisper. Công cụ synthesis chạy Piper. Cả hai đều hoạt động trên VPS CPU thông thường mà không cần GPU. Model Whisper nhỏ cần khoảng 484 MB dung lượng đĩa, còn một voice của Piper chỉ là một file nhỏ hơn nhiều so với 150 MB.
Vì vậy, audio là nơi nên bắt đầu. Trình tạo ảnh tự host và tạo video tự host đều cần GPU trước khi có thể sử dụng thực tế. Audio thì không.
Hướng dẫn này bao quát cả hai chiều và lớp kết nối chúng. Whisper chuyển audio thành text. Piper chuyển text thành audio. Một HTTP server tương thích với OpenAI đặt phía trước cả hai cho phép client hiện có trỏ đến máy của bạn mà không cần thay đổi gì ngoài base URL.
Mọi version được nêu ở đây đều là version hiện hành vào tháng 8 năm 2026.
Vì sao dùng faster-whisper thay vì package Whisper tham chiếu
Package whisper của OpenAI chạy model bằng PyTorch. faster-whisper chạy cùng các model weights trên CTranslate2, một inference engine được viết riêng cho các model transformer. Các weights giống hệt nhau, nên transcript cũng giống nhau. Khác biệt hoàn toàn nằm ở runtime.
CTranslate2 quantize weights trong lúc load, nên compute_type="int8" là một argument chứ không phải một bước conversion riêng. Nó cũng không phụ thuộc vào PyTorch. pip install faster-whisper cài CTranslate2, một tokenizer và PyAV để decode audio, nên virtual environment chỉ chiếm vài trăm megabyte thay vì vài gigabyte. Trên VPS có disk 40 GB, chênh lệch này quyết định việc hệ thống còn dư dả hay bị chật chội.
Dưới đây là các số liệu do chính project công bố cho model small trên CPU. Benchmark transcribe 13 phút audio bằng 8 threads trên Intel Core i7-12700K. Cột x_realtime là 13 phút chia cho thời gian đo được: 7.6 nghĩa là bản ghi dài 13 phút hoàn tất trong hơn 1 phút 40 giây một chút.
The data behind this chart
[
{
"label": "openai/whisper, fp32",
"x_realtime": 1.9,
"seconds": 418,
"memory_mb": "2,335"
},
{
"label": "whisper.cpp, fp32",
"x_realtime": 6.2,
"seconds": 125,
"memory_mb": "1,049"
},
{
"label": "faster-whisper, fp32",
"x_realtime": 5.0,
"seconds": 157,
"memory_mb": "2,257"
},
{
"label": "faster-whisper, int8",
"x_realtime": 7.6,
"seconds": 102,
"memory_mb": "1,477"
},
{
"label": "faster-whisper, int8, batch 8",
"x_realtime": 15.3,
"seconds": 51,
"memory_mb": "3,608"
}
]Hãy đọc hàng thứ hai một cách chính xác. Ở fp32, whisper.cpp nhanh hơn faster-whisper trên CPU này, 6.2x so với 5.0x, đồng thời dùng chưa đến một nửa lượng memory. Đây là cùng họ ggml đứng sau phần llama.cpp của local LLM stack. faster-whisper vượt lên khi bật int8 và batching, đạt 15.3x, và dùng 3,608 MB RAM cho việc đó. Vì vậy: chọn faster-whisper nếu cần Python API và batching; chọn whisper.cpp khi RAM là giới hạn không thể tăng.
Hàng đầu tiên mới là điểm chính của section này. Reference package đạt 1.9x thời gian thực trên cùng máy, nghĩa là 1 giờ audio cần nửa giờ CPU.
Whisper cần bao nhiêu dung lượng đĩa cho model weights?
The data behind this chart
[
{
"label": "tiny",
"weights_mb": 75.5
},
{
"label": "base",
"weights_mb": 145
},
{
"label": "small",
"weights_mb": 484
},
{
"label": "medium",
"weights_mb": "1,530"
},
{
"label": "large-v3",
"weights_mb": "3,090"
}
]Đây là các bản chuyển đổi CTranslate2 được công bố, ở định dạng float16. Lưu ý compute_type="int8" không làm gì: nó không làm giảm dung lượng tải xuống. Weights được tải xuống ở định dạng float16, sau đó CTranslate2 quantize chúng trong bộ nhớ khi load. Vì vậy, large-v3 chiếm 3,090 MB trên đĩa dù bạn chạy ở float16 hay int8. int8 giúp giảm RAM và tăng tốc độ, không giảm dung lượng đĩa.
Model được tải xuống trong lần sử dụng đầu tiên vào ~/.cache/huggingface/hub. Trên VPS có root volume nhỏ, hãy trỏ thư mục này đến nơi còn đủ dung lượng bằng argument download_root hoặc biến môi trường HF_HOME. Nếu không, lần chạy đầu tiên có thể làm đầy đĩa và process sẽ dừng giữa chừng khi đang tải xuống.
Cài faster-whisper mà không làm hỏng Python hệ thống
Ubuntu 24.04 và Debian 13 đánh dấu Python hệ thống là do hệ thống bên ngoài quản lý. Chạy pip install faster-whisper bên ngoài virtual environment sẽ dừng ngay với lỗi:
error: externally-managed-environmentĐó là hệ thống quản lý package đang bảo vệ các file do apt sở hữu. Hãy dùng virtual environment.
sudo apt update
sudo apt install -y python3-venv ffmpeg
python3 -m venv ~/stt
~/stt/bin/pip install --upgrade pip
~/stt/bin/pip install faster-whisper==1.2.1Version 1.2.1 là bản release hiện tại, được phát hành vào tháng 10 năm 2025. faster-whisper giải mã audio thông qua PyAV. PyAV tích hợp các thư viện ffmpeg riêng, nên có thể đọc file mp3 hoặc m4a mà không cần binary ffmpeg riêng. Package ffmpeg ở trên dùng cho phần xử lý video ở cuối guide này.
Hãy kiểm tra việc cài đặt trước khi tải xuống 3 gigabyte model weights:
~/stt/bin/python -c "from faster_whisper import WhisperModel; print('ok')"Dòng có nội dung ok cho biết các wheel đã được cài đặt. Lỗi ImportError có nội dung ctranslate2 cho biết wheel dành cho kiến trúc của bạn không được cài đặt. Trường hợp này xảy ra với các image ARM 32-bit.
Chuyển bản ghi cuộc họp hoặc ghi âm giọng nói thành văn bản
Lưu nội dung này vào transcribe.py:
from faster_whisper import WhisperModel
model = WhisperModel("small", device="cpu", compute_type="int8", cpu_threads=4)
segments, info = model.transcribe("meeting.m4a", beam_size=5, vad_filter=True)
print("language: %s (%.2f)" % (info.language, info.language_probability))
for segment in segments:
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))Chạy bằng ~/stt/bin/python transcribe.py. Lần chạy đầu tiên sẽ tải weights, nên trong một lúc sẽ không có output. Sau đó, model sẽ được tải từ cache trong vài giây.
segments là một generator, vì vậy quá trình chuyển giọng nói thành văn bản chưa bắt đầu cho đến khi bạn iterate qua nó. Nhiều người đo thời gian gọi transcribe(), thấy hàm trả về ngay lập tức rồi nghĩ rằng có lỗi. Không có lỗi. Công việc diễn ra trong vòng lặp.
vad_filter=True chạy Silero VAD (voice activity detection) trước và loại bỏ các đoạn im lặng trước khi Whisper xử lý. Với bản ghi cuộc họp có nhiều khoảng ngắt dài, đây là cách tăng tốc hiệu quả nhất, vì Whisper hoàn toàn không phải xử lý các đoạn âm thanh không có giọng nói. Cách này cũng ngăn các vòng lặp lặp lại câu mà Whisper tạo ra khi nhận đầu vào là khoảng im lặng và cố tìm từ trong đó.
Đặt cpu_threads bằng số core thực tế bạn có. Đặt giá trị này cao hơn số vCPU sẽ làm quá trình chuyển giọng nói thành văn bản chậm hơn, vì các thread bổ sung phải tranh chấp cùng một core và scheduler phải trả chi phí cho mỗi lần chuyển đổi.
Phụ đề cho thư viện Jellyfin
Jellyfin đọc các file phụ đề bên ngoài nằm cạnh video và có cùng tên với video. Vì vậy, Movie (2019).en.srt đặt cạnh Movie (2019).mkv sẽ xuất hiện dưới dạng một track tiếng Anh mà không cần transcoding hoặc rebuild thư viện.
Trước tiên, hãy tách audio. Whisper tự resample mọi dữ liệu về mono 16 kHz, nên cung cấp sẵn audio mono 16 kHz sẽ giảm phần xử lý ở cả hai đầu:
ffmpeg -i "Movie (2019).mkv" -vn -ac 1 -ar 16000 -c:a pcm_s16le "Movie (2019).wav"faster-whisper không có SRT writer, nên bạn phải tự format các segment. Lưu đoạn này thành srt.py:
import sys
from faster_whisper import WhisperModel
def ts(seconds):
ms = int(round(seconds * 1000))
hours, ms = divmod(ms, 3600000)
minutes, ms = divmod(ms, 60000)
secs, ms = divmod(ms, 1000)
return "%02d:%02d:%02d,%03d" % (hours, minutes, secs, ms)
model = WhisperModel("small", device="cpu", compute_type="int8")
segments, info = model.transcribe(sys.argv[1], vad_filter=True)
with open(sys.argv[2], "w", encoding="utf-8") as out:
for index, segment in enumerate(segments, start=1):
out.write("%d\n" % index)
out.write("%s --> %s\n" % (ts(segment.start), ts(segment.end)))
out.write("%s\n\n" % segment.text.strip())Sau đó duyệt qua thư viện:
for f in /srv/media/films/*.mkv; do
ffmpeg -nostdin -y -i "$f" -vn -ac 1 -ar 16000 -c:a pcm_s16le "${f%.mkv}.wav"
nice -n 15 ~/stt/bin/python srt.py "${f%.mkv}.wav" "${f%.mkv}.en.srt"
rm -f "${f%.mkv}.wav"
done-nostdin không phải phần trang trí. Nếu thiếu nó, ffmpeg sẽ đọc từ standard input của vòng lặp, nuốt phần còn lại của danh sách file và vòng lặp sẽ dừng sau một phim mà không hiển thị thông báo lỗi.
Hãy tính trước thời gian cần thiết. Với tốc độ 7.6x nêu trên, một phim dài 100 phút cần khoảng 13 phút CPU, nên thư viện 50 phim sẽ mất cả đêm để xử lý. Trên gói shared vCPU, thời gian sẽ còn lâu hơn. Đó là lý do dùng nice: tiến trình tạo phụ đề sẽ nhường CPU cho các tác vụ khác mà máy chủ đang thực sự chạy.
Chuyển văn bản thành giọng nói với Piper
Piper là công cụ chuyển văn bản thành giọng nói bằng neural network, chạy model giọng nói ONNX trên CPU. Piper tích hợp espeak-ng để chuyển văn bản thành phoneme, nên không cần cài phonemizer riêng. Bản phát hành hiện tại là 1.6.0, được công bố vào July 2026.
python3 -m venv ~/tts
~/tts/bin/pip install piper-tts==1.6.0
~/tts/bin/python -m piper.download_voices en_US-lessac-medium
~/tts/bin/python -m piper -m en_US-lessac-medium -f test.wav -- 'This is a test.'download_voices ghi 2 file vào working directory: file weights .onnx và file config .onnx.json chứa sample rate cùng danh sách speaker. Hai file này phải được đặt cùng nhau. Nếu lưu voice ở một vị trí cố định, hãy truyền --data-dir cho cả 2 command, vì player mặc định tìm trong working directory và sẽ không tìm thấy voice nằm ở nơi khác.
-- đứng trước phần văn bản cũng rất quan trọng. Nếu thiếu, mọi câu bắt đầu bằng dấu gạch ngang sẽ bị phân tích thành command-line option.
Voice được phát hành với nhiều mức chất lượng. Một voice tiếng Anh chất lượng medium chiếm khoảng 60 MB, còn bản high lớn hơn khoảng gấp đôi. Chất lượng cao hơn nghĩa là model lớn hơn và cần nhiều CPU hơn cho mỗi giây âm thanh, không phải là speaker khác.
Không gọi CLI trong loop. Mỗi lần chạy, CLI lại load model, và thời gian load model chiếm phần lớn chi phí của một câu ngắn. Thay vào đó, hãy chạy HTTP server:
~/tts/bin/pip install 'piper-tts[http]==1.6.0'
~/tts/bin/python -m piper.http_server -m en_US-lessac-medium --host 127.0.0.1 --port 5000curl -X POST -H 'Content-Type: application/json' \
-d '{ "text": "This is a test." }' \
-o test.wav localhost:5000/synthesizeNếu nhận được một test.wav có thể phát, nghĩa là hệ thống hoạt động. Endpoint này dùng định dạng riêng của Piper, không phải định dạng của OpenAI, nên client chờ /v1/audio/speech sẽ không kết nối được với nó. Phần tiếp theo sẽ xử lý vấn đề này.
Hãy giữ service chạy bằng unit file thay vì một terminal mà bạn sẽ đóng:
[Unit]
Description=Piper text to speech HTTP server
After=network-online.target
[Service]
User=piper
ExecStart=/home/piper/tts/bin/python -m piper.http_server -m en_US-lessac-medium --data-dir /home/piper/voices --host 127.0.0.1 --port 5000
Restart=on-failure
[Install]
WantedBy=multi-user.targetsudo systemctl enable --now piper khởi động service và chạy lại service sau reboot. Nếu lệnh curl ở trên không trả về gì, journalctl -u piper -n 50 chứa nguyên nhân. Nguyên nhân thường gặp nhất là thiếu file voice.
Hình thức server tương thích với OpenAI
Phần lớn phần mềm xử lý audio đã hỗ trợ OpenAI audio API: gửi POST multipart đến /v1/audio/transcriptions để tải file, hoặc gửi POST JSON đến /v1/audio/speech cho một câu. Bạn chỉ cần tự phục vụ hai path này; phía client chỉ phải thay đổi base URL.
Speaches là một server hỗ trợ cả hai chiều. Nó chạy faster-whisper để transcription và Piper hoặc Kokoro để tổng hợp speech, thông qua các path của OpenAI. Bản release hiện tại là v0.9.0-rc.3 từ tháng 12 năm 2025, vẫn chưa đạt 1.0. Vì vậy, hãy pin image tag và đọc release notes trước khi upgrade.
curl --silent --remote-name https://raw.githubusercontent.com/speaches-ai/speaches/master/compose.yaml
curl --silent --remote-name https://raw.githubusercontent.com/speaches-ai/speaches/master/compose.cpu.yaml
export COMPOSE_FILE=compose.cpu.yaml
docker compose up --detachDạng single-container, nếu bạn không muốn duy trì các file compose:
docker run --rm --detach --publish 8000:8000 --name speaches \
--volume hf-hub-cache:/home/ubuntu/.cache/huggingface/hub \
ghcr.io/speaches-ai/speaches:latest-cpuNamed volume là phần mọi người thường bỏ sót. Nếu không có volume này, model cache sẽ nằm bên trong container. Mỗi lần restart, server phải tải lại hàng gigabyte weights trước khi phản hồi request đầu tiên.
Speech cần được tải voice xuống trước khi /v1/audio/speech có thể phản hồi:
uvx speaches-cli model download speaches-ai/Kokoro-82M-v1.0-ONNXSau đó, mọi OpenAI client đều hoạt động nếu thay đổi base URL:
from pathlib import Path
from openai import OpenAI
openai = OpenAI(base_url="http://localhost:8000/v1", api_key="cant-be-empty")
res = openai.audio.speech.create(
model="speaches-ai/Kokoro-82M-v1.0-ONNX",
voice="af_heart",
input="Hello, world!",
response_format="mp3",
speed=1,
)
with Path("output.mp3").open("wb") as f:
f.write(res.response.read())Placeholder api_key là bắt buộc vì OpenAI client library từ chối gửi request nếu không có giá trị này. Server bỏ qua giá trị của nó cho đến khi bạn cấu hình key thật.
vox-box là project còn lại đáng nhắc đến ở đây. Đây là một Python package thay vì một container. Nó phục vụ cùng các path đó với Whisper, FunASR, Bark, Dia hoặc CosyVoice đứng phía sau. Version 0.0.21 là bản hiện tại, phát hành vào tháng 12 năm 2025, và cần Python 3.10 trở lên.
python3 -m venv ~/voice
~/voice/bin/pip install vox-box==0.0.21
~/voice/bin/vox-box start --huggingface-repo-id Systran/faster-whisper-small \
--data-dir ~/voice/data --host 127.0.0.1 --port 8010Ví dụ của project bind vào port 80, nên cần root. Trên server còn chạy các workload khác, cách phù hợp hơn là dùng một port cao phía sau reverse proxy. vox-box start chỉ nhận một model. Vì vậy, để hỗ trợ cả hai chiều, bạn cần chạy instance thứ hai trên port thứ hai và cung cấp speech repo id.
Hãy hỏi server đã load những gì, rồi dùng id đó trong field model:
curl http://127.0.0.1:8010/v1/modelscurl http://127.0.0.1:8010/v1/audio/transcriptions \
-H "Content-Type: multipart/form-data" \
-F file="@voice-note.m4a" \
-F model="faster-whisper-small"JSON body có dạng {"text": "..."} cho biết toàn bộ path đang hoạt động. Lỗi 404 với model name có nghĩa là bạn đã đoán thay vì đọc output của /v1/models.
Không server nào trong số này bật authentication theo mặc định. Hãy bind chúng vào 127.0.0.1 và truy cập qua VPN hoặc reverse proxy có yêu cầu credentials. Một /v1/audio/transcriptions mở trên public IP là CPU miễn phí cho bất kỳ ai tìm thấy nó, và họ sẽ tìm thấy nó.
Một giao diện giọng nói cho trợ lý tự host
Khi cả hai chiều đều phản hồi qua các path của OpenAI, bạn có thể dùng một chat front end để điều khiển chúng. Open WebUI và các lựa chọn thay thế chấp nhận base URL tương thích với OpenAI cho audio trong phần settings, vì vậy một máy có thể chạy LLM cục bộ bằng Ollama và khép kín vòng xử lý giọng nói ở cả hai đầu.
Hãy dự trù latency thực tế, vì ba bước đó chạy tuần tự trên cùng các core. Một câu hỏi dài 10 giây mất khoảng 1.3 giây để chuyển thành văn bản theo mức 7.6x nêu trên, và đó là trước khi model đọc token đầu tiên. Khi cộng thêm việc tạo token bằng CPU, round trip đủ chậm để người kiểm thử tưởng rằng dịch vụ đã bị crash. Transcription theo lô hoạt động tốt trên CPU. Hội thoại thì không, và đó là lúc một VPS có GPU bắt đầu xứng đáng với chi phí.
Khi nào GPU thực sự đáng dùng?
The data behind this chart
[
{
"label": "openai/whisper, fp16",
"x_realtime": 5.5,
"seconds": 143,
"memory_mb": "4,708"
},
{
"label": "faster-whisper, fp16",
"x_realtime": 12.4,
"seconds": 63,
"memory_mb": "4,525"
},
{
"label": "faster-whisper, int8",
"x_realtime": 13.2,
"seconds": 59,
"memory_mb": "2,926"
},
{
"label": "faster-whisper, int8, batch 8",
"x_realtime": 48.8,
"seconds": 16,
"memory_mb": "4,500"
}
]Trên GPU, model large ở int8 chạy nhanh hơn thời gian thực 13.2 lần và dùng 2,926 MB VRAM. Khi chạy theo batch, tốc độ tăng lên 48.8 lần. Lưu ý kỹ điều mà hai biểu đồ không nói. Chúng chạy các model khác nhau: các dòng GPU dùng large-v2, còn các dòng CPU dùng small. GPU không làm model small nhanh hơn sáu lần. GPU giúp model có độ chính xác cao chạy được.
Các số liệu này lấy từ đâu
Cả hai biểu đồ đều tái hiện benchmark được công bố trong README của faster-whisper. File audio là một file duy nhất dài 13 phút. Các dòng CPU dùng 8 thread trên Intel Core i7-12700K, còn các dòng GPU dùng CUDA 12.4 trên NVIDIA RTX 3070 Ti với 8 GB VRAM. Các cột giây và bộ nhớ là số liệu đã công bố. Cột x_realtime được tính từ các số liệu này: 780 giây audio chia cho thời gian đo được, rồi làm tròn đến một chữ số thập phân. Cột bộ nhớ là RAM hệ thống trong biểu đồ CPU và VRAM trong biểu đồ GPU.
Một gói vCPU dùng chung sẽ không đạt được các số liệu CPU này. Benchmark đó dùng riêng 8 thread của một CPU desktop nhanh. Hãy xem 7.6 lần là mức trần, rồi đo trên máy của bạn bằng time với một bản ghi thực tế trước khi lập kế hoạch dựa trên con số đó.
Bốn quy tắc kinh nghiệm thường đúng trong thực tế:
- Thỉnh thoảng chép lời các bản ghi của bạn: CPU, small, int8. 2 vCPU chuyên dụng là đủ.
- Xử lý batch qua đêm, chẳng hạn tạo phụ đề: CPU, small hoặc medium, int8, chạy qua
nice. - Tác vụ cần tương tác hoặc xử lý cả thư viện trong một buổi tối: GPU.
- Piper: luôn dùng CPU. Model giọng nói cỡ này gần như không được lợi gì từ GPU.
Nếu bạn đang tính xem phần cứng hiện tại còn có thể chạy thêm gì, câu hỏi rộng hơn về các AI model bạn có thể tự host sẽ trình bày những kích thước nào phù hợp và không phù hợp.
Các chế độ lỗi và chuỗi bạn sẽ thấy
error: externally-managed-environment khi cài đặt. Python của hệ thống được distribution bảo vệ. Hãy tạo virtual environment như hướng dẫn ở trên.
Không khớp cuDNN trên máy GPU. Lỗi sẽ có dạng sau:
Unable to load any of {libcudnn_ops.so.9.1.0, libcudnn_ops.so.9.1, libcudnn_ops.so.9, libcudnn_ops.so}
Invalid handle. Cannot load symbol cudnnCreateTensorDescriptorCTranslate2 4.5.0 trở lên yêu cầu cuDNN 9 cho CUDA 12, nhưng host đang có cuDNN 8. Hãy cài cuDNN 9 hoặc ghim runtime cũ bằng pip install --force-reinstall ctranslate2==4.4.0. Chỉ thực hiện một trong hai cách. Làm cả hai sẽ đưa hệ thống trở lại trạng thái ban đầu.
This CTranslate2 package was not compiled with CUDA support là một lỗi khác nhưng có biểu hiện tương tự. Wheel đã cài là bản chỉ dành cho CPU. Hãy tạo lại virtual environment trên GPU host và để pip chọn lại wheel.
Các câu lặp lại trong transcript. Một câu lặp lại mười lần gần như luôn có nghĩa là đoạn im lặng hoặc nhạc đang bị giải mã thành giọng nói. Trước tiên, hãy bật vad_filter=True. Nếu vẫn xảy ra, hãy nghe đoạn đó: audio gần như im lặng không cung cấp cho Whisper điểm neo để nhận dạng, nên nó lặp lại phỏng đoán cuối cùng có độ tin cậy cao.
Phát hiện sai ngôn ngữ. Whisper chỉ phỏng đoán dựa trên 30 giây đầu tiên. info.language_probability thấp hơn nhiều so với 1.0 nghĩa là nó không chắc chắn. Trường hợp này thường xảy ra khi bản ghi bắt đầu bằng nhạc hoặc có nhiều người nói chồng lên nhau. Nếu đã biết ngôn ngữ, hãy truyền language="en".
Tiến trình in Killed rồi dừng. Đó là kernel out-of-memory killer. dmesg sẽ hiển thị dòng oom-kill tương ứng. large-v3 cần hơn 3 GB chỉ cho weights, chưa tính working memory. Trên VPS 2 GB, small ở int8 là model lớn nhất có thể chạy vừa.
Piper không tìm thấy voice. Player tìm trong working directory, trừ khi bạn truyền --data-dir. Chạy ls trên directory bạn dự kiến sử dụng và xác nhận .onnx cùng .onnx.json đều tồn tại, vì thiếu một trong hai cũng chắc chắn gây lỗi như thiếu cả hai.
FAQ
Tôi có thể chạy speech to text trên VPS chỉ có CPU không?
Có. Với tác vụ xử lý theo lô, đây là lựa chọn hợp lý. Khi dùng faster-whisper với model small ở int8, benchmark được công bố của dự án cho thấy hệ thống chuyển 13 phút audio thành văn bản trong 102 giây trên 8 thread của desktop i7, tương đương khoảng 7.6x thời gian thực, với 1,477 MB RAM. Gói shared vCPU chạy chậm hơn mức này, vì vậy hãy đo trên máy của bạn. Text to speech với Piper còn đơn giản hơn và không cần GPU trong bất kỳ trường hợp nào.
Tôi nên dùng model Whisper có kích thước nào?
Hãy bắt đầu với small ở int8. Model này chiếm 484 MB trên disk và xử lý tốt speech được ghi âm rõ ràng. Chuyển lên medium khi accent hoặc nhiễu nền gây ra các lỗi mà bạn không thể chấp nhận, và chỉ dùng large-v3 khi độ chính xác quan trọng hơn mọi yếu tố khác, vì model này cần 3,090 MB disk và hơn 3 GB memory. Ở chiều ngược lại, tiny với 75.5 MB hữu ích để phát hiện ngôn ngữ và test pipeline, nhưng không phù hợp cho transcript mà người dùng sẽ đọc.
Vì sao faster-whisper nhanh hơn package Whisper gốc?
Model là cùng một model. Runtime thì khác. Package tham chiếu chạy Whisper trên PyTorch, còn faster-whisper chạy cùng bộ weights trên CTranslate2, một engine được xây dựng cho transformer inference, quantize weights khi load và không cần cài PyTorch. Trong benchmark CPU được công bố, package tham chiếu đạt 1.9x thời gian thực, còn faster-whisper ở int8 đạt 7.6x, đồng thời dùng ít memory hơn.
Vì sao transcript của tôi lặp đi lặp lại cùng một câu?
Whisper đang giải mã silence hoặc music thành speech và quay lại dựa trên phán đoán cuối cùng có độ tin cậy cao. Đặt vad_filter=True trong lệnh gọi transcribe(). Tùy chọn này chạy voice activity detection của Silero trước và loại bỏ các đoạn silence trước khi model xử lý. Nếu vẫn lặp, hãy kiểm tra mức audio, vì bản ghi gần như im lặng trong suốt thời gian sẽ không cung cấp đủ dữ liệu cho model.
Làm cách nào để có audio endpoint tương thích với OpenAI trên server của tôi?
Chạy một server triển khai POST /v1/audio/transcriptions và POST /v1/audio/speech, sau đó trỏ client đến server đó bằng base URL mới. Speaches là một lựa chọn. Đây là container image có CPU build, dùng faster-whisper để transcription và Piper hoặc Kokoro cho speech. vox-box là một lựa chọn khác. Cài đặt bằng pip install vox-box và khởi động bằng vox-box start --huggingface-repo-id; mỗi process sẽ serve một model. Cả hai đều không bật authentication theo mặc định, vì vậy hãy bind vào localhost và đặt một proxy hoặc VPN ở phía trước.