概要

在语音处理场景(如会议纪要、访谈整理、客服对话分析)中,我们不仅需要将语音转写成文字,还要区分不同说话人。本文介绍了如何结合 Pyannote 的说话人分割模型和 FunASR 的语音识别模型,实现 自动说话人分割 + 中文语音识别 的完整流程。

整体架构流程

1、加载说话人分割模型(pyannote/speaker-diarization-3.1)

2、对音频进行说话人分割,得到每位说话人的发言时间段

3、调用 FunASR 模型转写为文字,并打上说话人标签

4、输出最终结果,得到带有时间戳和说话人标记的转写文本

技术细节

  1. 说话人分割(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)

  1. 语音识别(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']}")

运行结果

在这里插入图片描述可以得到讲话人与讲话内容等信息

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐