模型简介
模型特点
模型能力
使用案例
🚀 Sortformer Diarizer 4spk v1
Sortformer Diarizer 4spk v1 是一款用于说话人分割的端到端神经模型。它基于新颖的目标函数进行训练,能有效解决说话人分割中的排列问题,在多个数据集上展现出良好的性能。
🚀 快速开始
若要使用 Sortformer 进行训练、微调或说话人分割,你需要安装 NVIDIA NeMo。建议在安装 Cython 和最新版本的 PyTorch 之后再安装它。
apt-get update && apt-get install -y libsndfile1 ffmpeg
pip install Cython packaging
pip install git+https://github.com/NVIDIA/NeMo.git@main#egg=nemo_toolkit[asr]
✨ 主要特性
- 新颖架构:Sortformer 是一种新颖的端到端神经模型,采用与现有端到端分割模型不同的目标进行训练。
- 解决排列问题:按照每个说话人语音片段的到达时间顺序解决分割中的排列问题。
- 多数据集训练:在多个真实对话数据集和模拟音频混合数据集上进行训练。
📦 安装指南
安装 NVIDIA NeMo
apt-get update && apt-get install -y libsndfile1 ffmpeg
pip install Cython packaging
pip install git+https://github.com/NVIDIA/NeMo.git@main#egg=nemo_toolkit[asr]
💻 使用示例
基础用法
from nemo.collections.asr.models import SortformerEncLabelModel
# 直接从 Hugging Face 模型卡加载模型(需要 Hugging Face 令牌)
diar_model = SortformerEncLabelModel.from_pretrained("nvidia/diar_sortformer_4spk-v1")
# 如果你有下载好的模型文件 "/path/to/diar_sortformer_4spk-v1.nemo",从下载文件加载模型
diar_model = SortformerEncLabelModel.restore_from(restore_path="/path/to/diar_sortformer_4spk-v1.nemo", map_location='cuda', strict=False)
# 切换到推理模式
diar_model.eval()
高级用法
输入格式
输入可以是单个音频文件:
audio_input="/path/to/multispeaker_audio1.wav"
或者是音频文件路径列表:
audio_input=["/path/to/multispeaker_audio1.wav", "/path/to/multispeaker_audio2.wav"]
或者是 jsonl 清单文件:
audio_input="/path/to/multispeaker_manifest.json"
其中,multispeaker_manifest.json
文件的每一行是一个包含以下字段的字典:
# `multispeaker_manifest.json` 文件中的一行示例
{
"audio_filepath": "/path/to/multispeaker_audio1.wav", # 输入音频文件的路径
"offset": 0, # 输入音频的偏移(开始)时间
"duration": 600, # 音频的持续时间,如果使用 NeMo 主分支,可以设置为 `null`
}
{
"audio_filepath": "/path/to/multispeaker_audio2.wav",
"offset": 900,
"duration": 580,
}
获取分割结果
要进行说话人分割并获取格式为 '开始时间(秒), 结束时间(秒), 说话人索引' 的说话人标记语音片段列表,只需使用:
predicted_segments = diar_model.diarize(audio=audio_input, batch_size=1)
要获取说话人活动概率张量,使用:
predicted_segments, predicted_probs = diar_model.diarize(audio=audio_input, batch_size=1, include_tensor_outputs=True)
📚 详细文档
模型架构
Sortformer 由一个 L 大小(18 层)的 NeMo 语音任务编码器(NEST)[2] 组成,该编码器基于 Fast-Conformer[3] 编码器。随后是一个隐藏大小为 192 的 18 层 Transformer[4] 编码器,以及在顶层为每个帧输入提供 4 个 sigmoid 输出的两个前馈层。更多信息可在 Sortformer 论文[1] 中找到。

输入输出说明
输入
该模型接受采样率为 16,000 Hz 的单声道音频。
- 实际输入张量是每个音频片段的 Ns x 1 矩阵,其中 Ns 是时间序列信号中的样本数。
- 例如,一个采样率为 16,000 Hz 的 10 秒音频片段(单声道 WAV 文件)将形成一个 160,000 x 1 的矩阵。
输出
模型的输出是一个 T x S 矩阵,其中:
- S 是最大说话人数(在该模型中,S = 4)。
- T 是总帧数,包括零填充。每一帧对应 0.08 秒的音频。
- T x S 矩阵的每个元素表示 [0, 1] 范围内的说话人活动概率。例如,矩阵元素 a(150, 2) = 0.95 表示在 [12.00, 12.08] 秒的时间范围内,第二个说话人有 95% 的活动概率。
训练和评估
训练
Sortformer 分割模型在 8 个节点的 8×NVIDIA Tesla V100 GPU 上进行训练。使用 90 秒长的训练样本,批次大小为 4。 可以使用这个 示例脚本 和 基础配置 来训练模型。
评估
要评估 Sortformer 分割器并将分割结果保存为 RTTM 格式,使用推理 示例脚本:
python ${NEMO_GIT_FOLDER}/examples/speaker_tasks/diarization/neural_diarizer/e2e_diarize_speech.py
model_path="/path/to/diar_sortformer_4spk-v1.nemo" \
manifest_filepath="/path/to/multispeaker_manifest_with_reference_rttms.json" \
collar=COLLAR \
out_rttm_dir="/path/to/output_rttms"
你可以从 post_processing
文件夹 提供后处理 YAML 配置,以重现每个开发数据集的优化后处理算法:
python ${NEMO_GIT_FOLDER}/examples/speaker_tasks/diarization/neural_diarizer/e2e_diarize_speech.py \
model_path="/path/to/diar_sortformer_4spk-v1.nemo" \
manifest_filepath="/path/to/multispeaker_manifest_with_reference_rttms.json" \
collar=COLLAR \
bypass_postprocessing=False \
postprocessing_yaml="/path/to/postprocessing_config.yaml" \
out_rttm_dir="/path/to/output_rttms"
数据集
Sortformer 在 2030 小时的真实对话和 5150 小时由 NeMo 语音数据模拟器[6] 生成的模拟音频混合数据上进行训练。 所有上述数据集都基于通过 RTTM 格式的相同标注方法。用于模型训练的 RTTM 文件子集是为说话人分割模型训练目的处理的。 各个数据集的数据收集方法各不相同。例如,上述数据集包括电话通话、访谈、网络视频和有声读物录音。有关详细的数据收集方法,请参考 语言数据联盟(LDC)网站 或数据集网页。
训练数据集(真实对话)
- Fisher English(LDC)
- 2004 - 2010 NIST 说话人识别评估(LDC)
- Librispeech
- AMI 会议语料库
- VoxConverse - v0.3
- ICSI
- AISHELL - 4
- 第三届 DIHARD 挑战赛开发集(LDC)
- 2000 NIST 说话人识别评估,split1(LDC)
训练数据集(用于模拟音频混合)
- 2004 - 2010 NIST 说话人识别评估(LDC)
- Librispeech
性能
评估数据集规格
属性 | DIHARD3 - Eval | CALLHOME - part2 | CALLHOME - part2 | CALLHOME - part2 | CH109 |
---|---|---|---|---|---|
说话人数 | ≤ 4 个说话人 | 2 个说话人 | 3 个说话人 | 4 个说话人 | 2 个说话人 |
边界(秒) | 0.0s | 0.25s | 0.25s | 0.25s | 0.25s |
平均音频时长(秒) | 453.0s | 73.0s | 135.7s | 329.8s | 552.9s |
分割错误率(DER)
- 所有评估都包括重叠语音。
- 加粗和斜体数字表示表现最佳的 Sortformer 评估。
- 后处理(PP)在两个不同的保留数据集分割上进行了优化。
属性 | DIHARD3 - Eval | CALLHOME - part2 | CALLHOME - part2 | CALLHOME - part2 | CH109 |
---|---|---|---|---|---|
DER diar_sortformer_4spk - v1 | 16.28 | 6.49 | 10.01 | 14.14 | 6.27 |
DER diar_sortformer_4spk - v1 + DH3 - dev Opt. PP | 14.76 | - | - | - | - |
DER diar_sortformer_4spk - v1 + CallHome - part1 Opt. PP | - | 5.85 | 8.46 | 12.59 | 6.86 |
实时因子(RTFx)
所有测试均在 RTX A6000 48GB 上以批次大小为 1 进行测量。RTFx 计算中不包括后处理。
属性 | DIHARD3 - Eval | CALLHOME - part2 | CALLHOME - part2 | CALLHOME - part2 | CH109 |
---|---|---|---|---|---|
RTFx diar_sortformer_4spk - v1 | 437 | 1053 | 915 | 545 | 415 |
NVIDIA Riva 部署
NVIDIA Riva 是一个可在本地、所有云、多云、混合云、边缘和嵌入式设备上部署的加速语音 AI SDK。此外,Riva 还提供:
- 针对最常见语言的开箱即用的世界级准确性,其模型检查点在专有数据上进行了数十万 GPU 计算小时的训练。
- 通过运行时单词增强(例如品牌和产品名称)以及对声学模型、语言模型和逆文本归一化的定制,实现一流的准确性。
- 流式语音识别、Kubernetes 兼容扩展和企业级支持。 虽然此模型目前尚未得到 Riva 的支持,但 支持的模型列表 在此处。查看 Riva 实时演示。
🔧 技术细节
技术限制
- 非流式模式:模型以非流式模式(离线模式)运行。
- 说话人数量限制:最多可检测 4 个说话人;在有 5 个或更多说话人的录音中,性能会下降。
- 音频时长限制:测试录音的最大时长取决于可用的 GPU 内存。对于 RTX A6000 48GB 模型,限制约为 12 分钟。
- 语言和数据限制:模型在公开可用的语音数据集上进行训练,主要是英语。因此,在非英语语音和域外数据(如嘈杂环境中的录音)上的性能可能会下降。
📄 许可证
使用此模型的许可证受 CC - BY - NC - 4.0 保护。通过下载模型的公开和发布版本,即表示你接受 CC - BY - NC - 4.0 许可证的条款和条件。
参考文献
[1] Sortformer: Seamless Integration of Speaker Diarization and ASR by Bridging Timestamps and Tokens [2] NEST: Self - supervised Fast Conformer as All - purpose Seasoning to Speech Processing Tasks [3] Fast Conformer with Linearly Scalable Attention for Efficient Speech Recognition [4] Attention is all you need [5] NVIDIA NeMo Framework [6] NeMo speech data simulator


