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ữ.

Sơ đồ kiến trúc Whisper

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ìnhTham sốWER tiếng AnhWER đa ngôn ngữVRAM (GPU)Tốc độ tương đối
tiny39M~7,6%~12%~1 GB~10x
base74M~5,0%~10%~1 GB~7x
small244M~3,4%~7%~2 GB~4x
medium769M~2,9%~5%~5 GB~2x
large-v31,55B~2,4%~3,5%~10 GB1x
turbo809M~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ế #

Phân tích ngôn ngữ Whisper

So sánh Word Error Rate (LibriSpeech test-clean) #

Mô hình / EngineWER (clean)WER (other)Đa ngôn ngữNăm
Whisper tiny7,6%12,0%12,0%2022
Whisper base5,0%8,1%10,0%2022
Whisper small3,4%5,8%7,0%2022
Whisper medium2,9%5,0%5,0%2022
Whisper large-v32,4%4,2%3,5%2024
Whisper turbo2,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 DeepSpeech7,3%21,5%N/A (chỉ tiếng Anh)2020

Benchmark tốc độ suy luận (1 giờ âm thanh, NVIDIA RTX 4090) #

EngineMô hìnhThờ gianVRAMGhi chú
OpenAI Whisperlarge-v3~90 phút~10 GBĐường cơ sở
faster-whisperlarge-v3~18 phút~6 GBfloat16, nhanh hơn 4-8 lần
faster-whisperlarge-v3~12 phút~4 GBLượng tử hóa int8
WhisperXlarge-v3~25 phút~8 GBBao gồm căn chỉnh
WhisperX (không tách)large-v3~18 phút~6 GBChỉ phiên âm
OpenAI Whisperturbo~12 phút~6 GBDecoder chưng cất

Các kịch bản triển khai production #

Trường hợp sử dụngMô hình đề xuấtEnginePhần cứngKhối lượng hàng ngày
Phiên âm podcastlarge-v3faster-whisper1x A100500+ giờ
Ghi chú cuộc họp real-timeturbofaster-whisper1x RTX 4090200+ giờ
Phân tích trung tâm cuộc gọimediumfaster-whisper (int8)2x RTX 30801000+ giờ
Thiết bị di động/edgetiny.enwhisper.cpp8 GB RAMOffline
Tạo phụ đề videolarge-v3WhisperX1x A100300+ 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ế #

So sánh các biến thể mô hình Whisper

Tính năngOpenAI WhisperWhisperXfaster-whisperDeepSpeech
GitHub Stars99.80019.70020.40026.700 (đã lưu trữ)
Giấy phépMITBSD-2MITMPL-2.0
Tốc độ so với đường cơ sở1x (đường cơ sở)0,8-1x4-8x2x
Yêu cầu GPUTùy chọnKhuyến nghịTùy chọnTùy chọn
Hỗ trợ lượng tử hóaKhôngKhôngCó (INT8/FP16)Không
Dấu thờ gian cấp từCấp phân đoạnCấp âm vịCấp phân đoạnKhông
Phân tách ngườ nóiKhôngTích hợp sẵnKhôngKhông
Ngôn ngữ hỗ trợ999999Chỉ tiếng Anh
WER (LibriSpeech clean)2,4% (large-v3)2,4%2,4%7,3%
Phát triển tích cựcKhông (lưu trữ tháng 6/2025)
Phù hợp nhất choNghiên cứu, tham chiếuPhiên âm cuộc họpAPI productionChỉ 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:

  1. 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.

  2. 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.

  3. Đà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.

  4. 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.

  5. 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.

  6. 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.

Nguồn & Tài liệu tham khảo #

💬 Bình luận & Thảo luận