news 2026/2/16 15:38:30

会议纪要神器: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/2/14 9:21:43

PyTorch-CUDA-v2.8镜像支持A100/H100吗?高性能显卡实测反馈

PyTorch-CUDA-v2.8镜像支持A100/H100吗?高性能显卡实测反馈 在当前大模型训练如火如荼的背景下,越来越多团队开始部署 A100 和 H100 这类高端 GPU。然而,一个常被忽视的问题是:我们常用的深度学习容器镜像——比如 PyTorch-CUDA-v…

作者头像 李华
网站建设 2026/2/15 3:29:52

github仓库模板:基于PyTorch-CUDA-v2.8的标准AI项目结构

基于 PyTorch-CUDA-v2.8 的标准 AI 项目结构:构建高效、可复现的深度学习开发环境 在当今深度学习项目日益复杂的背景下,一个稳定、统一且开箱即用的开发环境已成为团队协作与快速迭代的关键。无论是在高校实验室中验证新模型,还是在企业中部…

作者头像 李华
网站建设 2026/2/13 8:54:49

ssh连接超时自动重连:Python脚本维护PyTorch-CUDA-v2.8会话

SSH连接超时自动重连:Python脚本维护PyTorch-CUDA-v2.8会话 在深度学习项目中,远程GPU服务器是训练大型模型的“算力心脏”。然而,一个令人沮丧的现实是——当你深夜提交了一个长达48小时的PyTorch训练任务后,第二天早上却发现SS…

作者头像 李华
网站建设 2026/2/11 20:52:34

2025 MBA必备!9个AI论文平台测评,开题报告全攻略

2025 MBA必备!9个AI论文平台测评,开题报告全攻略 2025年MBA论文写作工具测评:精准匹配学术需求 在MBA学习过程中,撰写高质量的论文是每位学生必须面对的挑战。从选题构思到开题报告,再到最终成稿,每一步都离…

作者头像 李华
网站建设 2026/2/16 21:10:12

jupyter notebook主题美化:提升PyTorch-CUDA-v2.8编码体验

Jupyter Notebook 主题美化:提升 PyTorch-CUDA-v2.8 编码体验 在深度学习开发中,一个高效的编码环境不仅依赖强大的计算能力,更离不开舒适的人机交互体验。尤其当我们在 GPU 服务器上运行 PyTorch-CUDA-v2.8 镜像进行模型训练时,长…

作者头像 李华
网站建设 2026/2/12 4:39:02

jupyter notebook导出PDF:生成PyTorch-CUDA-v2.8实验报告

Jupyter Notebook 导出 PDF:生成 PyTorch-CUDA-v2.8 实验报告 在深度学习项目中,一个常见的挑战是:如何让实验过程既高效可复现,又能清晰地呈现给团队成员或评审者?我们经常遇到这样的情况——代码跑通了,结…

作者头像 李华