whisperX

m-bainBSD-2-Clause活跃维护

基于 Whisper 的语音识别工具,能给出词级时间戳并支持说话人分离,适合做字幕对齐和会议转写。

WhisperX: Automatic Speech Recognition with Word-level Timestamps (& Diarization)

v3.8.6发布于 2026-05-25 12:35 UTC25,201star +54 / 7 天2,545fork同步于 2026-11-10 23:24 UTC

怎么上手

由 README 提炼,执行前请确认
pip install whisperx
whisperx path/to/audio.wav
硬件要求按 README 说明

GPU 加速需先装 CUDA toolkit 12.8;large-v2 在 beam_size=5 下需不到 8GB 显存;可用 --device cpu --compute_type int8 在 CPU 或 Mac OS X 上运行。

8G 显存可跑纯 CPU 可运行需要 CUDA
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

WhisperX 是带词级时间戳和说话人分离的快速语音识别工具,解决 Whisper 时间戳不准的问题

基于 Whisper 的语音识别工具,能给出词级时间戳并支持说话人分离,适合做字幕对齐和会议转写。

核心能力

  • 用 faster-whisper 后端批量推理,large-v2 达 70 倍实时
  • 用 wav2vec2 强制对齐生成词级时间戳
  • 接入 pyannote-audio 做说话人分离并标注说话人 ID
  • 用 VAD 预处理减少幻觉且不损失 WER
  • 支持 interleaved_context 跨段传递上下文改善标点

容易踩的坑

说话人分离需提供 Hugging Face token 并接受 pyannote 模型协议;非英语对齐模型按语言自动选择,未覆盖语言需自备音素模型;可能还需另装 ffmpeg、rust 等依赖。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v3.8.6
  1. 3.8.7rc1pre-release2026-06-26 · 2026-06-26 11:39 UTC
    查看更新说明

    What's Changed

    New Contributors

    Full Changelog: https://github.com/m-bain/whisperX/compare/v3.8.6...3.8.7rc1

  2. v3.8.6最新正式版2026-05-25 · 2026-05-25 12:35 UTC

    What's Changed

    New Contributors

    Full Changelog: https://github.com/m-bain/whisperX/compare/v3.8.5...v3.8.6

  3. v3.8.52026-04-01 · 2026-04-01 07:03 UTC
    查看更新说明

    What's Changed

    Full Changelog: https://github.com/m-bain/whisperX/compare/v3.8.4...v3.8.5

  4. v3.7.92026-03-25 · 2026-03-25 08:48 UTC
    查看更新说明

    Backport of word-level timestamp fixes from v3.8.4.

    Bug Fixes

    • Restore timestamps for unalignable characters (39aa9f5): Words containing digits, symbols, or foreign script (e.g. 4,9, £13.60) now get proper timestamps via a wildcard emission column. The previous patch (v3.X.Y) reverted PR #986 which removed wildcard support entirely. Fixes #1372.

    Testing

    • Add regression test for #1372 (da072d6)
    • Add pytest dev dependency and CI test workflow (f9a3f8f)

    Full Changelog: https://github.com/m-bain/whisperX/compare/v3.7.8...v3.7.9

  5. v3.8.42026-03-25 · 2026-03-25 08:12 UTC
    查看更新说明

    What's Changed

    Full Changelog: https://github.com/m-bain/whisperX/compare/v3.8.2...v3.8.4

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    Recall.ai - Meeting Transcription API

    If you’re looking for a transcription API for meetings, consider checking out Recall.ai's Meeting Transcription API, an API that works with Zoom, Google Meet, Microsoft Teams, and more. Recall.ai diarizes by pulling the speaker data and separate audio streams from the meeting platforms, which means 100% accurate speaker diarization with actual speaker names.

    This repository provides fast automatic speech recognition (70x realtime with large-v2) with word-level timestamps and speaker diarization.

    • ⚡️ Batched inference for 70x realtime transcription using whisper large-v2
    • 🪶 faster-whisper backend, requires <8GB gpu memory for large-v2 with beam_size=5
    • 🎯 Accurate word-level timestamps using wav2vec2 alignment
    • 👯‍♂️ Multispeaker ASR using speaker diarization from pyannote-audio (speaker ID labels)
    • 🗣️ VAD preprocessing, reduces hallucination & batching with no WER degradation

    Whisper is an ASR model developed by OpenAI, trained on a large dataset of diverse audio. Whilst it does produces highly accurate transcriptions, the corresponding timestamps are at the utterance-level, not per word, and can be inaccurate by several seconds. OpenAI's whisper does not natively support batching.

    Phoneme-Based ASR A suite of models finetuned to recognise the smallest unit of speech distinguishing one word from another, e.g. the element p in "tap". A popular example model is wav2vec2.0.

    Forced Alignment refers to the process by which orthographic transcriptions are aligned to audio recordings to automatically generate phone level segmentation.

    Voice Activity Detection (VAD) is the detection of the presence or absence of human speech.

    Speaker Diarization is the process of partitioning an audio stream containing human speech into homogeneous segments according to the identity of each speaker.

    • 1st place at Ego4d transcription challenge 🏆
    • WhisperX accepted at INTERSPEECH 2023
    • v3 released, 70x speed-up open-sourced. Using batched whisper with faster-whisper backend!
    • Context-Aware Batching Released 2026: We successfully enable condition_on_previous_context within our batched transcription framework, improving punctuation and proper noun adherence. See our ArXiv preprint.

    0. CUDA Installation

    To use WhisperX with GPU acceleration, install the CUDA toolkit 12.8 before WhisperX. Skip this step if using only the CPU.

    1. Simple Installation (Recommended)

    The easiest way to install WhisperX is through PyPi:

    pip install whisperx
    

    Or if using uvx:

    uvx whisperx
    

    2. Advanced Installation Options

    These installation methods are for developers or users with specific needs. If you're not sure, stick with the simple installation above.

    Option A: Install from GitHub

    To install directly from the GitHub repository:

    uvx git+https://github.com/m-bain/whisperX.git
    
    Option B: Developer Installation

    If you want to modify the code or contribute to the project:

    git clone https://github.com/m-bain/whisperX.git
    cd whisperX
    uv sync --all-extras --dev
    

    Note: The development version may contain experimental features and bugs. Use the stable PyPI release for production environments.

    You may also need to install ffmpeg, rust etc. Follow openAI instructions here https://github.com/openai/whisper#setup.

    Accelerated Forced Alignment (Optional)

    WhisperX uses dynamic programming for phoneme alignment. For long audio files or batch pipelines on GPU, you can accelerate alignment by up to 30×–100× by installing Numba:

    pip install "whisperx[fast]"
    # or: pip install numba
    

    If Numba is installed, WhisperX will automatically use JIT-compiled alignment loops. If Numba is not installed, it seamlessly falls back to native PyTorch with zero configuration required.

    Speaker Diarization

    To enable Speaker Diarization, include your Hugging Face access token (read) that you can generate from Here after the --hf_token argument and accept the user agreement for the speaker-diarization-community-1 model.

    English

    Run whisper on example segment (using default params, whisper small) add --highlight_words True to visualise word timings in the .srt file.

    whisperx path/to/audio.wav
    

    Result using WhisperX with forced alignment to wav2vec2.0 large:

    https://user-images.githubusercontent.com/36994049/208253969-7e35fe2a-7541-434a-ae91-8e919540555d.mp4

    Compare this to original whisper out the box, where many transcriptions are out of sync:

    https://user-images.githubusercontent.com/36994049/207743923-b4f0d537-29ae-4be2-b404-bb941db73652.mov

    For increased timestamp accuracy, at the cost of higher gpu mem, use bigger models (bigger alignment model not found to be that helpful, see paper) e.g.

    whisperx path/to/audio.wav --model large-v2 --align_model WAV2VEC2_ASR_LARGE_LV60K_960H --batch_size 4
    

    To label the transcript with speaker ID's (set number of speakers if known e.g. --min_speakers 2 --max_speakers 2):

    whisperx path/to/audio.wav --model large-v2 --diarize --highlight_words True
    

    To maintain continuous context (ideal for technical language / punctuation), set interleaved_context=True:

    whisperx path/to/audio.wav --model large-v2 --interleaved_context
    

    To run on CPU instead of GPU (and for running on Mac OS X):

    whisperx path/to/audio.wav --compute_type int8 --device cpu
    

    For conditioning on previous context (This allows context to be passed from the previous segment, leading to better results on long audio):

    whisperx path/to/audio.wav --model large-v2 --interleaved_context
    

    Other languages

    The phoneme ASR alignment model is language-specific, for tested languages these models are automatically picked from torchaudio pipelines or huggingface. Just pass in the --language code, and use the whisper --model large.

    Currently default models provided for {en, fr, de, es, it} via torchaudio pipelines and many other languages via Hugging Face. Please find the list of currently supported languages under DEFAULT_ALIGN_MODELS_HF on alignment.py. If the detected language is not in this list, you need to find a phoneme-based ASR model from huggingface model hub and test it on your data.

    E.g. German
    whisperx --model large-v2 --language de path/to/audio.wav
    

    https://user-images.githubusercontent.com/36994049/208298811-e36002ba-3698-4731-97d4-0aebd07e0eb3.mov

    See more examples in other languages here.

    Python usage 🐍

    import whisperx
    import gc
    from whisperx.diarize import DiarizationPipeline
    
    device = "cuda"
    audio_file = "audio.mp3"
    batch_size = 16 # reduce if low on GPU mem
    compute_type = "float16" # change to "int8" if low on GPU mem (may reduce accuracy)
    
    # 1. Transcribe with original whisper (batched)
    model = whisperx.load_model("large-v2", device, compute_type=compute_type)
    
    # save model to local path (optional)
    # model_dir = "/path/"
    # model = whisperx.load_model("large-v2", device, compute_type=compute_type, download_root=model_dir)
    
    audio = whisperx.load_audio(audio_file)
    
    result = model.transcribe(audio, batch_size=batch_size, interleaved_context=True)
    print(result["segments"]) # before alignment
    
    # delete model if low on GPU resources
    # import gc; import torch; gc.collect(); torch.cuda.empty_cache(); del model
    
    # 2. Align whisper output
    model_a, metadata = whisperx.load_align_model(language_code=result["language"], device=device)
    result = whisperx.align(result["segments"], model_a, metadata, audio, device, return_char_alignments=False)
    
    print(result["segments"]) # after alignment
    
    # delete model if low on GPU resources
    # import gc; import torch; gc.collect(); torch.cuda.empty_cache(); del model_a
    
    # 3. Assign speaker labels
    diarize_model = DiarizationPipeline(token=YOUR_HF_TOKEN, device=device)
    
    # add min/max number of speakers if known
    diarize_segments = diarize_model(audio)
    # diarize_model(audio, min_speakers=min_speakers, max_speakers=max_speakers)
    
    result = whisperx.assign_word_speakers(diarize_segments, result)
    print(diarize_segments)
    print(result["segments"]) # segments are now assigned speaker IDs
    

    Demos 🚀

    Replicate (large-v3 Replicate (large-v2 Replicate (medium)

    If you don't have access to your own GPUs, use the links above to try out WhisperX.

    For specific details on the batching and alignment, the effect of VAD, as well as the chosen alignment model, see the preprint paper.

    To reduce GPU memory requirements, try any of the following (2. & 3. can affect quality):

    1. reduce batch size, e.g. --batch_size 4
    2. use a smaller ASR model --model base
    3. Use lighter compute type --compute_type int8

    Transcription differences from openai's whisper:

    1. Transcription without timestamps. To enable single pass batching, whisper inference is performed --without_timestamps True, this ensures 1 forward pass per sample in the batch. However, this can cause discrepancies the default whisper output.
    2. VAD-based segment transcription, unlike the buffered transcription of openai's. In the WhisperX paper we show this reduces WER, and enables accurate batched inference
    3. --condition_on_prev_text is set to False by default (reduces hallucination)
    • Transcript words which do not contain characters in the alignment models dictionary e.g. "2014." or "£13.60" cannot be aligned and therefore are not given a timing.
    • Overlapping speech is not handled particularly well by whisper nor whisperx
    • Diarization is far from perfect
    • Language specific wav2vec2 model is needed

    If you are multilingual, a major way you can contribute to this project is to find phoneme models on huggingface (or train your own) and test them on speech for the target language. If the results look good send a pull request and some examples showing its success.

    Bug finding and pull requests are also highly appreciated to keep this project going, since it's already diverging from the original research scope.

    • Multilingual init

    • Automatic align model selection based on language detection

    • Python usage

    • Incorporating speaker diarization

    • Model flush, for low gpu mem resources

    • Faster-whisper backend

    • Add max-line etc. see (openai's whisper utils.py)

    • Sentence-level segments (nltk toolbox)

    • Improve alignment logic

    • update examples with diarization and word highlighting

    • Subtitle .ass output <- bring this back (removed in v3)

    • Add benchmarking code (TEDLIUM for spd/WER & word segmentation)

    • Allow silero-vad as alternative VAD option

    • Improve diarization (word level). Harder than first thought...

    Contact [email protected] for queries.

    This work, and my PhD, is supported by the VGG (Visual Geometry Group) and the University of Oxford.

    Of course, this is builds on openAI's whisper. Borrows important alignment code from PyTorch tutorial on forced alignment And uses the wonderful pyannote VAD / Diarization https://github.com/pyannote/pyannote-audio

    Valuable VAD & Diarization Models from:

    Great backend from faster-whisper and CTranslate2

    Those who have supported this work financially 🙏

    Finally, thanks to the OS contributors of this project, keeping it going and identifying bugs.

    @article{bain2022whisperx,
      title={WhisperX: Time-Accurate Speech Transcription of Long-Form Audio},
      author={Bain, Max and Huh, Jaesung and Han, Tengda and Zisserman, Andrew},
      journal={INTERSPEECH 2023},
      year={2023}
    }
    

    Please also cite the paper below if you enabled interleaved context:

    @article{bain2026context,
      title={Context-Aware Interleaved Batching for WhisperX},
      author={Bain, Carlos and Bain, Max},
      journal={arXiv preprint arXiv:2608.31170v1},
      year={2026}
    }