天门市网站建设_网站建设公司_Java_seo优化
2025/12/29 23:44:09 网站建设 项目流程

🤯 前言:为什么 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 格式的对话记录!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询