模型概述
模型特點
模型能力
使用案例
🚀 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


