Speaker Diarization Pyannote Nvidia Nemo ASR Machine Learning

说话人分离性能评估:Pyannote.audio vs Nvidia NeMo 及 GPT-4 后处理

Taishin Maeda - Waseda University 3 分钟阅读
说话人分离性能评估:Pyannote.audio vs Nvidia NeMo 及 GPT-4 后处理

通过 DER 分析和实时应用开发,对说话人分离框架进行比较评估。验证 Pyannote.audio 与 Nvidia NeMo 之间的性能差异。

摘要

本文评估并比较了两个先进的开源说话人分离框架:Pyannote.audioNvidia NeMo。评估重点关注不同音频场景下的 Diarization Error Rate(DER)、执行时间和 GPU 资源使用情况。此外,还探索了使用 OpenAI GPT-4-Turbo 进行后处理以提高分离准确率的方法。

主要结果:

  • Nvidia NeMo 在 2 人说话人场景中 DER 低约 9%
  • Pyannote.audio 在多说话人(9人以上)场景中表现更优
  • GPT-4-Turbo 后处理展现出潜力,但需要集成音频上下文
  • 展示了实时说话人分离 Web 应用

1. 引言

什么是说话人分离?

说话人分离是根据不同的说话人对音频进行分段和标注的过程,回答"谁在什么时候说了什么"这一问题。它与自动语音识别(ASR)结合使用,是对话分析的关键工具。

说话人分离流程

说话人分离系统由以下部分组成:

  1. 语音活动检测(VAD) - 识别语音出现的时间戳
  2. 音频嵌入模型 - 从带时间戳的片段中提取嵌入向量
  3. 聚类 - 对嵌入向量进行分组以估计说话人数量

Pyannote.audio

Pyannote.audio 是基于 PyTorch 的开源 Python 工具包,用于说话人分离和说话人嵌入。

Nvidia NeMo

Nvidia NeMo 采用了不同的方法,使用多尺度分割和 Neural Diarizer(MSDD 模型)来处理说话人重叠语音。

Nvidia NeMo 说话人分离流程

多尺度分割

NeMo 解决了说话人识别质量与时间粒度之间的权衡问题:

  • 较长片段 → 说话人表征质量更高,但时间分辨率较低
  • 较短片段 → 说话人表征质量较低,但时间分辨率较高

多尺度分割

框架对比

组件Pyannote.audioNvidia NeMo
VADPyannote from SyncNetMultilingual MarbleNet
说话人嵌入ECAPA-TDNNTitanet Large
聚类Hidden Markov ModelMulti-scale Clustering (MSDD)

2. 评估方法

Diarization Error Rate(DER)

说话人分离的标准评估指标,由 NIST 于 2000 年提出:

DER = (False Alarm + Missed Detection + Confusion) / Total

各项含义:

  • False Alarm:没有说话人时却检测到了语音
  • Missed Detection:有说话人时却未检测到语音
  • Confusion:语音被分配给了错误的说话人

注意: DER 越接近 0,表示错误越少。

RTTM 文件格式

Rich Transcription Time Marked(RTTM)是说话人分离输出的标准格式:

SPEAKER obama_zach(5min).wav 1 66.32 0.27 <NA> <NA> SPEAKER_01 <NA> <NA>

关键字段:片段起始时间(66.32)、持续时间(0.27)、说话人标签(SPEAKER_01)

3. 实验设置

数据集

  1. 5 分钟音频 - 2 位说话人(Obama-Zach 访谈),使用 Audacity 手动标注
  2. 9 分钟音频 - VoxConverse 数据集中的 9 位说话人,附带专业标注的标准答案

硬件

  • GPU:Nvidia GeForce RTX 3090
  • 使用 Python 的 time 模块进行计时

Pyannote.audio 代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
from pyannote.audio import Pipeline
import torch

pipeline = Pipeline.from_pretrained(
    "pyannote/speaker-diarization-3.1",
    use_auth_token="your_auth_token"
)
if torch.cuda.is_available():
    pipeline.to(torch.device("cuda"))

def diarization(audio_path):
    diarization = pipeline(audio_path)
    rttm = "SPEAKER {file} 1 {start:.2f} {duration:.2f} <NA> <NA> {speaker} <NA> <NA>"
    return [
        rttm.format(file=audio_path, start=turn.start,
                   duration=turn.duration, speaker=speaker)
        for turn, _, speaker in diarization.itertracks(yield_label=True)
    ]

Nvidia NeMo 代码

1
2
3
4
5
6
7
8
9
from nemo.collections.asr.models import NeuralDiarizer
from omegaconf import OmegaConf

config = OmegaConf.load('diar_infer_telephonic.yaml')
config.diarizer.msdd_model.model_path = 'diar_msdd_telephonic'
config.diarizer.msdd_model.parameters.sigmoid_threshold = [0.7, 1.0]

msdd_model = NeuralDiarizer(cfg=config)
diarization_result = msdd_model.diarize()

4. 结果与讨论

DER 结果 - 2 位说话人(5 分钟)

框架DER
Pyannote.audio0.252
Pyannote.audio(预先识别说话人)0.214
Nvidia NeMo0.161
Nvidia NeMo(预先识别说话人)0.161

要点: 在 2 人说话人场景中,Nvidia NeMo 比 Pyannote.audio 的 DER 低约 9%。

DER 结果 - 9 位说话人(9 分钟)

框架DER
Pyannote.audio0.083
Pyannote.audio(预先识别说话人)0.098
Nvidia NeMo(预先识别说话人)0.097

在多说话人场景中,Pyannote.audio 比 Nvidia NeMo 的 DER 低约 1.4%。

GPT-4 后处理结果

框架GPT-4-Turbo DERGPT-3.5 DER
Pyannote(5分钟, 2人)0.4270.494
Nemo(5分钟, 2人)0.1790.544
Pyannote(9分钟, 9人)0.1030.214
Nemo(9分钟, 9人)0.1280.179

注意: GPT-4 后处理的 DER 偏高,原因是它无法直接访问音频数据。提供说话人时间信息和音频上下文有望改善结果。

执行时间对比

框架5分钟音频9分钟音频
Pyannote.audio31.3秒44.5秒
Pyannote(预先识别说话人)29.8秒41.5秒
Nvidia NeMo63.9秒-
Nemo(预先识别说话人)49.9秒108.2秒

Nvidia NeMo 的执行时间约为 Pyannote.audio 的 2 倍。

Pyannote.audio GPU 使用率

Nvidia NeMo GPU 使用率

5. 实时应用

我们使用以下技术开发了实时说话人分离 Web 应用:

  • WebSockets 实现音频流传输
  • FastAPI 作为后端框架
  • Pyannote.audio 进行说话人分离

关键实现细节

为了提升实时性能,使用 3 秒音频块替代 30 秒音频块:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class PyannoteService:
    def __init__(self):
        self.pipeline = Pipeline.from_pretrained(
            "pyannote/speaker-diarization-3.1",
            use_auth_token=config.hugging_face.token,
        )
        self.pipeline.to(torch.device("cuda"))

        self.embedding_model = Model.from_pretrained(
            "pyannote/embedding",
            use_auth_token=config.hugging_face.token
        )
        self.embedding_inference = Inference(
            self.embedding_model, window="whole"
        )

结果对比

分块逻辑修改前

分块逻辑修改后

改进后的分块逻辑显著减少了时间误差,说话人切换也更加流畅。

6. 总结

主要发现

  1. Nvidia NeMo 在短音频、少说话人场景中表现更优(DER: 0.161 vs 0.252)
  2. Pyannote.audio 在说话人数量较多或预先识别说话人的情况下表现更好
  3. GPT-4 后处理展现出潜力,但需要集成音频上下文
  4. 执行时间:Pyannote.audio 约快 2 倍
  5. 实时应用:改进的分块逻辑提升了准确率

未来工作

  1. 针对非电话场景调整 Nvidia NeMo 模型
  2. 将音频上下文集成到 GPT 后处理中
  3. 优化实时应用的说话人识别阈值
  4. 探索面向说话人分离任务的领域专用 LLM

7. 参考文献

  1. NIST Rich Transcription Evaluation (2022)
  2. Nvidia NeMo Documentation - Speaker Diarization
  3. Pyannote.audio GitHub Repository
  4. OpenAI GPT-4 Turbo Documentation
  5. VoxConverse Speaker Diarization Dataset

致谢

  • Akinori Nakajima - VoicePing Corporation 代表董事
  • Melnikov Ivan - VoicePing Corporation AI 开发者
分享这篇文章

免费试用 VoicePing

借助 AI 翻译跨越语言障碍。立即开始使用免费计划。

免费开始