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 是什么 #

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 RTF60x30x24 GB
RTX 4070 (FP16)50x40x22x12 GB
RTX 3060 (INT8)35x28x12x8 GB
Apple M4 Max (MPS)25x20x8x36 GB
仅 CPU10x8x0.5xN/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 Whisperfaster-whisperWhisperX (完整)相对 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 语料库上测试:

指标Whisperwav2vec2WhisperX改进
WER (TEDLIUM)4.2%6.8%3.9%比 Whisper 低7%
词分割精度62%71%89%比 wav2vec2 高18%
词分割召回率58%68%86%比 wav2vec2 高18%
时间戳漂移~1.5sN/A<80ms好18倍

独立研究中的实际 WER (2024-2025):

场景Whisper WERWhisperX 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)

安全考虑 #

  1. 令牌管理。HF_TOKEN 存储在密钥管理器(AWS Secrets Manager、Vault)中,永远不要放在代码或环境文件中。
  2. 输入验证。 清理上传的文件名。在隔离的临时目录中处理音频。
  3. 速率限制。 实施每用户速率限制以防止 GPU 资源耗尽。
  4. 模型隔离。 在具有只读 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

与替代方案对比 #

功能WhisperXOpenAI Whisperfaster-whisperDeepSpeech
词级时间戳是 (<80ms)否 (仅段落)否 (仅段落)
说话人分割是 (按词)
最大推理速度70x RTF10x RTF70x RTF15x RTF
模型大小tiny 到 large-v3tiny 到 large-v3tiny 到 large-v3单一模型
显存 (大模型)8-16 GB10-24 GB6-10 GB2-4 GB
语言支持99+99+99+仅英语
WER (干净英语)3.9%4.2%4.2%7.2%
批处理是 (批处理)是 (批处理)
Docker 支持自建镜像社区镜像官方镜像官方镜像
许可证BSD-2-ClauseMITMITMPL 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+)表明这是一个健康、不断发展的项目。

后续步骤:

  1. 运行本指南中的 Docker 设置以处理你的第一个音频文件
  2. 将 FastAPI 服务集成到你现有的管道中
  3. 加入 dibi8 开发者 Telegram 社区 分享部署技巧

推荐部署与基础设施 #

上述工具想要落地生产,靠谱的基础设施是前提。dibi8 自己也在用的两个选择:

  • DigitalOcean — 新用户 60 天 $200 免费额度,14+ 全球节点。运行开源 AI 工具的首选。
  • HTStack — 香港 VPS,国内访问低延迟,dibi8.com 自己也跑在它上面,生产环境验证过。

Aff 链接 — 不增加你的成本,但能帮 dibi8 持续运营。

来源与延伸阅读 #

💬 留言讨论