news 2026/4/16 16:46:43

会议纪要神器:OpenAI Whisper + Pyannote 实现“多人对话自动识别与分离

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
会议纪要神器:OpenAI Whisper + Pyannote 实现“多人对话自动识别与分离

🤯 前言:为什么 Whisper 还不够?

OpenAI 的 Whisper 模型在 ASR(自动语音识别)领域已经是天花板级别的存在,它能听懂极其模糊的口音和多国语言。
但是,Whisper 原生不支持 Speaker Diarization(说话人日记/分离)。它只能把音频变成文字,却无法告诉你这段文字是谁说的。

为了解决这个问题,我们需要引入Pyannote.audio。这是一个基于 PyTorch 的开源音频分析工具包,它的专长就是**“听声辨人”**。

我们要做的,就是把这两个模型“缝合”起来。


🏗️ 一、 架构设计:双管齐下

我们的系统处理流程如下:

  1. 音频输入:一段包含多个人说话的会议录音。
  2. 路径 A (Whisper):负责听内容,输出(开始时间, 结束时间, 文本)
  3. 路径 B (Pyannote):负责听声纹,输出(开始时间, 结束时间, 说话人ID)
  4. 对齐融合 (Alignment):根据时间戳,将两边的结果匹配起来。

系统流水线 (Mermaid):

声纹分割 (Pyannote)

内容识别 (Whisper)

1. 输入音频
2. 输出文本段
1. 输入音频
2. 输出时间轴
3. 时间戳匹配
3. 时间戳匹配
4. 最终结果

会议录音 (.wav/.mp3)

OpenAI Whisper 模型

Text Segments (Time + Text)

Pyannote.audio 模型

Speaker Timeline (Time + ID)

对齐算法 (Alignment)

[00:01] SPEAKER_00: 大家好\n[00:05] SPEAKER_01: 你好


🛠️ 二、 环境准备:Hugging Face 授权

注意:Pyannote 的模型是受保护的,你需要先申请权限。

  1. 注册 Hugging Face 账号。
  2. 访问 pyannote/speaker-diarization-3.1 并点击同意用户协议。
  3. 访问 pyannote/segmentation-3.0 同样点击同意。
  4. 在 Hugging Face 设置页创建一个Access Token (Read)

安装依赖:

# 安装 PyTorch (根据你的 CUDA 版本选择)pipinstalltorch torchvision torchaudio# 安装核心库pipinstallopenai-whisper pyannote.audio

💻 三、 代码实战:缝合手术

我们将编写一个 Python 脚本,自动完成上述流程。

1. 加载模型
importwhisperfrompyannote.audioimportPipelineimporttorch# 1. 配置 Hugging Face TokenHF_TOKEN="你的_HUGGING_FACE_TOKEN_写在这里"# 2. 加载 Whisper (负责转文字)# 推荐使用 'large-v3' 获得最佳中文效果,显存不够可用 'medium' 或 'small'print("正在加载 Whisper...")device="cuda"iftorch.cuda.is_available()else"cpu"asr_model=whisper.load_model("large-v3",device=device)# 3. 加载 Pyannote (负责分角色)print("正在加载 Pyannote...")diarization_pipeline=Pipeline.from_pretrained("pyannote/speaker-diarization-3.1",use_auth_token=HF_TOKEN).to(torch.device(device))print("✅ 模型加载完毕!")
2. 执行识别与分离
AUDIO_FILE="meeting_record.wav"# --- Step A: Whisper 转录 ---print("正在进行语音识别...")# word_timestamps=True 对于对齐非常重要asr_result=asr_model.transcribe(AUDIO_FILE,word_timestamps=True)print(f"识别完成,共{len(asr_result['segments'])}个片段")# --- Step B: Pyannote 声纹分割 ---print("正在进行说话人分析...")# 自动通过 hook 进行处理diarization_result=diarization_pipeline(AUDIO_FILE)print("声纹分割完成")# 打印一下 Pyannote 的原始结果看看# for turn, _, speaker in diarization_result.itertracks(yield_label=True):# print(f"start={turn.start:.1f}s stop={turn.end:.1f}s speaker_{speaker}")
3. 核心算法:时间戳对齐 (Alignment)

这是最难的一步。Whisper 给出的片段是基于“句子”的,而 Pyannote 给出的片段是基于“说话状态”的。两者的时间戳肯定对不上。
我们需要计算“Whisper 片段”与“Pyannote 片段”的时间重叠面积,谁重叠最多,这就话就是谁说的。

importpandasaspddefalign_results(whisper_segments,pyannote_diarization):final_output=[]# 遍历 Whisper 识别出的每一句话forseginwhisper_segments:start=seg['start']end=seg['end']text=seg['text']# 在 Pyannote 的结果中寻找这段时间内,谁说话最久# 利用 Pyannote 的 crop 功能截取这段时间speakers_in_segment=pyannote_diarization.crop_later_than(start).crop_earlier_than(end)# 统计每个 Speaker 的说话时长speaker_duration={}forturn,_,speakerinspeakers_in_segment.itertracks(yield_label=True):# 计算当前 turn 和 segment 的交集时长intersection_start=max(start,turn.start)intersection_end=min(end,turn.end)duration=max(0,intersection_end-intersection_start)ifduration>0:speaker_duration[speaker]=speaker_duration.get(speaker,0)+duration# 找出时长最长的 Speakerifspeaker_duration:best_speaker=max(speaker_duration,key=speaker_duration.get)else:best_speaker="Unknown"final_output.append({"start":start,"end":end,"speaker":best_speaker,"text":text})returnfinal_output# --- 执行对齐 ---results=align_results(asr_result['segments'],diarization_result)# --- 打印最终漂亮的会议纪要 ---print("\n📝 会议纪要生成中...\n")forlineinresults:# 格式化时间 00:00m_start,s_start=divmod(line['start'],60)time_str=f"[{int(m_start):02d}:{int(s_start):02d}]"print(f"{time_str}{line['speaker']}:{line['text']}")

🚀 四、 进阶优化:让它更像商业软件

上述代码只是 MVP(最小可行性产品)。要真的好用,还要解决以下问题:

1. 显存爆炸怎么办?
  • Whisperlarge-v3需要约 10GB 显存。
  • 优化:使用WhisperXFaster-Whisper库。它们采用了 CTranslate2 和 INT8 量化,显存占用减半,速度快 5 倍,且 WhisperX 内置了更精准的强行对齐(Forced Alignment)功能。
2. 说话人总是变来变去?
  • Pyannote 可能会把同一个人在不同时间段识别成SPEAKER_01SPEAKER_05
  • 优化:在pipeline中设置num_speakers参数(如果你知道有几个人参会),或者提取声纹 Embedding 进行聚类合并。
3. 实时处理?
  • Whisper 和 Pyannote 都是处理静态文件的。如果要做实时直播字幕,需要使用流式处理 (Streaming)架构,这需要引入 VAD (语音活动检测) 切片,难度指数级上升。

🎯 总结

通过不到 100 行代码,我们省去了购买“讯飞听见”或“Otter.ai”会员的钱。
更重要的是,这是完全私有化部署的。对于保密级别高的公司会议,数据不出本地,安全感拉满。

Next Step:
尝试将这段脚本封装成一个 Streamlit Web 界面,让你的同事只需要上传 MP3,就能下载 Excel 格式的对话记录!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 2:27:56

github token权限设置:用于自动化拉取PyTorch-CUDA-v2.8镜像

GitHub Token 权限设置:用于自动化拉取 PyTorch-CUDA-v2.8 镜像 在现代 AI 工程实践中,一个常见的挑战是:如何让 CI/CD 流水线在无人值守的情况下,安全地从私有仓库拉取代码,并基于这些代码构建包含 PyTorch 和 CUDA 的…

作者头像 李华
网站建设 2026/4/15 22:26:50

无需手动安装!PyTorch-CUDA-v2.8镜像让GPU训练开箱即用

无需手动安装!PyTorch-CUDA-v2.8镜像让GPU训练开箱即用 在深度学习项目中,最让人头疼的往往不是模型调参,而是环境配置。你有没有经历过这样的场景:刚拿到一块A100显卡,满心欢喜地准备跑实验,结果花了整整…

作者头像 李华
网站建设 2026/4/15 14:46:01

github project管理PyTorch-CUDA-v2.8开发进度

PyTorch-CUDA-v2.8 开发环境的工程实践与深度解析 在当前AI研发节奏日益加快的背景下,一个稳定、可复现且开箱即用的开发环境,往往比模型本身更能决定项目的成败。尤其是在多团队协作、远程部署或云原生场景下,“在我机器上能跑”这种经典问题…

作者头像 李华
网站建设 2026/4/16 7:25:22

亲测有效!AI率92%暴降至5%!实测10款降AI工具!免费降AIGC额度薅到爽!【2025年12月最新版】

2025年各大高校陆续引入AI检测系统,知网AIGC、维普AI、万方智能检测三大平台形成围剿之势。更狠的是,这些系统每个月都在更新算法——上个月能过的文章,这个月可能就亮红灯了。单纯的同义词替换、语序调整已经完全失效,降低ai率需…

作者头像 李华
网站建设 2026/4/16 7:25:25

【课程设计/毕业设计】基于SpringBoot的在线骑行网站的设计与实现.基于springboot的骑行交流论坛的设计与开发【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华