基于 Pyannote 与 FunASR 的说话人分割与语音转写Demo
·
概要
在语音处理场景(如会议纪要、访谈整理、客服对话分析)中,我们不仅需要将语音转写成文字,还要区分不同说话人。本文介绍了如何结合 Pyannote 的说话人分割模型和 FunASR 的语音识别模型,实现 自动说话人分割 + 中文语音识别 的完整流程。
整体架构流程
1、加载说话人分割模型(pyannote/speaker-diarization-3.1)
2、对音频进行说话人分割,得到每位说话人的发言时间段
3、调用 FunASR 模型转写为文字,并打上说话人标签
4、输出最终结果,得到带有时间戳和说话人标记的转写文本
技术细节
- 说话人分割(Pyannote)
使用 Hugging Face 上的 pyannote/speaker-diarization-3.1 模型
输入完整音频,输出包含 起始时间、结束时间、说话人ID 的片段列表
pipeline = Pipeline.from_pretrained(
"pyannote/speaker-diarization-3.1",
use_auth_token=HF_TOKEN
)
diarization = pipeline(FilePath)
-
语音识别(FunASR)
选择 Paraformer-zh 作为中文 ASR 模型
集成了 VAD(语音活动检测)和 Punctuation(标点预测)
直接支持流式推理
asr_model = AutoModel(
model="paraformer-zh",
model_revision="v2.0.4",
vad_model="fsmn-vad",
vad_model_revision="v2.0.4",
punc_model="ct-punc-c",
punc_model_revision="v2.0.4",
)
3,Demo完整代码
import os
import time
import io
import torch
from pyannote.audio import Pipeline
from funasr import AutoModel
from pydub import AudioSegment
# -----------------------------
# 1. pyannote 说话人分割
# -----------------------------
FilePath="filepath"
HF_TOKEN = "your_token" # Hugging Face token
begin = time.time()
pipeline = Pipeline.from_pretrained(
"pyannote/speaker-diarization-3.1",
use_auth_token=HF_TOKEN
)
pipeline.to(torch.device("cuda" if torch.cuda.is_available() else "cpu"))
diarization = pipeline(FilePath) # 输入你的音频路径
# -----------------------------
# 2. FunASR ASR 模型
# -----------------------------
asr_model = AutoModel(
model="paraformer-zh",
model_revision="v2.0.4",
vad_model="fsmn-vad",
vad_model_revision="v2.0.4",
punc_model="ct-punc-c",
punc_model_revision="v2.0.4",
)
# -----------------------------
# 3. 遍历说话人时间段,切音频并转写
# -----------------------------
audio = AudioSegment.from_wav(FilePath)
results = []
for idx, (turn, _, speaker) in enumerate(diarization.itertracks(yield_label=True)):
start_ms = int(turn.start * 1000)
end_ms = int(turn.end * 1000)
chunk_audio = audio[start_ms:end_ms]
转单声道 + 16kHz ---
chunk_audio = chunk_audio.set_channels(1).set_frame_rate(16000)
# 导出到内存
buf = io.BytesIO()
chunk_audio.export(buf, format="wav")
buf.seek(0)
# ASR 识别
res = asr_model.generate(input=buf, batch_size_s=300)
results.append({
"speaker": speaker,
"start": turn.start,
"end": turn.end,
"text": res
})
# -----------------------------
# 4. 打印最终结果
# -----------------------------
for r in results:
print(f"{r['speaker']} [{r['start']:.2f}-{r['end']:.2f}s]: {r['text']}")
运行结果
可以得到讲话人与讲话内容等信息
更多推荐


所有评论(0)