OpenAI Whisper: 99.8K+ Stars — Hướng Dẫn Cài Đặt ASR Đầy Đủ vs WhisperX, faster-whisper 2026
OpenAI Whisper (ASR) nhận dạng giọng nói mạnh mẽ qua giám sát yếu quy mô lớn. Tương thích với WhisperX, faster-whisper, LibreTranslate. Bao gồm whisper tutorial, whisper vs whisperx, speech recognition setup, whisper python, whisper docker.
- ⭐ 99800
- MIT
- Cập nhật 2026-05-19
{{< resource-info >}}
Giới thiệu #
Nhận dạng giọng nói là cây cầu nối giữa cuộc trò chuyện của con ngườ với dữ liệu có thể đọc được bằng máy, nhưng hầu hết các nhà phát triển đều đã từng vật lộn với các API tính phí theo phút, bỏ sót thuật ngữ chuyên ngành, hoặc hoàn toàn thất bại trên giọng nói có âm sắc địa phương. Vào cuối năm 2022, OpenAI phát hành Whisper như một giải pháp thay thế mã nguồn mở theo giấy phép MIT, và sự tiếp nhận là ngay lập tức — sau 99.800 sao GitHub, nó đã trở thành hệ thống ASR mã nguồn mở được sử dụng nhiều nhất trong môi trường production. Hướng dẫn này sẽ đi qua toàn bộ quá trình thiết lập Whisper, so sánh với WhisperX, faster-whisper và DeepSpeech, cung cấp các cấu hình đã được production-hardened mà bạn có thể triển khai ngay hôm nay.
OpenAI Whisper là gì? #
OpenAI Whisper là mô hình nhận dạng giọng nói tự động (ASR) đa năng, được đào tạo trên 680.000 giờ dữ liệu đa ngôn ngữ và đa tác vụ có giám sát. Nó thực hiện chuyển giọng nói thành văn bản, dịch giọng nói sang tiếng Anh, nhận dạng ngôn ngữ nói, và căn chỉnh phân đoạn có dấu thờ gian trên 99 ngôn ngữ. Khác với các API chỉ chạy trên cloud, Whisper chạy hoàn toàn offline trên phần cứng tiêu dùng, khiến nó trở thành xương sống của các pipeline phiên âm trong y tế, truyền thông, trung tâm cuộc gọi, và công cụ hỗ trợ tiếp cận.
Whisper hoạt động như thế nào #
Whisper theo kiến trúc Transformer encoder-decoder. Đầu vào âm thanh được chuyển đổi thành log-Mel spectrogram và đi qua encoder. Decoder sau đó dự đoán token văn bản theo cách autoregressive, dựa trên các task token đặc biệt cho biết mô hình nên phiên âm, dịch, hay phát hiện ngôn ngữ.

Các quyết định thiết kế cốt lõi:
- Giám sát yếu quy mô lớn: Được đào tạo trên dữ liệu âm thanh đa dạng quy mô web với nhãn nhiễu thay vì các tập dữ liệu nhỏ, tinh khiết
- Đào tạo đa tác vụ: Một mô hình duy nhất xử lý phiên âm, dịch, và nhận dạng ngôn ngữ thông qua task token
- Xử lý theo khối: Âm thanh dài được chia thành các đoạn 30 giây, xử lý độc lập, sau đó lắp ráp lại
- Conditioning trên văn bản trước đó: Decoder nhận token của phân đoạn trước để duy trì định dạng nhất quán xuyên suốt các ranh giới
| Mô hình | Tham số | WER tiếng Anh | WER đa ngôn ngữ | VRAM (GPU) | Tốc độ tương đối |
|---|---|---|---|---|---|
| tiny | 39M | ~7,6% | ~12% | ~1 GB | ~10x |
| base | 74M | ~5,0% | ~10% | ~1 GB | ~7x |
| small | 244M | ~3,4% | ~7% | ~2 GB | ~4x |
| medium | 769M | ~2,9% | ~5% | ~5 GB | ~2x |
| large-v3 | 1,55B | ~2,4% | ~3,5% | ~10 GB | 1x |
| turbo | 809M | ~2,5% | ~3,7% | ~6 GB | ~8x |
Cài đặt & Thiết lập #
Cài đặt Python #
python -m venv whisper-env
source whisper-env/bin/activate # Linux/macOS
# whisper-env\Scripts\activate # Windows
# Cài đặt OpenAI Whisper
pip install -U openai-whisper
# Xác minh cài đặt
whisper --version
Phụ thuộc hệ thống #
FFmpeg là bắt buộc cho tiền xử lý âm thanh:
# Ubuntu/Debian
sudo apt update && sudo apt install ffmpeg
# macOS
brew install ffmpeg
# Xác minh
ffmpeg -version | head -1
Tăng tốc GPU (CUDA) #
# Kiểm tra CUDA khả dụng
python -c "import torch; print(torch.cuda.is_available())"
# Cài đặt với hỗ trợ CUDA 12
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
# Chỉ dùng CPU để suy luận
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
Triển khai Docker #
# Pull và chạy image chính thức
docker pull openai/whisper:latest
# Phiên âm file qua Docker
docker run --rm \
--gpus all \
-v $(pwd)/audio:/audio \
openai/whisper:latest \
/audio/interview.mp3 \
--model large-v3 \
--language en \
--output_format json
# Chạy Docker chỉ CPU
docker run --rm \
-v $(pwd)/audio:/audio \
openai/whisper:latest \
/audio/podcast.mp3 \
--model base \
--device cpu
Phiên âm đầu tiên nhanh chóng #
import whisper
# Tải mô hình (tải xuống lần chạy đầu tiên)
model = whisper.load_model("base")
# Phiên âm file âm thanh
result = model.transcribe("audio.mp3")
print(result["text"])
# Lấy các phân đoạn có dấu thờ gian
for segment in result["segments"]:
print(f"[{segment['start']:.2f}s -> {segment['end']:.2f}s] {segment['text']}")
Ví dụ sử dụng CLI #
# Phiên âm cơ bản
whisper audio.mp3 --model medium --language en
# Xuất tất cả định dạng (JSON, SRT, VTT, TXT)
whisper podcast.mp3 --model large-v3 --output_format all
# Dịch âm thanh không phải tiếng Anh sang văn bản tiếng Anh
whisper french_interview.mp3 --model large-v3 --task translate
# Tự động phát hiện ngôn ngữ
whisper unknown.mp3 --model base --task transcribe
Tích hợp với các công cụ phổ biến #
WhisperX (Dấu thờ gian cấp từ + Phân tách ngườ nói) #
WhisperX bọc faster-whisper và bổ sung căn chỉnh cấp âm vị và phân tách ngườ nói. Đây là công cụ lựa chọn cho bản phiên âm cuộc họp và xử lý phỏng vấn.
pip install whisperx
import whisperx
import torch
device = "cuda" if torch.cuda.is_available() else "cpu"
audio_file = "meeting.mp3"
batch_size = 16
compute_type = "float16"
# 1. Phiên âm bằng backend faster-whisper
model = whisperx.load_model("large-v3", device, compute_type=compute_type)
audio = whisperx.load_audio(audio_file)
result = model.transcribe(audio, batch_size=batch_size)
# 2. Căn chỉnh để có dấu thờ gian chính xác cấp từ
model_a, metadata = whisperx.load_align_model(
language_code=result["language"],
device=device
)
result = whisperx.align(
result["segments"],
model_a,
metadata,
audio,
device
)
# 3. Phân tách ngườ nói
diarize_model = whisperx.DiarizationPipeline(
use_auth_token="YOUR_HF_TOKEN",
device=device
)
diarize_segments = diarize_model(audio)
result = whisperx.assign_word_speakers(diarize_segments, result)
# In bản phiên âm có gán nhãn ngườ nói
for segment in result["segments"]:
speaker = segment.get("speaker", "UNKNOWN")
start = segment["start"]
end = segment["end"]
text = segment["text"]
print(f"[{start:.2f}s - {end:.2f}s] {speaker}: {text}")
faster-whisper (Suy luận production) #
faster-whisper tái triển khai Whisper bằng CTranslate2, mang lại tốc độ nhanh hơn 4-8 lần với hỗ trợ lượng tử hóa. Đây là lựa chọn mặc định cho API production.
pip install faster-whisper
from faster_whisper import WhisperModel
# Tải với lượng tử hóa để giảm bộ nhớ
model = WhisperModel(
"large-v3",
device="cuda",
compute_type="float16", # Tùy chọn: int8, int8_float16, float16, float32
num_workers=4,
cpu_threads=8
)
# Phiên âm với lọc VAD
segments, info = model.transcribe(
"podcast.mp3",
beam_size=5,
vad_filter=True,
vad_parameters={
"threshold": 0.5,
"min_speech_duration_ms": 250,
"min_silence_duration_ms": 500
},
language="en",
condition_on_previous_text=True
)
print(f"Ngôn ngữ phát hiện: {info.language} (xác suất: {info.language_probability:.2f})")
for segment in segments:
print(f"[{segment.start:.2f}s -> {segment.end:.2f}s] {segment.text}")
Tích hợp LibreTranslate (Pipeline dịch) #
import whisper
import requests
# Phiên âm âm thanh không phải tiếng Anh
model = whisper.load_model("medium")
audio_path = "japanese_podcast.mp3"
result = model.transcribe(audio_path, language="ja")
japanese_text = result["text"]
# Dịch qua API LibreTranslate
def translate(text, source="ja", target="en"):
response = requests.post(
"http://localhost:5000/translate",
headers={"Content-Type": "application/json"},
json={"q": text, "source": source, "target": target}
)
return response.json()["translatedText"]
english_text = translate(japanese_text)
print(f"JA: {japanese_text}")
print(f"EN: {english_text}")
FastAPI Server phiên âm real-time #
from fastapi import FastAPI, UploadFile, File
from faster_whisper import WhisperModel
import tempfile
import os
app = FastAPI()
model = WhisperModel("medium", device="cuda", compute_type="float16")
@app.post("/transcribe")
async def transcribe(file: UploadFile = File(...)):
with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as tmp:
tmp.write(await file.read())
tmp_path = tmp.name
segments, info = model.transcribe(
tmp_path,
beam_size=5,
vad_filter=True
)
os.unlink(tmp_path)
results = [
{
"start": s.start,
"end": s.end,
"text": s.text,
"confidence": s.words[0].probability if s.words else None
}
for s in segments
]
return {
"language": info.language,
"language_probability": info.language_probability,
"segments": results
}
Chạy với: uvicorn main:app --host 0.0.0.0 --port 8000 --workers 2
Tích hợp giám sát Prometheus #
from prometheus_client import Counter, Histogram, start_http_server
import time
TRANSCRIPTION_COUNT = Counter(
"whisper_transcriptions_total",
"Tổng số lần phiên âm",
["model", "language"]
)
TRANSCRIPTION_DURATION = Histogram(
"whisper_transcription_duration_seconds",
"Thờ gian phiên âm",
["model"]
)
def transcribe_with_metrics(audio_path, model_name="medium"):
start = time.time()
segments, info = model.transcribe(audio_path)
duration = time.time() - start
TRANSCRIPTION_COUNT.labels(model=model_name, language=info.language).inc()
TRANSCRIPTION_DURATION.labels(model=model_name).observe(duration)
return segments, info
# Khởi động server metrics trên cổng 9090
start_http_server(9090)
Benchmark / Các trường hợp sử dụng thực tế #
So sánh Word Error Rate (LibriSpeech test-clean) #
| Mô hình / Engine | WER (clean) | WER (other) | Đa ngôn ngữ | Năm |
|---|---|---|---|---|
| Whisper tiny | 7,6% | 12,0% | 12,0% | 2022 |
| Whisper base | 5,0% | 8,1% | 10,0% | 2022 |
| Whisper small | 3,4% | 5,8% | 7,0% | 2022 |
| Whisper medium | 2,9% | 5,0% | 5,0% | 2022 |
| Whisper large-v3 | 2,4% | 4,2% | 3,5% | 2024 |
| Whisper turbo | 2,5% | 4,3% | 3,7% | 2024 |
| faster-whisper (large-v3) | 2,4% | 4,2% | 3,5% | 2024 |
| WhisperX (large-v3) | 2,4% | 4,2% | 3,5% | 2024 |
| Mozilla DeepSpeech | 7,3% | 21,5% | N/A (chỉ tiếng Anh) | 2020 |
Benchmark tốc độ suy luận (1 giờ âm thanh, NVIDIA RTX 4090) #
| Engine | Mô hình | Thờ gian | VRAM | Ghi chú |
|---|---|---|---|---|
| OpenAI Whisper | large-v3 | ~90 phút | ~10 GB | Đường cơ sở |
| faster-whisper | large-v3 | ~18 phút | ~6 GB | float16, nhanh hơn 4-8 lần |
| faster-whisper | large-v3 | ~12 phút | ~4 GB | Lượng tử hóa int8 |
| WhisperX | large-v3 | ~25 phút | ~8 GB | Bao gồm căn chỉnh |
| WhisperX (không tách) | large-v3 | ~18 phút | ~6 GB | Chỉ phiên âm |
| OpenAI Whisper | turbo | ~12 phút | ~6 GB | Decoder chưng cất |
Các kịch bản triển khai production #
| Trường hợp sử dụng | Mô hình đề xuất | Engine | Phần cứng | Khối lượng hàng ngày |
|---|---|---|---|---|
| Phiên âm podcast | large-v3 | faster-whisper | 1x A100 | 500+ giờ |
| Ghi chú cuộc họp real-time | turbo | faster-whisper | 1x RTX 4090 | 200+ giờ |
| Phân tích trung tâm cuộc gọi | medium | faster-whisper (int8) | 2x RTX 3080 | 1000+ giờ |
| Thiết bị di động/edge | tiny.en | whisper.cpp | 8 GB RAM | Offline |
| Tạo phụ đề video | large-v3 | WhisperX | 1x A100 | 300+ giờ |
Sử dụng nâng cao / Củng cố production #
Lượng tử hóa mô hình để giảm bộ nhớ #
from faster_whisper import WhisperModel
# Lượng tử hóa INT8 — nhanh gấp 2 lần, giảm 50% VRAM
model_int8 = WhisperModel("large-v3", device="cuda", compute_type="int8")
# INT8 với kích hoạt float16 — cân bằng
model_hybrid = WhisperModel("large-v3", device="cuda", compute_type="int8_float16")
# CPU với INT8
model_cpu = WhisperModel("medium", device="cpu", compute_type="int8", cpu_threads=8)
Pipeline xử lý hàng loạt #
import os
from concurrent.futures import ThreadPoolExecutor
from faster_whisper import WhisperModel
model = WhisperModel("medium", device="cuda", compute_type="float16")
def process_file(audio_path):
segments, info = model.transcribe(
audio_path,
vad_filter=True,
beam_size=5
)
text = " ".join([s.text for s in segments])
output_path = audio_path.replace(".mp3", ".txt")
with open(output_path, "w") as f:
f.write(text)
return output_path
# Xử lý thư mục file âm thanh
audio_dir = "/data/audio/"
files = [os.path.join(audio_dir, f) for f in os.listdir(audio_dir) if f.endswith(".mp3")]
with ThreadPoolExecutor(max_workers=4) as executor:
results = list(executor.map(process_file, files))
print(f"Đã xử lý {len(results)} file")
Cân bằng tải NGINX (Đa GPU) #
upstream whisper_backend {
least_conn;
server 10.0.1.10:8000 weight=1; # GPU 0
server 10.0.1.10:8001 weight=1; # GPU 1
server 10.0.1.11:8000 weight=1; # GPU 2
server 10.0.1.11:8001 weight=1; # GPU 3
}
server {
listen 80;
location /transcribe {
proxy_pass http://whisper_backend;
proxy_read_timeout 300s;
client_max_body_size 500M;
}
}
Endpoint kiểm tra sức khỏe #
from fastapi import FastAPI, HTTPException
from faster_whisper import WhisperModel
import torch
app = FastAPI()
model = WhisperModel("medium", device="cuda", compute_type="float16")
@app.get("/health")
async def health():
gpu_available = torch.cuda.is_available()
gpu_memory = torch.cuda.get_device_properties(0).total_memory if gpu_available else 0
return {
"status": "healthy",
"gpu_available": gpu_available,
"gpu_memory_gb": gpu_memory / (1024**3),
"model_loaded": model is not None
}
Hàng đợi Redis cho xử lý bất đồng bộ #
import redis
import json
from faster_whisper import WhisperModel
import time
r = redis.Redis(host='localhost', port=6379, db=0)
model = WhisperModel("medium", device="cuda", compute_type="float16")
def worker():
while True:
job = r.blpop("transcription_queue", timeout=5)
if job:
_, data = job
task = json.loads(data)
segments, info = model.transcribe(task["file_path"])
result = {
"job_id": task["job_id"],
"text": " ".join([s.text for s in segments]),
"language": info.language
}
r.setex(f"result:{task['job_id']}", 3600, json.dumps(result))
time.sleep(0.1)
if __name__ == "__main__":
worker()
So sánh với các lựa chọn thay thế #
| Tính năng | OpenAI Whisper | WhisperX | faster-whisper | DeepSpeech |
|---|---|---|---|---|
| GitHub Stars | 99.800 | 19.700 | 20.400 | 26.700 (đã lưu trữ) |
| Giấy phép | MIT | BSD-2 | MIT | MPL-2.0 |
| Tốc độ so với đường cơ sở | 1x (đường cơ sở) | 0,8-1x | 4-8x | 2x |
| Yêu cầu GPU | Tùy chọn | Khuyến nghị | Tùy chọn | Tùy chọn |
| Hỗ trợ lượng tử hóa | Không | Không | Có (INT8/FP16) | Không |
| Dấu thờ gian cấp từ | Cấp phân đoạn | Cấp âm vị | Cấp phân đoạn | Không |
| Phân tách ngườ nói | Không | Tích hợp sẵn | Không | Không |
| Ngôn ngữ hỗ trợ | 99 | 99 | 99 | Chỉ tiếng Anh |
| WER (LibriSpeech clean) | 2,4% (large-v3) | 2,4% | 2,4% | 7,3% |
| Phát triển tích cực | Có | Có | Có | Không (lưu trữ tháng 6/2025) |
| Phù hợp nhất cho | Nghiên cứu, tham chiếu | Phiên âm cuộc họp | API production | Chỉ hệ thống cũ |
Hạn chế / Đánh giá trung thực #
Whisper không phải công cụ phù hợp cho mọi tác vụ giọng nói. Đây là những gì README không nói:
Không hỗ trợ streaming: Whisper xử lý các khối 30 giây; không được thiết kế cho phiên âm thực sự real-time (độ trễ <200ms). Đối với ASR streaming, hãy xem xét NVIDIA Parakeet hoặc Moonshine v2.
Hallucination trên im lặng: Large-v3 đôi khi tạo ra văn bản hallucinated trên các phân đoạn im lặng. Sử dụng lọc VAD (tích hợp sẵn trong faster-whisper) để giảm thiểu.
Đào tạo tập trung tiếng Anh: Mặc dù hỗ trợ 99 ngôn ngữ, hiệu suất trên các ngôn ngữ châu Phi và Nam Á ít tài nguyên giảm đáng kể. Thường cần fine-tuning trên dữ liệu ngôn ngữ mục tiêu.
Dung lượng bộ nhớ: Large-v3 yêu cầu ~10 GB VRAM ở FP32. Cần lượng tử hóa (faster-whisper) hoặc offloading CPU cho GPU phổ thông.
Không có phân tách ngườ nói: Whisper cơ bản không thể cho biết ai đang nói. Cần WhisperX hoặc pipeline phân tách riêng biệt để nhận dạng đa ngườ nói.
Hạn chế dịch thuật: Mô hình turbo không được đào tạo cho dịch thuật. Sử dụng medium hoặc large-v3 cho các tác vụ dịch sang tiếng Anh.
Câu hỏi thường gặp #
1. Sự khác biệt giữa Whisper và faster-whisper là gì? #
faster-whisper là bản tái triển khai Whisper sử dụng CTranslate2, engine suy luận C++. Nó cung cấp tốc độ nhanh hơn 4-8 lần, lượng tử hóa INT8, và lọc VAD tích hợp trong khi vẫn cho kết quả phiên âm giống hệt. Sử dụng faster-whisper cho production; sử dụng OpenAI Whisper cho nghiên cứu và thử nghiệm.
2. Tôi có thể chạy Whisper trên CPU không? #
Có. Tất cả các mô hình trừ large-v3 đều chạy tốt trên CPU hiện đại. Sử dụng mô hình tiny cho phiên âm near-real-time trên laptop, hoặc medium với lượng tử hóa INT8 cho xử lý hàng loạt. Chậm hơn GPU khoảng 3-5 lần.
3. Tôi nên chọn kích thước mô hình nào? #
Bắt đầu với base cho tác vụ tiếng Anh nhanh, small cho sử dụng đa ngôn ngữ hàng ngày, medium cho độ chính xác chuyên nghiệp, và large-v3 khi độ chính xác tối đa không thể thỏa hiệp. Mô hình turbo là điểm tối ưu cho các workload production nhạy cảm về độ trễ.
4. Làm sao để xử lý file âm thanh dài hiệu quả? #
Sử dụng faster-whisper với vad_filter=True để bỏ qua phân đoạn im lặng. Với file dài hơn 1 giờ, chia thành các khối và xử lý song song. WhisperX xử lý file dài nguyên bản và ổn định hơn Whisper cơ bản trên âm thanh 3+ giờ.
5. Whisper có miễn phí cho sử dụng thương mại không? #
Có. Whisper được phát hành theo giấy phép MIT, cho phép sử dụng thương mại, sửa đổi, và phân phối. Không có phí API vì bạn chạy nó trên phần cứng riêng. Chi phí duy nhất là tính toán (GPU/instance cloud).
6. Whisper so với API cloud như Google Speech-to-Text như thế nào? #
Whisper large-v3 đạt WER tương đương Google Speech-to-Text trên tiếng Anh (2,4% so với 2,1% trên LibriSpeech). Whisper thắng về quyền riêng tư (on-premise), chi phí (không phí theo phút), và bao phủ ngôn ngữ (99 ngôn ngữ so với 125 của Google, nhưng miễn phí). API cloud thắng về hệ sinh thái tích hợp và khả năng mở rộng được quản lý.
7. Tôi cần phần cứng gì cho production? #
Một NVIDIA A100 (80 GB) có thể chạy 4 instance large-v3 với float16, xử lý khoảng 200 giờ âm thanh mỗi ngày. Với thiết lập ngân sách, RTX 4090 (24 GB) với faster-whisper xử lý thoải mái medium và large-v3 ở float16.
Kết luận #
OpenAI Whisper vẫn là lựa chọn thực tế cho nhận dạng giọng nói production trong năm 2026. 99.800 sao GitHub phản ánh không chỉ sự phổ biến mà còn là sự trưởng thành của hệ sinh thái: faster-whisper cung cấp tốc độ, WhisperX cung cấp phân tách ngườ nói, và mô hình cốt lõi mang lại độ chính xác trên 99 ngôn ngữ. Bắt đầu với faster-whisper và mô hình medium, thêm WhisperX khi cần nhãn ngườ nói, và lượng tử hóa INT8 khi VRAM bị hạn chế.
Các bước tiếp theo:
- Clone repo:
git clone https://github.com/openai/whisper - Tham gia cộng đồng phát triển dibi8 trên Telegram để nhận mẹo triển khai
- Benchmark faster-whisper trên dữ liệu âm thanh của riêng bạn trước khi cam kết kích thước mô hình
Hosting Và Hạ Tầng Được Đề Xuất #
Trước khi triển khai các công cụ trên vào production, bạn cần hạ tầng vững chắc. Hai lựa chọn dibi8 đang dùng:
- DigitalOcean — Credit miễn phí $200 trong 60 ngày, 14+ khu vực toàn cầu. Lựa chọn mặc định cho dev chạy AI tools open source.
- HTStack — VPS Hong Kong, độ trễ thấp khi truy cập từ Trung Quốc. Cùng IDC đang host dibi8.com.
Liên kết tiếp thị — không tăng chi phí của bạn, giúp dibi8.com hoạt động.
💬 Bình luận & Thảo luận