WhisperX:2.2万+星标——2026年生产级ASR部署指南

WhisperX是一款开源ASR工具包,支持词级时间戳和说话人分离。兼容faster-whisper、pyannote.audio和OpenAI Whisper模型。涵盖Docker部署、Python API、性能测试和生产环境加固。

  • ⭐ 22945
  • BSD-2-Clause
  • 更新于 2026-05-19

转录音频很容易。而做到词级时间戳精确到100毫秒以内,并且清楚地知道每个词到底是谁说的,则很难。OpenAI Whisper给出的是段落级时间戳,会有以秒为单位的漂移。对于播客剪辑、视频字幕、会议记录和法律笔录来说,这种精度水平根本没法用。

于是有了WhisperX——一个拥有22,000星标的开源工具包,它在faster-whisper外面包裹了一层,通过wav2vec2实现强制音素对齐,通过pyannote.audio实现说话人分离。最终结果是:以70倍实时速度完成转录,并带有词级时间戳和多说话人标签。该项目已被INTERSPEECH 2023收录,并在全球各地的生产环境流程中经过了实战检验。

本指南将带你完整走一遍WhisperX教程,涵盖安装、完整的WhisperX Docker配置、Python API集成、生产环境加固,以及在WhisperX对比Whisper、faster-whisper和DeepSpeech时的真实基准测试数据。

带有词级时间戳的WhisperX示例输出

什么是WhisperX? #

WhisperX是一个自动语音识别(ASR)处理流程,它在OpenAI的Whisper模型基础上扩展了三项对生产环境至关重要的能力:通过wav2vec2强制对齐实现的词级时间戳对齐、通过pyannote.audio实现的说话人分离,以及通过faster-whisper后端实现的批量推理。该项目由牛津大学视觉几何组(Visual Geometry Group)的Max Bain维护,采用BSD-2-Clause许可证。

与Whisper那种会漂移1到3秒的段落级时间戳不同,WhisperX能以低于100毫秒的精度,将每个词精确固定到其在音频中的位置。与独立的说话人分离工具不同,WhisperX为单个词分配说话人标签——而不仅仅是按30秒的片段划分。这使它成为多说话人转录工作流的首选方案。

WhisperX的工作原理 #

WhisperX作为一个三阶段处理流程运行,每个阶段都会产生逐渐丰富的输出:

┌─────────────────┐    ┌──────────────────┐    ┌──────────────────┐
│  Stage 1: ASR   │ →  │ Stage 2: Align   │ →  │ Stage 3: Diarize │
│  (faster-whisper)│    │ (wav2vec2 forced)│    │ (pyannote.audio) │
└─────────────────┘    └──────────────────┘    └──────────────────┘
         │                       │                       │
    Segment text           Word timestamps         Speaker labels
    (no timestamps)        (sub-100ms)             (per word)

第一阶段——转录。 通过CTranslate2使用faster-whisper进行批量推理。来自pyannote的VAD(语音活动检测)预处理会剔除静音片段,在不损失词错误率的情况下减少幻觉并支持批处理。输出:不带时间戳的文本片段。

第二阶段——对齐。 将转录文本通过一个特定语言的wav2vec2音素对齐模型进行处理。通过强制对齐,将每个识别出的词映射到它在音频中的确切位置。输出:带有词级起止时间戳的片段。

第三阶段——说话人分离。 应用pyannote.audio的说话人分割模型,按说话人对音频进行分区。随后WhisperX根据时间重叠,将每个词分配给对应的说话人标签。输出:带说话人归属、按词计时的转录文本。

每个阶段都可以独立运行。如果你只需要词级时间戳而不需要说话人标签,可以跳过第三阶段。如果你已经有转录文本、只需要做对齐,可以单独使用第二阶段。

WhisperX安装与设置 #

前置条件 #

WhisperX需要Python 3.10+、搭配CUDA 12.8的PyTorch 2.7.1+,以及ffmpeg。强烈建议使用GPU——CPU说话人分离的速度会慢50到60倍,对生产环境的工作负载来说并不现实。

硬件要求:

硬件转录+ 对齐+ 说话人分离显存
RTX 4090(FP16)72倍实时速度60倍30倍24GB
RTX 4070(FP16)50倍40倍22倍12GB
RTX 3060(INT8)35倍28倍12倍8GB
Apple M4 Max(MPS)25倍20倍8倍36GB
仅CPU10倍8倍0.5倍不适用

方法一:PyPI安装(推荐) #

# Install CUDA 12.8 toolkit first (Linux)
# https://docs.nvidia.com/cuda/cuda-installation-guide-linux/

# Install whisperx
pip install whisperx

# Verify installation
whisperx --version

方法二:uv安装(最快) #

# Using Astral uv for instant tool execution
uvx whisperx --help

# Or install from GitHub for latest features
uvx git+https://github.com/m-bain/whisperX.git

方法三:Docker安装(生产环境) #

# Pull pre-built image with all dependencies
docker pull nvidia/cuda:12.8.0-runtime-ubuntu22.04

# Create a Dockerfile for WhisperX
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

# Build and run
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. Create a Hugging Face account at https://huggingface.co
# 2. Generate a read token at https://huggingface.co/settings/tokens
# 3. Accept the license for:
#    - pyannote/speaker-diarization-community-1
#    - pyannote/segmentation-3.0

# Export token
export HF_TOKEN="hf_your_token_here"

# Pass via CLI
whisperx audio.wav --diarize --hf_token $HF_TOKEN

与常用工具的集成 #

faster-whisper #

WhisperX通过CTranslate2,默认使用faster-whisper作为其ASR后端。你可以配置beam size和计算精度类型,在速度和准确性之间进行权衡:

import whisperx

# Load model with faster-whisper backend
model = whisperx.load_model(
    whisper_arch="large-v2",
    device="cuda",
    compute_type="float16",   # float16 for speed, int8 for low VRAM
    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

# Initialize diarization with pyannote backend
diarize_model = DiarizationPipeline(
    model_name="pyannote/speaker-diarization-community-1",
    use_auth_token=HF_TOKEN,
    device="cuda"
)

# Run diarization with known speaker count
diarize_segments = diarize_model(
    audio,
    min_speakers=2,
    max_speakers=4
)

# Assign speakers to words
result = whisperx.assign_word_speakers(diarize_segments, result)

OpenAI Whisper #

WhisperX会加载OpenAI的Whisper权重,但会将其转换为CTranslate2格式,从而实现4倍的推理速度提升。使用--model标志可以选择任意Whisper变体:

# Model size options: tiny, base, small, medium, large-v1, large-v2, large-v3
whisperx audio.wav --model large-v3 --language en

# For 8GB VRAM GPUs, use INT8 quantization
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]

  # Optional: Redis queue for batch jobs
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

FastAPI服务封装 #

# api.py - Production-ready 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")

# Preload models at startup
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"
):
    """Transcribe audio with word-level timestamps and speaker labels."""
    with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as tmp:
        tmp.write(await file.read())
        tmp_path = tmp.name

    try:
        # Load audio
        audio = whisperx.load_audio(tmp_path)

        # Stage 1: Transcribe
        result = MODEL.transcribe(audio, batch_size=BATCH_SIZE, language=language)

        # Stage 2: Align
        result = whisperx.align(
            result["segments"], ALIGN_MODEL, ALIGN_METADATA,
            audio, DEVICE, return_char_alignments=False
        )

        # Stage 3: Diarize (optional)
        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:

# Install dependencies
pip install fastapi uvicorn python-multipart

# Start server
uvicorn api:app --host 0.0.0.0 --port 8000 --workers 1

# Test with curl
curl -X POST "http://localhost:8000/transcribe?diarize=true" \
  -F "file=@interview.wav"

性能测试 / 真实使用场景 #

速度测试:1小时音频 #

在搭配CUDA 12.8的AMD RX 7700 XT上测试:

模型OpenAI Whisperfaster-whisperWhisperX(完整)相对Whisper的加速比
tiny约12分钟约1.5分钟约2分钟6倍
base约20分钟约2.5分钟约3.5分钟5.7倍
small约35分钟约5分钟约7分钟5倍
medium约55分钟约9分钟约13分钟4.2倍
large-v3约90分钟约18分钟约25分钟3.6倍

由于对齐和说话人分离的存在,WhisperX相比faster-whisper会增加约30%到40%的开销。这一开销对每小时音频来说是固定的,因此在批处理工作流中基本可以忽略不计。

准确性测试:词分割与词错误率 #

来自WhisperX论文(Bain等,INTERSPEECH 2023),在TEDLIUM、AMI和Switchboard语料库上测试:

指标Whisperwav2vec2WhisperX提升幅度
词错误率(TEDLIUM)4.2%6.8%3.9%相比Whisper提升7%
词分割精确率62%71%89%相比wav2vec2提升18%
词分割召回率58%68%86%相比wav2vec2提升18%
时间戳漂移约1.5秒不适用<80毫秒提升18倍

来自独立研究(2024-2025)的真实世界词错误率数据:

场景Whisper词错误率WhisperX词错误率备注
录音棚品质,单说话人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 quantization: 30-40% VRAM reduction, minimal accuracy loss
whisperx audio.wav \
  --model large-v2 \
  --compute_type int8 \
  --batch_size 4 \
  --device cuda

# CPU fallback for alignment (diarization still needs GPU)
whisperx audio.wav \
  --model base \
  --compute_type int8 \
  --device cpu

容器环境下的模型缓存 #

# Pre-download models to avoid cold-start latency
python3 << 'PYEOF'
import whisperx
import torch

# Download ASR model
model = whisperx.load_model("large-v2", "cuda")
del model

# Download alignment model
align_model, metadata = whisperx.load_align_model("en", "cuda")
del align_model

# Download diarization model
diarize = whisperx.DiarizationPipeline(use_auth_token="token", device="cuda")
del diarize

torch.cuda.empty_cache()
print("Models cached successfully")
PYEOF

# Mount cache in Docker
# -v /host/cache:/root/.cache:rw

监控与日志 #

# monitoring.py - Prometheus metrics for WhisperX
from prometheus_client import Counter, Histogram, start_http_server
import time

TRANSCRIPTION_DURATION = Histogram(
    "whisperx_transcription_seconds",
    "Time spent transcribing audio",
    ["model", "stage"]
)
REQUEST_COUNT = Counter(
    "whisperx_requests_total",
    "Total transcription requests",
    ["model", "status"]
)

def transcribe_with_metrics(audio_path, model_name="large-v2"):
    start = time.time()
    audio = whisperx.load_audio(audio_path)

    # Stage 1
    t0 = time.time()
    result = MODEL.transcribe(audio, batch_size=16)
    TRANSCRIPTION_DURATION.labels(model_name, "transcribe").observe(time.time() - t0)

    # Stage 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)

    # Stage 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

# Expose metrics on port 9090
start_http_server(9090)

安全注意事项 #

  1. 令牌管理。HF_TOKEN存储在密钥管理系统中(如AWS Secrets Manager、Vault),绝不要写在代码或环境文件中。
  2. 输入校验。 对上传的文件名进行清理消毒。在隔离的临时目录中处理音频。
  3. 速率限制。 实施按用户维度的速率限制,防止GPU资源被耗尽。
  4. 模型隔离。 在具有只读根文件系统的专用容器中运行WhisperX。
# Secure Docker run
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
词级时间戳支持(<80毫秒)不支持(仅段落级)不支持(仅段落级)不支持
说话人分离支持(按词)不支持不支持不支持
最大推理速度70倍实时速度10倍实时速度70倍实时速度15倍实时速度
模型规格tiny到large-v3tiny到large-v3tiny到large-v3单一模型
显存(大模型)8-16GB10-24GB6-10GB2-4GB
支持语言数99+99+99+仅英语
词错误率(干净英语)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作为预算。

常见问题 #

问题1:词级时间戳与人工标注相比,准确度如何?

在与人工对齐的TED演讲进行比对测量后,WhisperX时间戳在干净语音上的平均绝对误差为40到80毫秒。这足以满足字幕同步和点击跳转的需求。在带背景音乐的嘈杂音频上,误差会增加到100到200毫秒。请始终在你的具体音频场景中进行验证。

问题2:我可以在不使用说话人分离的情况下使用WhisperX吗?

可以——说话人分离功能完全是可选的。不加--diarize运行即可只获得词级时间戳。对齐阶段无论如何都会运行,所以你依然能得到低于100毫秒精度的词级时间戳。这样能将处理时间缩短约40%。

问题3:生产环境部署需要什么样的GPU?

搭配INT8量化的RTX 3060(8GB显存)可以轻松应对large-v2模型。对于高吞吐量的部署场景,RTX 4070(12GB)在开启完整说话人分离的情况下,每小时能处理20多个小时的音频。云端GPU(A10G、T4、L4)在相同配置下同样表现良好。

问题4:如何处理时长较长的音频文件(2小时以上)?

WhisperX会使用VAD自动对长音频进行分段,无需手动分块。对于4小时以上的文件,如果显存允许,可以增大--batch_size;对于内存受限的系统,可以降到4。VAD阶段能确保不会有词被从句子中间切断。

问题5:我可以用自己的数据对WhisperX进行微调吗?

你可以使用OpenAI的训练脚本对底层的Whisper模型进行微调,然后将自定义权重加载进WhisperX。对齐和说话人分离阶段不需要微调。对于医疗、法律等领域专属词汇场景,对ASR模型进行微调可以将词错误率降低15%到30%。

问题6:为什么我需要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的同一家IDC——已经过生产环境实战检验。

联盟链接——不会给你带来额外费用,同时能帮助维持dibi8.com的运营。

参考资料与延伸阅读 #

References & Sources #

📦 出现在以下合集中

💬 留言讨论