WhisperX:逐词时间戳和 locuteurs
WhisperX 是围绕 Whisper 构建的开源扩展(采用 BSD-2-Clause 许可证,GitHub 星标超过 24,000),增加了两项功能:通过语音模型进行强制对齐,提供真正精确的逐词时间戳;以及通过 pyannote-audio 区分说话人。所有处理都在本地运行。项目宣称,使用 Whisper large-v2 时,批量推理速度最高可达实时速度的 70 倍——代价是需要加载三个模型,而不是一个。
Whisper 的转录效果很好,但时间戳只能做到大致准确。WhisperX 增加了两项功能,一旦需求不再只是生成一份文档,它们就能发挥关键作用:强制对齐,让每个词的时间戳真正精确;说话人区分,标明谁在什么时候说了话。正是这两项功能,让转录文本成为可用的字幕和易读的会议纪要。
#Whisper单独无法解决的问题
WhisperX是一款采用BSD-2-Clause许可证的自由软件扩展,在Whisper之上增加了模型本身不提供的两项功能:通过wav2vec2模型进行强制对齐,获得逐词时间戳;通过pyannote模型生成说话人标签。如果您要制作时间准确的字幕,或制作能看出谁说了什么的会议记录,就需要WhisperX。如果您只需要文本,Whisper本身或faster-whisper就足够了。代价是需要加载三个模型,而不是一个;需要Hugging Face访问令牌来区分说话人;还存在文档中列明的限制:数字和金额无法对齐,同时讲话的情况处理不佳,说话人区分也仍不完善。所有功能都在本地运行,可使用GPU、CPU,也可在Mac上运行。
Whisper 生成的文本非常出色。但只要需要的不只是文本,它的弱点就会显现出来。根据 WhisperX 仓库的说明,Whisper 的时间戳按语句给出,而非逐词给出,并且可能偏移数秒:这种偏差在文档中看不出来,用于字幕时却不可接受,因为晚了一拍才出现的字幕比完全没有字幕还糟糕。此外,Whisper 完全不区分说话人:两小时的会议转录出来后,会变成一段不区分说话人的独白。
WhisperX 通过增加处理步骤,而非替换模型,同时满足这两项需求。正是这一设计选择保留了您熟悉的转录质量。该项目以 BSD-2-Clause 许可证发布,目前在 GitHub 上已获得超过 24,000 个星标——这表明,它所满足的需求,即为转录内容添加时间戳并标明说话者,远不局限于字幕制作。
#三个步骤
只需 1 小时,即可在您的电脑上拥有专属的免费 ChatGPT — LM Studio、Ollama、Open WebUI、您的文档,无需云端。
- 在线空间,终身可用
- PDF + 文件
- 终身更新
| 步骤 | 角色 | 需要什么 |
|---|---|---|
| 语音检测(VAD) | 在转录前,语音信号会被划分为语音段 | 语音检测器(默认使用 pyannote,可选 silero) |
| 转录 | 音频通过 faster-whisper 转换为文本,faster-whisper 是 Whisper 的快速实现 | 一个 Whisper 模型:其大小决定了质量和内存占用(命令行默认为 small) |
| 强制对齐 | 通过 wav2vec2,将每个词精确对齐到音频中的对应位置 | 针对相应语言的语音模型 |
| 说话人分离 | 通过 pyannote-audio,按说话人切分音频,并为各个发言轮次添加标签 | 默认使用pyannote speaker-diarization-community-1模型,访问需接受相关条款 |
语音检测有双重作用:代码仓库说明,它能减少幻觉,并支持将片段分组处理,而不会使词错误率恶化。对齐步骤往往被低估。正是这一步通过 wav2vec2 模型,将每个词对齐到其在音频信号中的实际位置,使逐词时间戳值得信赖。这一步依赖具体语言:代码仓库明确指出,需要使用对应语言的 wav2vec2 模型,并提供英语、法语、德语、西班牙语和意大利语的默认模型;此外,还可通过 Hugging Face 获取许多其他语言的模型。如果某种语言不在列表中,就需要自行寻找语音模型并进行测试。转录本身也受益于批量推理:项目宣称,使用 large-v2 模型时,处理速度最高可达实时速度的 70 倍,但 README 未说明所用硬件。请将这一数字视为需要在您的机器上验证的上限。
#说话人分离:保持现实预期
说话人标注通过 pyannote-audio 对整段录音中的声音特征进行聚类来实现。WhisperX 目前的默认模型是 speaker-diarization-community-1,以 CC-BY-4.0 许可证发布,接收采样率为 16 kHz 的单声道音频信号(立体声会转换为单声道,其他采样率的音频会进行重采样)。模型说明声称,它的表现远好于旧版 3.1 流水线。WhisperX 仓库坦率地指出了局限:重叠语音的处理效果较差,说话人分离仍“远非完美”。pyannote 公布的说话人分离错误率也说明了这一点:AISHELL-4 上为 11.7%,AMI(独立麦克风)上为 17.0%,AMI(远场麦克风)上为 19.9%,CALLHOME(第二部分)上为 26.7%,Ego4D 上为 46.8%,具体取决于语料库。这些是学术语料库,并非您的录音,但这一数量级表明,仍有必要进行人工复核。恰恰在会议情况变得复杂时,效果会恶化:人们互相打断、有人离麦克风较远,或不同人的声音相近。
两点实用说明。可以指定说话人数的最小值和最大值(使用 --min_speakers 和 --max_speakers 选项);项目仓库建议在已知人数时提供这些信息,这样模型就不必自行猜测。此外,标签在设计上就是匿名的:系统会指出有三个不同的声音,以及每个声音分别对应哪些发言轮次,而不会说明说话者是谁。将标签与姓名关联起来需要手动完成——也正是在这一步,转录文本变成了个人数据。
#实际准确度,而非基准测试中的准确度
转录本身也值得用数字说明,因为常见的基准测试给出的印象过于乐观。据商业转录服务 VexaScribe 称,Whisper large-v3 在 LibriSpeech test-clean 上的词错误率约为 2.7%;这是一个音质干净、只有单一说话人的音频数据集。对于真实的英语音频——会议、播客、通话——同一网站给出的词错误率约为 8% 至 12%。这些是业内服务商公布的大致数值,适用于英语,无法说明您自己的法语录音会有怎样的表现。WhisperX 并不改善转录本身,转录仍由 Whisper 完成:它增加的是精确定位每个词在音频中的位置,以及识别是谁说了这个词,而这两项信息并不体现在词错误率中。
| 需求 | 工具 |
|---|---|
| 纯文本,速度快 | 单独使用 Whisper,或使用 faster-whisper 等高速实现 |
| 字幕在合适时机出现 | WhisperX:对齐是其存在的核心目的 |
| 注明谁说了什么的记录 | 启用说话人分离的WhisperX |
| 实时转录,低延迟 | 基于流的引擎;该链路专为文件设计 |
#所需资源
- Whisper模型的大小决定一切
- 大型模型能提供质量最好的转录文本,同时也需要最多的内存;仓库说明,更大的模型能提高时间戳准确性,代价是占用更多显存,而更大的对齐模型则帮助不大。
- 需要加载的是三个模型,而不是一个
- 当转录、对齐和分离模型同时驻留在内存中时,内存占用达到峰值。仓库中的 Python 示例会在每个模型完成其步骤后释放该模型(先进行垃圾回收,再调用 torch.cuda.empty_cache()),这是小显存显卡上的常见解决办法。
- 无GPU,包括Mac
- 仓库提供了适用于 CPU 和 macOS 的命令行参数:--compute_type int8 --device cpu。仓库未公布任何 CPU 处理耗时:请先用一小段素材测量,再规划批量处理。使用 NVIDIA GPU 时,需要 CUDA 12.8 工具包;项目说明,large-v2 在 beam_size=5 时所需内存低于 8 GB。
- 批量处理可提升效率
- 批处理是所宣称速度的关键:命令行默认设置为 --batch_size 8。调低该值(代码仓库中提到 4)可以释放显存。
#安装并启动转录
通过 pip 安装;该软件包要求 Python 3.10 至 3.13。命令行默认写出所有可用格式(srt、vtt、txt、tsv、json、aud),而 --highlight_words True 选项会在 SRT 和 VTT 字幕中为每个词添加下划线,时机与该词被说出的时刻对应。启用说话人分离后,JSON 中会包含说话人标签。
- 01安装WhisperXpip install whisperx 用于安装软件包;如果使用 NVIDIA GPU,应根据仓库说明先安装 CUDA 12.8 工具包。仓库还补充说明,可能还需要安装 ffmpeg,并参考 Whisper 的安装说明。
- 02转录与对齐使用中等大小的 Whisper 模型进行第一轮处理(默认为 small);如果事先知道语言,就明确指定。未指定时会自动检测语言,而对齐模型的选择取决于该语言。
- 03如有需要,启用说话人分离添加--diarize参数,并输入在接受pyannote模型条款后获得的Hugging Face访问令牌,若已知说话人数,请注明人数。
- 04复核输出文件打开生成的 SRT 或 JSON 文件,随机检查几个片段,尤其要检查多人几乎同时发言时的发言轮次。
#对齐无法标注时间戳的内容
该仓库列出了在承诺提供完美字幕之前需要了解的限制。第一项与数字有关:如果一个词包含不在对齐模型词典中的字符,例如“2014.”或“£13.60”,这个词就无法对齐,因此也没有时间戳。在充斥着金额和日期的会议中,这些词在 SRT 文件里不会有各自的时间标记。第二项是多人同时说话,Whisper 和 WhisperX 都无法很好地处理。第三项与语言有关:需要相应语言专用的 wav2vec2 模型。
与原始 Whisper 相比,两处差异也解释了文本输出为何会有所不同。为了让每个批次只需一次处理,推理时不使用 Whisper 时间戳;仓库对此提醒,这可能导致结果与默认输出不同。此外,condition_on_prev_text 选项默认关闭,以减少幻觉。自 2026 年起,--interleaved_context 选项可恢复各片段之间连续的上下文。项目说明称,这有助于处理标点和技术词汇,但该选项推出不久:采用前,请先用一小段音频进行测试。
#具体用例
- 培训视频字幕
- 逐词时间戳可避免字幕落后于语音整整一句话;这种问题在教学内容中一眼就能看出,也很影响观看体验。
- 多人发言的会议纪要
- 说话人分离可以还原是谁提出了什么,而不注明内容由谁提出的摘要无法忠实呈现这类信息。
- 长播客和长访谈
- 批量推理适用于长录音:作者的论文标题《Time-Accurate Speech Transcription of Long-Form Audio》就表明了这一点。
- 需索引的音频档案
- 带有逐词时间戳的文本可以让搜索结果直接定位到录音中的确切时刻,而不只是整个文档。
- 社交媒体摘录
- 逐词精确定位一句令人印象深刻的话在视频中说出的片段,便于剪出一个短片段,而无需重新听完整段视频。
这些场景的共同点是:均无需实时转录。处理的是已录制并保存的文件,可在事后进行处理,从而为批量推理提供充足的时间,避免延迟限制。当需求转变为实时字幕生成——例如转播会议、正在进行的通话——无论机器性能多强,WhisperX 都不再适用。
#转录是输入,不是交付物
在几乎所有实际场景中,转录本身并非最终目的:转录文本会提供给本地模型,由模型生成会议纪要、决策记录或摘要。这会影响对转录质量的要求:与发言轮次的结构相比,某个生僻词的转录错误影响较小,因为正是这种结构让模型能够正确判断每段话是谁说的。
实际上,一个合理的生产流程将两个任务分开:WhisperX生成带有说话人标注和时间戳的文本,然后由一个独立的语言模型对文本进行重读,从而生成结构化的摘要。将这两个步骤合并到单次调用中——直接要求模型对音频进行摘要——会丧失WhisperX本应提供的精确时间戳功能,也使得事后对特定段落的验证变得更加困难。
另一个优势是:只需转录一次,之后便可重复利用转录文本,制作简短纪要、决策记录、字幕等多种成果,无需再次处理音频。带有时间戳和标签的文本成为统一的权威依据。
- 来源:WhisperX 在 GitHub 上的官方仓库
- 来源:pyannote community-1 说话人区分模型
- 来源:VexaScribe(商业服务),Whisper large-v3 的词错误率
- 来源:PyPI 上的 whisperx
#FAQ
WhisperX是免费的吗?+
说话人分离的可靠性如何?+
需要 GPU 吗?+
WhisperX还是仅使用Whisper?+
支持法语吗?+
能否实时转录?+
有反馈、发现了错误,或想补充说明?请告诉我们,让这份指南对每个人都更有帮助。