WhisperX 完整指南:自动语音识别 + 说话人分离,把录音变成“谁在何时说了什么“
WhisperX 完整指南:自动语音识别 + 说话人分离,把录音变成"谁在何时说了什么"
【免费下载链接】whisperXWhisperX: Automatic Speech Recognition with Word-level Timestamps (& Diarization)项目地址: https://gitcode.com/gh_mirrors/wh/whisperX
如果你手里攒着一堆会议录音、访谈音频或者播客节目,WhisperX 大概是最值得一试的免费开源工具:它能把一段混合多人声音的音频,一次性变成"带时间轴、带说话人标签"的完整文字稿。这份完整指南面向零基础读者,从环境搭建、第一次运行,到调参优化、批量提速,全程手把手带你把 WhisperX 跑通、用好。
读完本文,你将学会:
- 分清 WhisperX 的三大能力:语音识别、单词级时间戳、说话人分离;
- 从零安装并运行第一条命令,看懂它生成的各类输出文件;
- 识别不准、说话人张冠李戴时的排查与调参思路;
- 处理长音频、低配置电脑时的提速方法;
- 用 Python 接口把 WhisperX 嵌进你自己的脚本里。
从一个真实的小烦恼说起
上周,一位做播客的朋友跟我吐槽:一期 40 分钟的嘉宾对谈,他花了大半天手工整理逐字稿,还得自己一段段标注"这是谁说的"。更崩溃的是,剪辑软件自动生成的字幕永远对不上时间轴——字已经说完了,字幕还停在上一句。
他的痛点其实很典型:录音转写 ≠ 转写 + 对时间 + 分说话人。市面上的语音识别工具大多只做第一件事,而 WhisperX 把后面两件也一起做了,而且是自动化完成。
先用三个关键词认识 WhisperX
WhisperX 的官方定位是"带单词级时间戳的自动语音识别,并支持说话人分离"。拆开看,就是三样东西叠加:
- 语音识别(ASR):基于 OpenAI 的 Whisper 模型,把音频转成文字,支持多语言;
- 单词级时间戳:通过音素对齐(forced alignment),把时间精度从"一句话"细化到"每一个词",误差控制在极小的范围内;
- 说话人分离(Diarization):通过声学特征差异,判断这段话是"谁"说的,并打上 SPEAKER_00、SPEAKER_01 之类的标签。
打个比方:普通语音识别像一位只负责听写的速记员,记下内容但不管"谁说的、什么时候说的";WhisperX 则像一个三人小组——听写员、计时员和辨声员同时开工,最后交给你一份标注得明明白白的会议纪要。
下图是 WhisperX 的完整处理流水线,可以看到音频经过语音活动检测(VAD)切分、批处理、Whisper 转录、音素模型强制对齐,最终输出带单词级时间戳的文本:
问题一:它和普通语音识别工具,到底差在哪?
很多新手会问:"Whisper 不是已经能转文字了吗?为什么还要 WhisperX?"关键在于三个"普通工具做不到"的细节。
① 时间戳准到"词"。原版 Whisper 的时间戳是"句子级"的,而且可能偏差好几秒。WhisperX 额外引入音素级对齐模型(如 wav2vec2),把文本逐词"钉"到音频波形上,输出类似[00.12~0.44] That's这样的词级时间轴。做字幕时,词和画面就能精准卡点。
② 能区分说话人。这是很多人最看重的功能。启用说话人分离后,转录结果里每个片段都会带上speaker字段。会议录音里谁说了什么,一目了然。
③ 又快又能批量。借助 faster-whisper 后端和 VAD 分段的批量推理,官方给出的数据是:使用 large-v2 模型可以达到70 倍实时速度,即 1 小时的音频约 1 分钟处理完(GPU 环境),且显存占用小于 8GB。
这三个差异,决定了它适合的人群:需要做字幕的自媒体、整理会议纪要和访谈逐字稿的运营/行政/法律从业者、做播客剪辑的内容创作者,以及任何想从音频里快速检索"谁说了什么"的人。
问题二:第一次运行,怎么让 WhisperX 跑起来?
别被"模型""对齐"这些词吓到,实际动手只需要几步。
第 1 步:准备 Python 环境
建议使用 Python 3.10。如果你装了 Anaconda,可以用下面两条命令创建并激活独立环境,避免污染系统环境:
conda create --name whisperx python=3.10 conda activate whisperx然后安装 PyTorch(以 CUDA 11.8 为例):
conda install pytorch==2.0.0 torchaudio==2.0.0 pytorch-cuda=11.8 -c pytorch -c nvidia没有 GPU 也没关系,纯 CPU 也能跑,后面会讲怎么配置。另外系统里需要装好ffmpeg,它是音频解码的基础依赖。
第 2 步:克隆项目并安装依赖
git clone https://gitcode.com/gh_mirrors/wh/whisperX cd whisperX pip install -r requirements.txt💡小贴士:安装依赖主要会拉取 PyTorch、faster-whisper、pyannote.audio、pandas 等核心库,耐心等一会儿即可。如果只想快速试用,也可以直接
pip install whisperx,但跟着本教程从源码安装能保证版本一致。
第 3 步:跑你的第一条命令
准备好一个音频文件(比如meeting.wav),运行:
python -m whisperx meeting.wav --model medium这一条命令背后其实做了三件事:先用 VAD 找出哪些片段有人声并切分,再用 Whisper 批量转录,最后用对齐模型把时间戳精修到单词级。默认情况下,当前目录会生成 SRT、VTT、TXT、TSV、JSON 等多种格式的输出文件。
第 4 步:看懂输出文件
- SRT / VTT:带时间轴的标准字幕文件,可直接导入剪辑软件;
- TXT:纯文字稿,方便复制粘贴;
- TSV / JSON:结构化数据,包含每个片段甚至每个词的时间戳、置信度分数,适合程序处理;
- 加
--highlight_words True后,SRT 字幕里还会给每个词加下划线,做"逐词高亮"的卡拉 OK 效果。
如果想指定输出目录或格式,用--output_dir和--output_format。比如只要 SRT 和 TXT:
python -m whisperx meeting.wav --model medium --output_format srt,txt --output_dir ./out第 5 步:开启说话人分离
要区分说话人,只需加上--diarize参数。如果你知道音频里有几个人,可以顺带告诉模型:
python -m whisperx meeting.wav --model medium --diarize --min_speakers 2 --max_speakers 4此时转录结果中每个片段都会带上说话人标签(如 SPEAKER_00、SPEAKER_01),JSON 文件里对应"speaker": "SPEAKER_01"字段。
⚠️注意:说话人分离依赖 pyannote 的模型,需要你先去 Hugging Face 注册并领取一个只读 Access Token,同意模型的使用协议后,通过
--hf_token 你的token传入,或者设置成环境变量,否则这一步会报错。
问题三:识别不准、说话人张冠李戴,怎么调?
第一次跑出来的结果往往"能用但不够好"。别急,大部分问题都能通过下面几个参数解决。
说话人分错了怎么办?
- 告诉模型准确人数:把范围收紧,比如确定只有两个人就写
--min_speakers 2 --max_speakers 2,减少误判; - 换更大的识别模型:
--model large-v2在特征提取上更细腻,说话人归属会更稳定; - 先做降噪预处理:背景音乐、空调声会严重干扰说话人区分,先用工具降噪再喂给 WhisperX。
文字识别错、专有名词被写歪?
- 换更大的模型:从
small/medium升级到large/large-v2,准确率提升明显,代价是更慢、更吃显存; - 指定语言:如果确定音频是德语,加
--language de,避免语言检测兜圈子; - 用
--initial_prompt提供上下文:可以塞入人名、公司名等专有名词,模型会更倾向于正确拼写。
时间戳对不齐、词被吞掉?
WhisperX 的词级对齐依赖语言对应的音素模型。目前官方默认支持en、fr、de、es、it、ja、zh、nl、uk、pt等语言,会自动匹配;如果你的语言不在列表里,需要去模型库找一个对应的音素模型,通过--align_model指定。
另外,数字、货币符号(如 "2014."、"£13.60")不在音素模型词典里,可能无法对齐出时间戳,这属于已知局限,加--suppress_numerals可以缓解。语音重叠的片段(两个人同时说话)处理效果也不理想,录会议时尽量让大家别抢话。
静音段处理不干净?
VAD 有两个阈值参数:--vad_onset(默认 0.5)和--vad_offset(默认 0.363)。如果发现该识别的话没被识别出来,说明阈值偏高,可以调低这两个值,让 VAD 更敏感地把弱语音也圈进来。
问题四:录音很长、机器配置一般,怎么跑得快?
WhisperX 把提速的旋钮都给你了,按下面的优先级试。
① 优先用 GPU
加--device cuda即可用显卡加速。GPU 显存小于 8GB 时,优先调小--batch_size(默认 8,可试 4 或 2)。
② 换更轻的计算精度
加--compute_type int8。int8 比默认的 float16 更快、更省内存,适合 CPU 或低显存机器,代价是精度轻微下降。纯 CPU 机器(包括 Mac)建议直接:
python -m whisperx audio.wav --compute_type int8③ 合理选择模型大小
日常场景推荐medium作为速度与精度的平衡点;tiny/base最快但错字多;追求最高准确率再上large-v2。
④ 一次处理多个文件
python -m whisperx支持一次传入多个音频路径,模型只需加载一次,多文件也能批量出结果,省去反复加载模型的等待。
💡提示:处理超长音频时,
--chunk_size(默认 30 秒)控制 VAD 片段的合并长度,如果发现某个片段太长导致显存溢出,可以调小它。
进阶玩法:用 Python 接口写进自己的工作流
命令行方便,但如果你想批量处理几百个文件、或者把结果接进自己的系统,可以用 Python 接口。核心调用顺序和命令行完全对应:
import whisperx device = "cuda" # CPU 环境改成 "cpu" audio_file = "meeting.wav" batch_size = 16 # 1. 转录 model = whisperx.load_model("large-v2", device, compute_type="float16") audio = whisperx.load_audio(audio_file) result = model.transcribe(audio, batch_size=batch_size) # 2. 对齐,得到单词级时间戳 model_a, metadata = whisperx.load_align_model(language_code=result["language"], device=device) result = whisperx.align(result["segments"], model_a, metadata, audio, device) # 3. 说话人分离并打标签 diarize_model = whisperx.DiarizationPipeline(use_auth_token="你的HF_TOKEN", device=device) diarize_segments = diarize_model(audio, min_speakers=2, max_speakers=4) result = whisperx.assign_word_speakers(diarize_segments, result) # result["segments"] 里每个片段都带 start/end/text/speaker for seg in result["segments"]: print(seg["speaker"], seg["start"], seg["end"], seg["text"])完整示例和更多语言的使用方式可以参考 EXAMPLES.md,命令行参数全表在 whisperx/transcribe.py 里都有注释说明,说话人分配的实现在 whisperx/diarize.py。
真实场景盘点:不同行业都怎么用它?
- 会议记录自动化:行政或助理每周把例会录音丢给 WhisperX,输出带发言人标签的纪要,按人筛选观点,查找"上次张总对预算怎么说"这类问题只需搜一下 JSON;
- 播客金句提取:播客剪辑师转录整期节目后,在 JSON 里筛出嘉宾的片段,快速拼出"金句集锦",还能用词级时间戳做卡点字幕;
- 视频字幕生产:自媒体用 SRT 输出配合剪辑软件自动生成字幕,
--highlight_words True还能做出逐词高亮的字幕效果; - 访谈与学术记录:研究者把访谈音频转成带时间戳的文字稿,写论文引用时能精确定位到秒。
写在最后:从一份录音开始
WhisperX 的价值,不在于它"能转写",而在于它把转写、对齐、分人这三件原本要分开做、还很费人力的事,合并成了一行命令。它开箱即用、完全免费,配置门槛也不算高——你只需要一个 Python 环境、一个音频文件,再加一点耐心读这篇指南的时间。
现在就可以试试:找一个你手头最短的录音,按第 3 步的命令跑一遍,亲眼看看"谁在何时说了什么"是怎么从一段音频里自动浮现出来的。跑通第一条命令之后,剩下的所有优化,都是锦上添花。
【免费下载链接】whisperXWhisperX: Automatic Speech Recognition with Word-level Timestamps (& Diarization)项目地址: https://gitcode.com/gh_mirrors/wh/whisperX
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考