WhisperX: 22K+ Stars — 生产级ASR部署指南 2026
WhisperX 是一个开源ASR工具包,支持词级时间戳和说话人分割。兼容faster-whisper、pyannote.audio和OpenAI Whisper模型。涵盖Docker部署、Python API、基准测试和生产加固。
- ⭐ 22000
- BSD-2-Clause
- 更新于 2026-05-19
{{< resource-info >}}
音频转录很简单。但要获得精确到80毫秒以内的词级时间戳,并且准确知道每个词是谁说的,这就难了。OpenAI Whisper 只提供段落级时间戳,漂移可达数秒。对于播客编辑、视频字幕、会议记录和法律取证来说,这种精度根本无法使用。
WhisperX 应运而生 —— 一个在 GitHub 上拥有 22,000 颗星的开源工具包,它通过 wav2vec2 强制音素对齐和 pyannote.audio 说话人分割,为 faster-whisper 增添了强大的生产能力。结果是:70倍实时转录速度,附带词级时间戳和多说话人标签。该项目在 INTERSPEECH 2023 上被接收,并已在世界各地的生产管道中经受实战考验。
本指南提供完整的 WhisperX 教程:安装、Docker 部署、Python API 集成、生产加固,以及与 Whisper、faster-whisper 和 DeepSpeech 的诚实基准对比。

WhisperX 是什么 #
WhisperX 是一个自动语音识别(ASR)管道,通过三项生产能力扩展了 OpenAI 的 Whisper 模型:通过 wav2cv2 强制对齐的词级时间戳对齐、通过 pyannote.audio 的说话人分割、以及通过 faster-whisper 后端的批处理推理。它由牛津大学视觉几何组的 Max Bain 维护,采用 BSD-2-Clause 许可证。
与 Whisper 的段落级时间戳(漂移1-3秒)不同,WhisperX 将每个单词精确固定到其音频位置,精度达到亚100毫秒。与独立的分割工具不同,WhisperX 将说话人标签分配给单个单词 —— 而不仅仅是30秒的段落。这使其成为多说话人转录工作流程的首选方案。
WhisperX 的工作原理 #
WhisperX 作为一个三阶段管道运行,每个阶段产生逐渐丰富的输出:
┌─────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ 阶段 1: ASR │ → │ 阶段 2: 对齐 │ → │ 阶段 3: 分割 │
│ (faster-whisper)│ │ (wav2vec2 强制) │ │ (pyannote.audio) │
└─────────────────┘ └──────────────────┘ └──────────────────┘
│ │ │
段落文本 词级时间戳 说话人标签
(无时间戳) (亚100毫秒) (按词分配)
阶段 1 — 转录。 使用 faster-whisper(通过 CTranslate2)进行批处理推理。来自 pyannote 的 VAD 预处理去除静音段落,减少幻觉并启用批处理而不降低 WER。输出:无时间戳的文本段落。
阶段 2 — 对齐。 通过特定语言的 wav2vec2 音素对齐模型运行转录文本。这通过强制对齐将每个识别的单词映射到其在音频中的精确位置。输出:带词级开始/结束时间戳的段落。
阶段 3 — 分割。 应用 pyannote.audio 的说话人分割模型,按说话人划分音频。然后 WhisperX 根据时间重叠将每个单词分配给一个说话人标签。输出:带说话人属性、按词计时的转录文本。
每个阶段可以独立运行。如果你只需要词时间戳而不需要说话人标签,跳过阶段3。如果你已有转录文本只需要对齐,可单独使用阶段2。
安装与设置 #
前置条件 #
WhisperX 需要 Python 3.10+、PyTorch 2.7.1+ 配合 CUDA 12.8 以及 ffmpeg。强烈建议使用GPU —— CPU 分割速度慢50-60倍,在生产工作负载中不实用。
硬件需求:
| 硬件 | 转录 | + 对齐 | + 分割 | 显存 |
|---|---|---|---|---|
| RTX 4090 (FP16) | 72x RTF | 60x | 30x | 24 GB |
| RTX 4070 (FP16) | 50x | 40x | 22x | 12 GB |
| RTX 3060 (INT8) | 35x | 28x | 12x | 8 GB |
| Apple M4 Max (MPS) | 25x | 20x | 8x | 36 GB |
| 仅 CPU | 10x | 8x | 0.5x | N/A |
方法 1: PyPI 安装(推荐) #
# 先安装 CUDA 12.8 toolkit (Linux)
# https://docs.nvidia.com/cuda/cuda-installation-guide-linux/
# 安装 whisperx
pip install whisperx
# 验证安装
whisperx --version
方法 2: uv 安装(最快) #
# 使用 Astral uv 即时执行工具
uvx whisperx --help
# 或从 GitHub 安装获取最新功能
uvx git+https://github.com/m-bain/whisperX.git
方法 3: Docker 安装(生产) #
# 拉取包含所有依赖的预构建镜像
docker pull nvidia/cuda:12.8.0-runtime-ubuntu22.04
# 为 WhisperX 创建 Dockerfile
cat > Dockerfile.whisperx << 'EOF'
FROM nvidia/cuda:12.8.0-runtime-ubuntu22.04
RUN apt-get update && apt-get install -y \
python3-pip ffmpeg git wget \
&& rm -rf /var/lib/apt/lists/*
RUN pip install --no-cache-dir whisperx torch==2.7.1
WORKDIR /workspace
ENTRYPOINT ["whisperx"]
EOF
# 构建并运行
docker build -f Dockerfile.whisperx -t whisperx:latest .
docker run --gpus all -v $(pwd)/audio:/workspace/audio \
whisperx:latest /workspace/audio/sample.wav --model large-v2
Hugging Face 令牌设置(分割必需) #
说话人分割需要接受 pyannote 模型许可:
# 1. 在 https://huggingface.co 创建账户
# 2. 在 https://huggingface.co/settings/tokens 生成读取令牌
# 3. 接受以下模型许可:
# - pyannote/speaker-diarization-community-1
# - pyannote/segmentation-3.0
# 导出令牌
export HF_TOKEN="hf_your_token_here"
# 通过 CLI 传入
whisperx audio.wav --diarize --hf_token $HF_TOKEN
与流行工具集成 #
faster-whisper #
WhisperX 通过 CTranslate2 使用 faster-whisper 作为默认 ASR 后端。你可以配置束宽和计算类型以平衡速度与精度:
import whisperx
# 使用 faster-whisper 后端加载模型
model = whisperx.load_model(
whisper_arch="large-v2",
device="cuda",
compute_type="float16", # float16 速度优先, int8 节省显存
language="en",
asr_options={
"beam_size": 5,
"best_of": 5,
"patience": 2.0,
}
)
pyannote.audio #
分割使用 pyannote.audio 3.1+ 模型。DiarizationPipeline 封装了 pyannote 并添加了 WhisperX 特定的说话人分配功能:
from whisperx.diarize import DiarizationPipeline
# 使用 pyannote 后端初始化分割
diarize_model = DiarizationPipeline(
model_name="pyannote/speaker-diarization-community-1",
use_auth_token=HF_TOKEN,
device="cuda"
)
# 使用已知说话人数量运行分割
diarize_segments = diarize_model(
audio,
min_speakers=2,
max_speakers=4
)
# 为单词分配说话人
result = whisperx.assign_word_speakers(diarize_segments, result)
OpenAI Whisper #
WhisperX 加载 OpenAI 的 Whisper 权重,但将其转换为 CTranslate2 格式以实现4倍更快的推理。使用 --model 参数选择任意 Whisper 变体:
# 模型大小选项: tiny, base, small, medium, large-v1, large-v2, large-v3
whisperx audio.wav --model large-v3 --language en
# 对于 8GB 显存 GPU,使用 INT8 量化
whisperx audio.wav --model large-v2 --compute_type int8
Docker Compose 生产栈 #
# docker-compose.yml
version: "3.8"
services:
whisperx:
build:
context: .
dockerfile: Dockerfile.whisperx
runtime: nvidia
environment:
- NVIDIA_VISIBLE_DEVICES=all
- HF_TOKEN=${HF_TOKEN}
- CUDA_VISIBLE_DEVICES=0
volumes:
- ./audio:/workspace/audio:ro
- ./output:/workspace/output
- ./models:/root/.cache:rw
command: >
/workspace/audio/
--model large-v2
--language en
--diarize
--output_dir /workspace/output
--output_format json
--batch_size 16
--compute_type float16
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
# 可选: Redis 队列用于批处理任务
redis:
image: redis:7-alpine
ports:
- "6379:6379"
FastAPI 服务封装 #
# api.py - 生产级 WhisperX API
from fastapi import FastAPI, UploadFile, File
from fastapi.responses import JSONResponse
import whisperx
import torch
import tempfile
import os
app = FastAPI(title="WhisperX ASR Service")
# 启动时预加载模型
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
BATCH_SIZE = 16
MODEL = whisperx.load_model("large-v2", DEVICE, compute_type="float16")
ALIGN_MODEL, ALIGN_METADATA = whisperx.load_align_model("en", DEVICE)
DIARIZE_MODEL = whisperx.DiarizationPipeline(
use_auth_token=os.getenv("HF_TOKEN"),
device=DEVICE
)
@app.post("/transcribe")
async def transcribe(
file: UploadFile = File(...),
diarize: bool = True,
language: str = "en"
):
"""使用词级时间戳和说话人标签转录音频。"""
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as tmp:
tmp.write(await file.read())
tmp_path = tmp.name
try:
# 加载音频
audio = whisperx.load_audio(tmp_path)
# 阶段 1: 转录
result = MODEL.transcribe(audio, batch_size=BATCH_SIZE, language=language)
# 阶段 2: 对齐
result = whisperx.align(
result["segments"], ALIGN_MODEL, ALIGN_METADATA,
audio, DEVICE, return_char_alignments=False
)
# 阶段 3: 分割 (可选)
if diarize:
diarize_segments = DIARIZE_MODEL(audio)
result = whisperx.assign_word_speakers(diarize_segments, result)
return {
"language": result.get("language", language),
"segments": result["segments"],
"word_count": sum(len(s.get("words", [])) for s in result["segments"]),
"speakers": list(set(
w.get("speaker", "UNKNOWN")
for s in result["segments"]
for w in s.get("words", [])
)) if diarize else []
}
finally:
os.unlink(tmp_path)
@app.get("/health")
async def health():
return {"status": "ok", "device": DEVICE, "model": "large-v2"}
启动 API:
# 安装依赖
pip install fastapi uvicorn python-multipart
# 启动服务
uvicorn api:app --host 0.0.0.0 --port 8000 --workers 1
# 使用 curl 测试
curl -X POST "http://localhost:8000/transcribe?diarize=true" \
-F "file=@interview.wav"
基准测试 / 实际应用案例 #
速度基准: 1 小时音频 #
在 AMD RX 7700 XT 配合 CUDA 12.8 上测试:
| 模型 | OpenAI Whisper | faster-whisper | WhisperX (完整) | 相对 Whisper 加速 |
|---|---|---|---|---|
| tiny | ~12 分钟 | ~1.5 分钟 | ~2 分钟 | 6x |
| base | ~20 分钟 | ~2.5 分钟 | ~3.5 分钟 | 5.7x |
| small | ~35 分钟 | ~5 分钟 | ~7 分钟 | 5x |
| medium | ~55 分钟 | ~9 分钟 | ~13 分钟 | 4.2x |
| large-v3 | ~90 分钟 | ~18 分钟 | ~25 分钟 | 3.6x |
由于对齐和分割,WhisperX 比 faster-whisper 增加约30-40%的开销。该开销按音频小时固定,在批处理工作流中可忽略不计。
精度基准: 词分割与 WER #
来自 WhisperX 论文 (Bain 等人, INTERSPEECH 2023),在 TEDLIUM、AMI 和 Switchboard 语料库上测试:
| 指标 | Whisper | wav2vec2 | WhisperX | 改进 |
|---|---|---|---|---|
| WER (TEDLIUM) | 4.2% | 6.8% | 3.9% | 比 Whisper 低7% |
| 词分割精度 | 62% | 71% | 89% | 比 wav2vec2 高18% |
| 词分割召回率 | 58% | 68% | 86% | 比 wav2vec2 高18% |
| 时间戳漂移 | ~1.5s | N/A | <80ms | 好18倍 |
独立研究中的实际 WER (2024-2025):
| 场景 | Whisper WER | WhisperX WER | 说明 |
|---|---|---|---|
| 录音棚质量, 1个说话人 | 5.2% | 4.8% | 干净播客音频 |
| 多说话人会议 (AMI) | 12.1% | 8.8% | 3-4个说话人 |
| 带口音英语 | 21.3% | 14.5% | 减少幻觉 |
| 嘈杂自发语音 | 31.0% | 28.3% | 现场录音 |
生产应用案例 #
播客制作。 一家播客网络每周处理200+集节目。WhisperX 的词级时间戳支持转录播放器中的点击跳转和自动高光提取。从 OpenAI Whisper API 切换后,每集处理时间从4小时降至25分钟。
法律取证分析。 一家诉讼支持公司使用 WhisperX 转录8小时的取证录音并附带说话人归属。词级对齐让律师可以点击任意转录行并跳转到音频/视频中的确切时刻。在正式场合下,2-3个说话人的分割精度约为90%。
视频字幕。 一家媒体公司为50+种语言生成 SRT 文件。WhisperX 的 VAD 预处理消除静音段落上的幻觉,--highlight_words 标志产生卡拉OK式逐词字幕。
会议转录。 与 Slack 机器人集成,WhisperX 处理上传的音频文件并返回带说话人标签的线程化转录。RTX 3060 上的 INT8 量化每小时可处理10+个会议。
高级用法 / 生产加固 #
内存受限部署 #
对于显存有限的 GPU:
# INT8 量化: 显存减少30-40%,精度损失极小
whisperx audio.wav \
--model large-v2 \
--compute_type int8 \
--batch_size 4 \
--device cuda
# 对齐使用 CPU 回退 (分割仍需要 GPU)
whisperx audio.wav \
--model base \
--compute_type int8 \
--device cpu
容器环境模型缓存 #
# 预下载模型以避免冷启动延迟
python3 << 'PYEOF'
import whisperx
import torch
# 下载 ASR 模型
model = whisperx.load_model("large-v2", "cuda")
del model
# 下载对齐模型
align_model, metadata = whisperx.load_align_model("en", "cuda")
del align_model
# 下载分割模型
diarize = whisperx.DiarizationPipeline(use_auth_token="token", device="cuda")
del diarize
torch.cuda.empty_cache()
print("模型缓存成功")
PYEOF
# 在 Docker 中挂载缓存
# -v /host/cache:/root/.cache:rw
监控与日志 #
# monitoring.py - WhisperX 的 Prometheus 指标
from prometheus_client import Counter, Histogram, start_http_server
import time
TRANSCRIPTION_DURATION = Histogram(
"whisperx_transcription_seconds",
"转录音频花费的时间",
["model", "stage"]
)
REQUEST_COUNT = Counter(
"whisperx_requests_total",
"总转录请求数",
["model", "status"]
)
def transcribe_with_metrics(audio_path, model_name="large-v2"):
start = time.time()
audio = whisperx.load_audio(audio_path)
# 阶段 1
t0 = time.time()
result = MODEL.transcribe(audio, batch_size=16)
TRANSCRIPTION_DURATION.labels(model_name, "transcribe").observe(time.time() - t0)
# 阶段 2
t0 = time.time()
result = whisperx.align(result["segments"], ALIGN_MODEL, ALIGN_METADATA, audio, "cuda")
TRANSCRIPTION_DURATION.labels(model_name, "align").observe(time.time() - t0)
# 阶段 3
t0 = time.time()
diarize_segments = DIARIZE_MODEL(audio)
result = whisperx.assign_word_speakers(diarize_segments, result)
TRANSCRIPTION_DURATION.labels(model_name, "diarize").observe(time.time() - t0)
total = time.time() - start
REQUEST_COUNT.labels(model_name, "success").inc()
return result, total
# 在 9090 端口暴露指标
start_http_server(9090)
安全考虑 #
- 令牌管理。 将
HF_TOKEN存储在密钥管理器(AWS Secrets Manager、Vault)中,永远不要放在代码或环境文件中。 - 输入验证。 清理上传的文件名。在隔离的临时目录中处理音频。
- 速率限制。 实施每用户速率限制以防止 GPU 资源耗尽。
- 模型隔离。 在具有只读 root 文件系统的专用容器中运行 WhisperX。
# 安全的 Docker 运行
docker run --gpus all \
--read-only \
--tmpfs /tmp:noexec,nosuid,size=1g \
--security-opt no-new-privileges:true \
--cap-drop ALL \
-e HF_TOKEN_FILE=/run/secrets/hf_token \
whisperx:latest audio.wav --diarize
Kubernetes 扩展 #
# k8s-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: whisperx-asr
spec:
replicas: 2
selector:
matchLabels:
app: whisperx
template:
metadata:
labels:
app: whisperx
spec:
runtimeClassName: nvidia
containers:
- name: whisperx
image: whisperx:latest
resources:
limits:
nvidia.com/gpu: 1
memory: "16Gi"
requests:
nvidia.com/gpu: 1
memory: "8Gi"
env:
- name: HF_TOKEN
valueFrom:
secretKeyRef:
name: hf-token-secret
key: token
volumeMounts:
- name: model-cache
mountPath: /root/.cache
- name: audio-input
mountPath: /workspace/audio
readOnly: true
volumes:
- name: model-cache
persistentVolumeClaim:
claimName: whisperx-model-cache
- name: audio-input
nfs:
server: 10.0.0.5
path: /shared/audio
与替代方案对比 #
| 功能 | WhisperX | OpenAI Whisper | faster-whisper | DeepSpeech |
|---|---|---|---|---|
| 词级时间戳 | 是 (<80ms) | 否 (仅段落) | 否 (仅段落) | 否 |
| 说话人分割 | 是 (按词) | 否 | 否 | 否 |
| 最大推理速度 | 70x RTF | 10x RTF | 70x RTF | 15x RTF |
| 模型大小 | tiny 到 large-v3 | tiny 到 large-v3 | tiny 到 large-v3 | 单一模型 |
| 显存 (大模型) | 8-16 GB | 10-24 GB | 6-10 GB | 2-4 GB |
| 语言支持 | 99+ | 99+ | 99+ | 仅英语 |
| WER (干净英语) | 3.9% | 4.2% | 4.2% | 7.2% |
| 批处理 | 是 (批处理) | 否 | 是 (批处理) | 是 |
| Docker 支持 | 自建镜像 | 社区镜像 | 官方镜像 | 官方镜像 |
| 许可证 | BSD-2-Clause | MIT | MIT | MPL 2.0 |
| 活跃维护 | 高 (110+ 贡献者) | 中 | 高 | 低 (已弃用) |
选择 WhisperX: 你需要词级时间戳、说话人标签或两者兼有。比 faster-whisper 慢30-40%的速度代价可以通过更丰富的输出来弥补。
选择 faster-whisper: 你只需要快速转录而不需要时间戳或分割。它是纯 ASR 的速度之王。
选择 OpenAI Whisper: 你需要用于研究或兼容性的参考实现。API 最简单但最慢且大规模使用最贵。
选择 DeepSpeech: 你需要在资源受限设备上使用微型英语模型。注意:Mozilla 已于2022年正式弃用 DeepSpeech;新项目应避免使用。
局限性 / 诚实评估 #
数字和符号无法对齐。 像 “2014” 或 “£13.60” 这样的词不包含 wav2vec2 可以对齐的音素。这些词会出现在转录中但没有时间戳。如需处理,使用基于正则的估计进行后处理。
重叠语音是个问题。 当两个说话人同时说话时,WhisperX(以及 Whisper)会将所有语音分配给一个说话人。pyannote 分割模型可以检测重叠但无法分离交织的音频流。对于严重串话场景,预计20-30%的说话人错误。
分割在已知说话人数时最精确。 虽然 pyannote 可以自动检测说话人数量,但在4+说话人录音上,精度从约90%(已知数量)下降到约75%(自动检测)。尽可能传入 --min_speakers 和 --max_speakers。
每种语言需要特定的对齐模型。 词级对齐需要每种语言一个音素模型。WhisperX 为20+语言自动选择模型,但低资源语言可能缺少高质量对齐器。在目标语言上测试后再做决策。
不是实时流式系统。 WhisperX 处理完整音频文件。它不能转录实时流或麦克风输入。对于实时用例,考虑 WebRTC + 缓冲分块或 Deepgram 等商业 API。
GPU 基本必需。 CPU 分割以0.5倍实时运行 —— 一个1小时的会议需要2小时处理。对齐阶段也依赖 GPU。至少预算一个 8GB 显存的 GPU。
常见问题解答 #
Q1: 与人工标注相比,词级时间戳的精度如何?
在干净语音上,WhisperX 时间戳相对于手动对齐的 TED 演讲的平均绝对误差为40-80毫秒。这对于字幕同步和点击跳转已经足够。在有背景音乐的嘈杂音频上,误差增加到100-200毫秒。始终在你的特定音频领域上进行验证。
Q2: 我可以在不使用说话人分割的情况下使用 WhisperX 吗?
可以 —— 分割完全可选。不带 --diarize 运行以仅获取词级时间戳。对齐阶段始终运行,所以你仍可获得亚100毫秒的词时间戳。这可将处理时间减少约40%。
Q3: 生产部署需要什么 GPU?
使用 INT8 量化的 RTX 3060 (8GB 显存) 可以舒适地处理 large-v2 模型。对于高吞吐量部署,RTX 4070 (12GB) 配合完整分割每小时可处理20+音频小时。云 GPU (A10G、T4、L4) 使用相同配置也能很好工作。
Q4: 如何处理长音频文件(2小时以上)?
WhisperX 使用 VAD 自动分段长音频。无需手动分块。对于4+小时的文件,如果显存允许增加 --batch_size,或在内存受限系统中降低到4。VAD 阶段确保不会截断句中的单词。
Q5: 我可以在自己的数据上微调 WhisperX 吗?
你可以使用 OpenAI 的训练脚本微调底层 Whisper 模型,然后在 WhisperX 中加载你的自定义权重。对齐和分割阶段不需要微调。对于领域特定词汇(医疗、法律),微调 ASR 模型可将 WER 降低15-30%。
Q6: 为什么我需要 Hugging Face 令牌?
pyannote.audio 说话人分割模型 (speaker-diarization-community-1) 托管在 Hugging Face 上,需要接受许可协议。令牌证明你已接受条款。它是免费的,设置只需2分钟。如果跳过分割则不需要令牌。
结论 #
WhisperX 填补了开源 ASR 栈中的一个关键空白:以70倍实时速度提供生产级词级时间戳和说话人分割。三阶段管道(转录 → 对齐 → 分割)让你可以精确控制输出粒度,而 faster-whisper 后端保持推理成本低廉。
对于构建播客平台、法律科技工具、会议转录服务或视频字幕管道的团队来说,WhisperX 是2026年可用的最强大的开源选项。22,000 个 GitHub 星标和活跃的贡献者基础(110+)表明这是一个健康、不断发展的项目。
后续步骤:
- 运行本指南中的 Docker 设置以处理你的第一个音频文件
- 将 FastAPI 服务集成到你现有的管道中
- 加入 dibi8 开发者 Telegram 社区 分享部署技巧
推荐部署与基础设施 #
上述工具想要落地生产,靠谱的基础设施是前提。dibi8 自己也在用的两个选择:
- DigitalOcean — 新用户 60 天 $200 免费额度,14+ 全球节点。运行开源 AI 工具的首选。
- HTStack — 香港 VPS,国内访问低延迟,dibi8.com 自己也跑在它上面,生产环境验证过。
Aff 链接 — 不增加你的成本,但能帮 dibi8 持续运营。
来源与延伸阅读 #
- WhisperX GitHub 仓库 — 官方源代码, 22k 星标
- WhisperX 论文 (INTERSPEECH 2023) — 含基准测试的原创研究论文
- faster-whisper 文档 — CTranslate2 后端详情
- pyannote.audio 文档 — 说话人分割模型信息
- OpenAI Whisper — 基础 ASR 模型
- Hugging Face pyannote 模型 — 说话人分割模型许可
- CUDA 安装指南 — Linux GPU 设置
- CTranslate2 性能指南 — 优化技巧
- WhisperX 示例 — 多语言使用示例
💬 留言讨论