ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

一段3小时的会议录音,我如何用whisperX语音识别在10分钟内得到带说话人标注的字幕

一段3小时的会议录音,我如何用whisperX语音识别在10分钟内得到带说话人标注的字幕

一段3小时的会议录音,我如何用whisperX语音识别在10分钟内得到带说话人标注的字幕

【免费下载链接】whisperXWhisperX: Automatic Speech Recognition with Word-level Timestamps (& Diarization)项目地址: https://gitcode.com/gh_mirrors/wh/whisperX

先交代背景:我要把一段3小时的双语会议录音变成可检索的文字稿,还得知道哪句话是谁说的。这不是一个"听写工具能解决"的问题——市面上绝大多数语音识别工具,转出来的文字是有了,但时间轴对不上、说话人全靠猜,剪辑、纪要、检索全都无从下手。直到我找到 whisperX,一个主打"词级时间戳 + 说话人分离(Speaker Diarization)"的开源语音识别项目,才把这件事从"3小时手工活"压缩成了"10分钟自动跑完"。这篇文章不讲花哨理论,就用我踩过的坑,带你把它跑起来。

先把话说清楚:一段会议录音的"病历"

你拿到手的原始音频,往往长这样:开头40秒是椅子挪动声和咳嗽,中间有人插话、有人抢话,两个人声音频率还特别接近。传统语音识别拿到这种素材,会给你什么?

  • 一段连续文本,没有标点断句,更分不清谁说哪句;
  • 句子级时间戳,可能整体偏移好几秒,逐字对齐基本别想;
  • 幻觉文本,安静的环境音里,模型能一本正经"脑补"出几句话。

也就是说,转录结果"看起来能用",真做字幕、做切片时处处掉链子。这就是我最初用 OpenAI Whisper 裸跑时的真实体验。而 whisperX 的定位很直接:同样的 Whisper 内核,补上它最缺的三块拼图——词级时间戳、说话人分离、批量加速

问题出在哪儿:转录有了,时间轴却对不上号

先别急着安装,花30秒理解一下痛点来源。Whisper 本身是优秀的语音识别(ASR)模型,但它输出的是"句子级"时间信息,句子内部每个词到底在哪一秒,它不负责。对字幕、配音、切金句这类需求来说,这恰恰是命门。

whisperX 的解决方案叫强制对齐(Forced Alignment):转录完成后,再用一个音素级模型(默认是 wav2vec2 系列)把"已经写好的文本"精确贴回音频波形上,一个词一个词地算出起止时间。打个比方,Whisper 是粗心的速记员,whisperX 是拿着录音逐句核对、把每句话钉在时间轴上的校对员。

它顺带解决的第二个问题,是说话人分离。原理不复杂:把整段音频按"声纹特征"切分成若干块,再给每一块贴标签——SPEAKER_00、SPEAKER_01……听起来像音色聚类。实际效果依赖 pyannote 提供的预训练模型,whisperX 负责把"谁在什么时候说话"和"哪句话对应谁"拼在一起。这块逻辑集中在 whisperx/diarize.py 里,assign_word_speakers用时间重叠度匹配说话人片段和文字片段,代码不长,思路却很干净。

它内部其实是一条"快递分拣线"

理解了原理,再看整个处理流程就顺了。whisperX 把一条音频从头到尾切成八个环节,像快递分拣一样各管一段:

图1:whisperX语音识别完整流水线——VAD先筛掉静音,Whisper负责粗转录,最后强制对齐把每个词钉在时间戳上

拆开看每个环节干的事:

环节一句话作用
Voice Activity Detection先扔掉静音和噪音,只留有人声的片段,顺带减少"脑补"幻觉
Cut & Merge + Batch把零散片段拼装成适合批量处理的长块,统一喂给模型
Whisper 转录主力模型出草稿文本,支持 faster-whisper 后端
Phoneme Model + 对齐音素级校正,逐词生成精确时间戳
说话人分离给每个片段和单词贴上 SPEAKER 标签

这个设计带来的一个直接收益是速度:因为可以批量推理,官方数据是 large-v2 模型跑出70 倍实时速度,也就是1小时音频,不到1分钟转完。全程显存占用也能压在8GB以内。

第一次跑通:十分钟拿到第一份带时间戳的字幕

动手环节。推荐 Python 3.10 + PyTorch 2.0 环境,装包只需要一行:

pip install whisperx

如果你更想直接改源码、看实现,也可以克隆仓库后用可编辑模式安装:

git clone https://gitcode.com/gh_mirrors/wh/whisperX cd whisperX pip install -e .

装好后,最基本的调用长这样:

whisperx meeting.wav --model medium

一条命令,默认输出srt / vtt / txt / json等文件。--model选识别精度:日常试水用smallmedium,追求质量上large-v2。第一次跑会自动下载模型权重,耐心等一会儿。

拿到手的 SRT 字幕,和裸 Whisper 最大的区别是每个词都有独立时间戳。想看得更直观,加一个参数:

whisperx meeting.wav --model medium --highlight_words True

生成的字幕会随播放逐词高亮,剪辑时对齐画面会轻松很多。如果你只有 CPU 没有 GPU,也别慌,追加--compute_type int8即可,代价是精度略降但能跑。

再进一步:让每一句话都"认领"一个说话人

现在进入正题——说话人分离。先做两件准备工作:

  1. 去 Hugging Face 申请一个只读 access token;
  2. 在页面上接受 pyannote 两个模型的用户协议(segmentation-3.0speaker-diarization-3.1),这是下载门槛。

然后运行:

whisperx meeting.wav --model large-v2 \ --diarize \ --hf_token hf_你的令牌 \ --min_speakers 2 --max_speakers 4

几个参数的意思一句话讲清:

  • --diarize:开启说话人分离,这是总开关;
  • --min_speakers / --max_speakers:告诉模型这场会议大概有几个人,减少它瞎猜的空间;
  • --hf_token:访问 pyannote 门控模型的凭证。

跑完后打开 JSON 输出,你会看到类似这样的结构:

{ "speaker": "SPEAKER_00", "start": 12.34, "end": 18.21, "text": "这个方案我觉得下周二之前可以定下来" }

每一句、甚至每一个词都带上了归属人。到这一步,之前那个"3小时会议录音"的问题就变成了纯文本处理:按说话人筛选、按时间切片、按关键词检索,全都是现成的 JSON 字段。

如果你更习惯用 Python 而不是命令行,项目也暴露了对应的 API,核心三步是转录、对齐、打标签:

import whisperx model = whisperx.load_model("large-v2", device="cuda") audio = whisperx.load_audio("meeting.wav") result = model.transcribe(audio, batch_size=16) model_a, metadata = whisperx.load_align_model(language_code=result["language"], device="cuda") result = whisperx.align(result["segments"], model_a, metadata, audio, device="cuda") diarize_model = whisperx.DiarizationPipeline(use_auth_token="hf_你的令牌", device="cuda") diarize_segments = diarize_model(audio, min_speakers=2, max_speakers=4) result = whisperx.assign_word_speakers(diarize_segments, result)

字幕文件到手之后,还能怎么用?

同一份输出,落在不同人手里就是不同的生产力工具:

  • 会议纪要自动化:转写完成后,把 SPEAKER_00 的发言全部抽出来,按时间排序,就是一份"某人发言清单";再用--output_format srt,txt一次导出多种格式,纪要底稿基本成型;
  • 播客二次创作:嘉宾金句不用再逐段试听。直接从 JSON 里筛"speaker": "SPEAKER_01"的片段,配合词级时间戳剪短视频切片,精确到词,效率翻几倍;
  • 课程字幕制作:讲师和提问学生的声音天然分成两组标签,字幕自动分行,后期手动微调量骤减;
  • 取证与检索:带时间戳的全文进检索系统,定位到秒级,回溯原音频不再是噩梦。

我实际测下来最省心的一点是:项目支持 10 种语言的默认对齐模型(en、fr、de、es、it、ja、zh、nl、uk、pt),传--language即可自动匹配,多语言会议不用手工换模型。

翻车急救箱:四个高频问题和对症下药

真实使用中你不会一帆风顺,下面是我踩过、也是社区反馈最多的四个坑:

问题1:说话人标签张冠李戴。两个人声线接近时,分离模型容易"串号"。对策是收紧人数范围,比如--min_speakers 2 --max_speakers 2,明确告诉模型就俩人;再不行就换large-v2提升特征精度;最后一步是预处理音频,去噪后再跑。

问题2:转写出来有幻觉文本。安静段落被"脑补"出句子。whisperX 默认关闭了condition_on_previous_text,本身就比裸 Whisper 抗幻觉;如果还有,检查 VAD 阈值参数--vad_onset--vad_offset,调高一点让模型更保守。

问题3:显存不够。优先降--batch_size 16 → 8 → 4;还不行就把--compute_typefloat16降到int8;最后才是换小模型。顺序别反,先动参数再动模型,精度损失最小。

问题4:数字、货币符号没有时间戳。这是项目已知限制——wav2vec2 的词典里没有 "2014."、"£13.60" 这类词。对策是给命令行加--suppress_numerals,或者在预处理阶段把数字改写为英文单词。

另外提醒一句:重叠说话(两个人同时开口)目前无论是 Whisper 还是 whisperX 都处理得一般,这是模型层面的共性难点,别指望一劳永逸。

最后留个问题给你

到这里,你已经知道了 whisperX 能做什么、怎么跑通、以及常见坑在哪里。剩下的问题其实很有意思:当"谁在什么时候说了什么"变成标准输出,你的下一个工作流会被简化到什么程度?是自动生成会议待办,是给播客做多级剪辑,还是给归档音频建一个秒级检索库?

工具已经就位,选择权在你手里。不妨从今天那段最让你头疼的录音开始,跑出第一份带说话人标签的时间戳文本,看看它和你想象中的差距有多少——然后告诉我,你的场景里,它最该先解决哪个问题?

【免费下载链接】whisperXWhisperX: Automatic Speech Recognition with Word-level Timestamps (& Diarization)项目地址: https://gitcode.com/gh_mirrors/wh/whisperX

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

返回列表