實戰(zhàn):基于 AMI 語料庫的 ECAPA-TDNN + 譜聚類方案(sd0 示例全解析))
人工智能語音音頻NLP媒體生成【免費下載鏈接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.項目地址https://gitcode.com/paddlepaddle/PaddleSpeech點擊查看免費下載本文是 PaddleSpeech 開源語音工具包中examples/ami示例的完整技術(shù)指南圍繞 AMI 會議語料庫上的說話人日志Speaker Diarization任務(wù)展開以預(yù)訓(xùn)練 ECAPA-TDNN x-vector 提取說話人嵌入再通過 AHC / 譜聚類Spectral Clustering完成誰在何時說話的自動標(biāo)注并以 Diarization Error RateDER作為統(tǒng)一評測指標(biāo)。讀完本文你將掌握從 AMI 數(shù)據(jù)下載、標(biāo)注解析、子段切分、嵌入提取、聚類后端選擇到 DER 評測的完整流水線并能直接復(fù)現(xiàn)該示例在 HeadsetMix 錄音下的最優(yōu)結(jié)果。一、任務(wù)與數(shù)據(jù)集背景1.1 說話人日志任務(wù)是什么說話人日志Speaker Diarization要解決的核心問題是給定一段包含多人對話的錄音自動回答誰在什么時間段說話。它與說話人識別Speaker Verification不同——后者假設(shè)說話人已知前者需要在不知道說話人身份的情況下把音頻按說話人切分成不同片段并歸簇。該任務(wù)廣泛應(yīng)用于會議紀(jì)要、客服質(zhì)檢、影視字幕、語音檢索等場景。在 PaddleSpeech 中該任務(wù)由examples/ami/sd0示例完整承載。主 READMEexamples/ami/README.md對其定位只有一句話sd0 - speaker diarization by AHC, SC base on embeddings即基于嵌入向量embeddings的說話人日志聚類后端支持 AHC凝聚層次聚類與 SC譜聚類兩種方案。1.2 AMI 會議語料庫簡介AMIAugmented Multi-party Interaction會議語料庫由愛丁堡大學(xué)等機構(gòu)采集是說話人日志領(lǐng)域最經(jīng)典的評測基準(zhǔn)之一。官方對其的描述是包含100 小時的會議錄音錄音使用多種信號源并同步到統(tǒng)一時間軸包括近講麥克風(fēng)close-talking與遠(yuǎn)場麥克風(fēng)far-field、單人與全景攝像機、幻燈片投影儀與電子白板的輸出會議期間與會者還使用未同步的筆記錄書寫內(nèi)容會議用英語錄制分別在聲學(xué)特性不同的三個房間完成參與者大多為非英語母語者。在本示例中僅使用其中一種麥克風(fēng)信號Headset mix頭戴式麥克風(fēng)混音。全部數(shù)據(jù)下載約需要10GB磁盤空間。說明本文以下內(nèi)容均基于 PaddleSpeech 倉庫中examples/ami/sd0目錄下的實際腳本與配置文件展開讀者可按 examples/ami/sd0/README.md 中的說明逐步復(fù)現(xiàn)。二、整體架構(gòu)一條從音頻到 DER 的完整流水線從腳本結(jié)構(gòu)與源碼調(diào)用鏈看sd0示例的說話人日志流水線可劃分為四個階段AMI 原始數(shù)據(jù) 人工標(biāo)注(XML) │ ▼ [階段0] 數(shù)據(jù)準(zhǔn)備 ami_prepare.py │ 解析 segments/*.xml → 參考 RTTM │ 合并/切分 → 子段 JSON 元數(shù)據(jù) ▼ [階段1] 嵌入提取 compute_embdding.py │ ECAPA-TDNN 前向 → 每個子段 192 維 x-vector │ 按錄音保存為 *.emb_stat.pkl ▼ [階段2] 聚類 超參調(diào)優(yōu) experiment.py │ dev 集調(diào) p-value / 閾值 / n_neighbors │ 用最優(yōu)超參在 dev eval 上聚類 → 系統(tǒng) RTTM ▼ [階段3] DER 評測 utils/DER.py 參考 RTTM vs 系統(tǒng) RTTM → DER入口腳本 run.sh 只做兩件事下載預(yù)訓(xùn)練模型stage 1、調(diào)用local/process.shstage 2執(zhí)行完整的處理與評測流程。三個 Python 腳本分別對應(yīng)階段 0~2。三、數(shù)據(jù)準(zhǔn)備從 AMI 官網(wǎng)到本地目錄3.1 下載標(biāo)注文件與音頻信號按照 examples/ami/sd0/README.md 的說明需要準(zhǔn)備兩份數(shù)據(jù)1人工標(biāo)注Annotations包含會議的分段segmentsXML 標(biāo)注用于生成參考 RTTMOracle 標(biāo)注。下載命令## download annotations wget http://groups.inf.ed.ac.uk/ami/AMICorpusAnnotations/ami_public_manual_1.6.2.zip unzip ami_public_manual_1.6.2.zip解壓后得到ami_public_manual_1.6.2目錄其中segments/下每個錄音對應(yīng)若干*.segments.xml文件每個說話人一個。2音頻信號Signals需要按 AMI 官網(wǎng)下載指引使用 chooser 逐項選擇選擇一個或多個 AMI 會議會議 ID 請參照 local/ami_splits.py 中定義的 dev/eval 會議集合媒體流只需選擇Headset mix。3.2 目錄約定與一鍵啟動準(zhǔn)備好數(shù)據(jù)后直接運行./run.sh --data_folder ./amicorpus --manual_annot_folder ./ami_public_manual_1.6.2其中./amicorpus為音頻數(shù)據(jù)根目錄amicorpus/下按會議 ID 組織如ES2002/audio/ES2002.Mix-Headset.wav./ami_public_manual_1.6.2為標(biāo)注根目錄。也可直接修改 run.sh 頂部的默認(rèn)變量TARGET_DIR/home/dataset/AMI data_folder${TARGET_DIR}/amicorpus manual_annot_folder${TARGET_DIR}/ami_public_manual_1.6.2 save_folder./save pretraind_model_dir${save_folder}/sv0_ecapa_tdnn_voxceleb12_ckpt_0_1_1/model conf_pathconf/ecapa_tdnn.yaml devicegpu3.3 分兩個 stage 執(zhí)行run.sh 通過--stage控制執(zhí)行粒度默認(rèn)從 stage 0 開始stage 1下載并解壓預(yù)訓(xùn)練說話人嵌入模型sv0_ecapa_tdnn_voxceleb12_ckpt_0_1_1.tar.gz到save/目錄stage 2調(diào)用bash ./local/process.sh data_folder manual_annot_folder save_folder pretraind_model_dir conf_path device依次執(zhí)行數(shù)據(jù)準(zhǔn)備、嵌入提取與聚類評測。path.sh 負(fù)責(zé)初始化環(huán)境將倉庫根目錄MAIN_ROOT及utils加入PATH設(shè)置PYTHONPATH、LC_ALLC與 UTF-8 編碼保證腳本在各環(huán)境下可復(fù)現(xiàn)。四、階段 0數(shù)據(jù)準(zhǔn)備源碼剖析ami_prepare.pylocal/ami_prepare.py 完成兩件事生成參考 RTTM、生成子段sub-segmentJSON 元數(shù)據(jù)。4.1 從 XML 標(biāo)注生成參考 RTTMRTTMRich Transcription Time Markup是說話人日志的標(biāo)準(zhǔn)標(biāo)注格式每行形如SPEAKER ES2008c 0 37.880 0.590 NA NA ES2008c.A_PM NA NA SPKR-INFO ES2008c 0 NA NA NA unknown ES2008c.A_PM NA NASPEAKER行記錄說話區(qū)間錄音 ID、起始時間、時長、說話人 IDSPKR-INFO行記錄錄音中出現(xiàn)的說話人列表供 Oracle 說話人數(shù)統(tǒng)計使用。prepare_segs_for_RTTM遍歷segments/rec_id.*.segments.xml解析 XML 中每個segment元素的transcriber_start/transcriber_end屬性結(jié)合說話人字母A/B/C…拼出rec_id.speaker形式的說話人 ID按開始時間排序后由get_RTTM_per_rec寫出。該函數(shù)還會過濾掉transcriber_start transcriber_end的錯誤標(biāo)注行。最終每個 split 生成一個匯總參考文件例如fullref_ami_dev.rttm。4.2 段合并與子段切分說話人日志需要以固定粒度的子段為單位提取嵌入因此prepare_metadata對每個錄音的說話區(qū)間做兩步處理merge_rttm_intervals把時間上重疊的相鄰說話區(qū)間合并為一個區(qū)間重疊部分標(biāo)記為overlapget_subsegments將時長大于max_subseg_dur默認(rèn) 3.0 秒的長段按shift max_subseg_dur - overlap默認(rèn) 1.5 秒重疊滑動切分為約 3 秒的子段不足 3 秒的段保持原樣。每個子段被記錄為rec_id_start_end形式的子段 ID并計算起止采樣點SAMPLERATE 16000寫入 JSON{ ES2008c_37.88_38.42: { wav: { file: /path/to/amicorpus/ES2008c/audio/ES2008c.Mix-Headset.wav, duration: 0.54, start: 606080, stop: 614720 } } }注當(dāng)mic_type為Array18 麥陣列時JSON 中改用files鍵存放 8 個通道的文件路徑列表。最終輸出三份 JSONami_train.Mix-Headset.subsegs.json、ami_dev.Mix-Headset.subsegs.json、ami_eval.Mix-Headset.subsegs.json。skip()函數(shù)通過檢查三個 JSON 與選項文件opt_ami_prepare.mic.pkl是否已存在且一致實現(xiàn)階段跳過的冪等性。4.3 數(shù)據(jù)集劃分ami_splits.pylocal/ami_splits.py 提供三種官方劃分配置項split_type決定使用哪種split_type含義會議數(shù)train/dev/testscenario_only僅場景化會議ES/IS/TS25 / 5 / 5full_corpus全部會議41 / 11 / 6full_corpus_asr默認(rèn)與 ASR 一致的全量劃分dev 中剔除與 train 說話人重疊的會議45 / 9 / 4同時skip_TNOTrue會跳過 TNOTS 開頭會議——它們屬于非場景化錄制說話人數(shù)量波動更大3~5 人。五、階段 1ECAPA-TDNN 嵌入提取compute_embdding.pylocal/compute_embdding.py 負(fù)責(zé)為 dev / eval 每個錄音的每個子段提取 192 維說話人嵌入。5.1 模型加載與推理代碼調(diào)用鏈如下通過paddle.set_device(args.device)設(shè)置 GPU/CPU構(gòu)建 ECAPA-TDNN 骨干網(wǎng)絡(luò)EcapaTdnn(**config.model)定義在 paddlespeech/vector/models/ecapa_tdnn.py用SpeakerIdetification包裝成說話人識別模型加載預(yù)訓(xùn)練權(quán)重paddle.load(os.path.join(args.load_checkpoint, model.pdparams))后model.set_state_dict(state_dict)model.eval()進入推理模式前向model.backbone(feats, lengths)得到(N, emb_size)的嵌入。5.2 逐錄音提取與保存對每個錄音從全量 JSON 中切出該錄音的子集元數(shù)據(jù)prepare_subset_json用JSONDataset加載 mel 頻譜特征80 維 fbank、25ms 窗、10ms 幀移DataLoader按batch_size16批量推理collate 時做均值歸一化batch_feature_normalizemean_normTrue, std_normFalse將嵌入與子段 ID 組裝成EmbeddingMetasegsetstats對象序列化為rec_id.Mix-Headset.emb_stat.pkl若該文件已存在則跳過冪等。嵌入文件路徑約定為save_folder/emb/AMI_dev|eval/rec_id.Mix-Headset.emb_stat.pkl與配置中的embedding_dir: emb對應(yīng)。六、配置文件全解ecapa_tdnn.yamlconf/ecapa_tdnn.yaml 是本次實驗唯一的配置文件yacs CfgNode 解析按功能分為五個區(qū)塊逐項說明如下。6.1 數(shù)據(jù)準(zhǔn)備設(shè)置配置項默認(rèn)值說明split_typefull_corpus_asr數(shù)據(jù)集劃分方式可選scenario_only/full_corpus/full_corpus_asrskip_TNOTrue是否跳過 TNO 會議mic_typeMix-Headset麥克風(fēng)類型可選Mix-Lapel、Mix-Headset、Array1、Array1-01、BeamformItvad_typeoracleVAD 類型當(dāng)前僅使用標(biāo)注的 Oracle VAD為后續(xù) VAD 預(yù)留max_subseg_dur3.0子段最大時長秒overlap1.5相鄰子段重疊時長秒embedding_diremb嵌入保存目錄相對save_foldermeta_data_dirmetadataJSON 元數(shù)據(jù)目錄ref_rttm_dirref_rttms參考 RTTM 目錄sys_rttm_dirsys_rttms系統(tǒng)輸出 RTTM 目錄der_dirDERDER 結(jié)果目錄6.2 特征提取設(shè)置sr: 16000 # 采樣率 n_mels: 80 # mel 濾波器個數(shù) window_size: 400 # 25ms25 * 16000 / 1000 400 hop_size: 160 # 10ms10 * 16000 / 1000 160注釋明確說明當(dāng)前僅支持 fbank 特征left_frames、right_frames、deltas等項被注釋掉為后續(xù)擴展預(yù)留。6.3 模型設(shè)置seed: 1234 emb_dim: 192 # 輸出嵌入維度 batch_size: 16 model: input_size: 80 channels: [1024, 1024, 1024, 1024, 3072] kernel_sizes: [5, 3, 3, 3, 1] dilations: [1, 2, 3, 4, 1] attention_channels: 128 lin_neurons: 192這些參數(shù)直接對應(yīng)EcapaTdnn構(gòu)造函數(shù)的字段channels為各層卷積通道數(shù)四層 SE-Res2Block 加一層 bottleneckkernel_sizes與dilations為各層卷積核尺寸與空洞率attention_channels為 SE 注意力模塊的中間通道數(shù)lin_neurons為最終線性層輸出維度emb_dim。配置文件會自動下載 ECAPA-TDNN 預(yù)訓(xùn)練模型best即run.shstage 1 中下載的sv0_ecapa_tdnn_voxceleb12_ckpt_0_1_1基于 VoxCeleb1/2 訓(xùn)練。6.4 譜聚類設(shè)置backend: SC # 可選 SC / AHC / kmeans affinity: cos # 相似度矩陣類型可選 cos / nn max_num_spkrs: 10 # 每段錄音最大說話人數(shù) oracle_n_spkrs: True # 是否使用標(biāo)注中的真實說話人數(shù)關(guān)鍵約束配置注釋中已說明kmeans后端只能配合cosaffinity 使用oracle_n_spkrsTrue時說話人數(shù)來自參考 RTTM 的SPKR-INFO行否則需要估計。6.5 DER 評測設(shè)置ignore_overlap: True # 評測時是否忽略重疊說話區(qū)間 forgiveness_collar: 0.25 # 容忍誤差collar單位秒這兩項與 utils/DER.py 的評測邏輯直接對應(yīng)。七、階段 2聚類與超參調(diào)優(yōu)experiment.py diarization.py7.1 在 dev 集上調(diào)優(yōu)超參local/experiment.py 遵循dev 集調(diào)參、dev/eval 雙集評測的標(biāo)準(zhǔn)實驗范式按后端/相似度類型選擇不同的調(diào)優(yōu)策略組合調(diào)優(yōu)對象搜索范圍cosaffinity SC/kmeansp-value保留每行前 p% 的相似度值np.arange(0.002, 0.015, 0.001)AHC后端距離閾值p_val 即閾值np.arange(0.0, 1.0, 0.1)nnaffinityn_neighbors 近鄰數(shù)range(5, 15)固定 oracle 說話人數(shù)調(diào)優(yōu)邏輯dev_pval_tuner等對每個候選值在完整 dev 集上跑一遍聚類 → 生成系統(tǒng) RTTM → 調(diào)用DER()計算 DER → 取 DER 最小的候選值。對kmeans oracle 說話人數(shù)場景p-value 搜索會提前終止break因為 kmeans 不需要剪枝。7.2 最終聚類與評測得到最優(yōu)超參后對 dev 和 eval 分別執(zhí)行diarize_dataset按oracle_n_spkrs決定說話人數(shù)來源True時通過get_oracle_num_spkrs從SPKR-INFO讀取False且cosaffinity 時置None由譜聚類用**最大特征間隙max eigen gap**自動估計說話人數(shù)依據(jù)backend分發(fā)到 paddlespeech/vector/cluster/diarization.py 中的聚類函數(shù)逐錄音生成sys_rttms/mic/AMI_split/tag/rec_id.rttm并拼接為sys_output.rttm用DER()計算總體 DER并調(diào)用write_ders_file把逐錄音 DER 寫入DER/split_DER_tag文件。7.3 三個聚類后端的實現(xiàn)細(xì)節(jié)從diarization.py源碼看譜聚類 SCcos affinitydo_spec_clustering使用SpecClustUnormmin_num_spkrs2、max_num_spkrs10內(nèi)部基于 p-value 剪枝后的 cos 相似度矩陣通過最大特征間隙估計簇數(shù)kNone 時譜聚類 SCnn affinity使用SpecClustern_clustersk、affinitynearest_neighbors、assign_labelskmeans、random_state1234AHCdo_AHC基于 sklearn 的AgglomerativeClusteringaffinitycosine、linkageaverage已知說話人數(shù)時直接指定n_clusters未知時用distance_thresholdp_val自動確定簇數(shù)。聚類完成后統(tǒng)一經(jīng)過兩步后處理merge_ssegs_same_speaker合并相鄰、屬于同一說話人的子段與distribute_overlap對屬于不同說話人的重疊子段取中點切分時長最終write_rttm輸出 RTTM。diarization.py的注釋也坦誠指出AHC 在未知說話人數(shù)時僅作為實驗更推薦使用譜聚類。八、階段 3DER 評測指標(biāo)解讀8.1 DER 的構(gòu)成Diarization Error Rate 是說話人日志的國際通用評測指標(biāo)由三部分構(gòu)成DER Missed Speech(MS) False Alarm(FA) Speaker Error Rate(SER)Missed Speech參考標(biāo)注有人說話、系統(tǒng)判定無人說話的時間比例False Alarm系統(tǒng)判定有人說話、參考標(biāo)注無人說話的時間比例Speaker Error說話人標(biāo)簽歸屬錯誤的時間比例。評測參數(shù)ignore_overlapTrue忽略重疊說話區(qū)間forgiveness_collar0.25允許邊界有 0.25 秒誤差這些與 utils/DER.py 的DER()函數(shù)簽名DER(ref_rttm, sys_rttm, ignore_overlap, forgiveness_collar)一一對應(yīng)。8.2 本示例報告的最優(yōu)結(jié)果examples/ami/sd0/README.md 給出了 **ECAPA-TDNN SC譜聚類**在 HeadsetMix 上的最優(yōu) DERSystemMic.Orcl. (Dev)Orcl. (Eval)Est. (Dev)Est. (Eval)ECAPA-TDNN SCHeadsetMix1.54%3.07%1.56%3.28%Orcl.Oracle使用標(biāo)注中的真實說話人數(shù)Est.Estimated使用最大特征間隙自動估計說話人數(shù)??梢钥吹皆?oracle 說話人數(shù)下 dev 集 DER 僅 1.54%即使改用估計說話人數(shù)性能也幾乎不損失1.56%說明 cos 相似度下的特征間隙估計在 AMI 上非??煽?。運行結(jié)束后腳本會打印Final Diarization Error Rate (%) on AMI corpus: Dev 1.54 % | Eval 3.07 %九、快速上手清單與復(fù)現(xiàn)要點環(huán)境準(zhǔn)備安裝 PaddleSpeech 及其依賴sklearn、yacs、tqdm 等確保MAIN_ROOT環(huán)境變量可用由path.sh自動設(shè)置。數(shù)據(jù)下載標(biāo)注包ami_public_manual_1.6.2.zip約幾十 MB 音頻 SignalsHeadset mix約 10GB。會議 ID 以 local/ami_splits.py 為準(zhǔn)。一鍵運行./run.sh --data_folder ./amicorpus --manual_annot_folder ./ami_public_manual_1.6.2在examples/ami/sd0目錄下或分 stage 執(zhí)行。修改實驗想換聚類后端修改conf/ecapa_tdnn.yaml的backendSC/AHC/kmeans與affinitycos/nn想評估麥克風(fēng)差異修改mic_type想驗證自動估計說話人數(shù)將oracle_n_spkrs設(shè)為False。結(jié)果產(chǎn)物參考 RTTM 位于save/ref_rttms/系統(tǒng) RTTM 位于save/sys_rttms/逐錄音 DER 位于save/DER/。十、延伸閱讀流水線核心聚類實現(xiàn)paddlespeech/vector/cluster/diarization.pydo_spec_clustering/do_AHC/read_rttm/write_ders_file嵌入提取模型paddlespeech/vector/models/ecapa_tdnn.pyEcapaTdnn網(wǎng)絡(luò)定義評測腳本utils/DER.py數(shù)據(jù)劃分local/ami_splits.py數(shù)據(jù)準(zhǔn)備local/ami_prepare.py配置模板conf/ecapa_tdnn.yaml通過以上步驟你可以在自己的機器上完整復(fù)現(xiàn) AMI 說話人日志實驗并將這套嵌入提取 聚類 DER 評測的流水線遷移到其他會議或電話對話數(shù)據(jù)集上。贊分享人工智能語音音頻NLP媒體生成【免費下載鏈接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.項目地址https://gitcode.com/paddlepaddle/PaddleSpeech點擊查看免費下載相關(guān)推薦SpeechBrain 實戰(zhàn)基于 ECAPA-TDNN 深度嵌入與譜聚類的 AMI 說話人日志Speaker Diarization完整指南SpeechBrain 實戰(zhàn)基于 ECAPA TDNN 深度嵌入與譜聚類的 AMI 說話人日志Speaker Diarization完整指南 說話人日志人工智能深度學(xué)習(xí)語音音頻NLP預(yù)訓(xùn)練NeMo 說話人日志Speaker Diarization實戰(zhàn)指南從聚類式推理到端到端 Sortformer 流式方案NeMo 說話人日志Speaker Diarization實戰(zhàn)指南從聚類式推理到端到端 Sortformer 流式方案 導(dǎo)讀 本文以 NeMo本項目為開發(fā)工具代碼質(zhì)量靜態(tài)分析NeMo 說話人任務(wù)實戰(zhàn)說話人識別Speaker Recognition與說話人日志Speaker Diarization完整指南NeMo 說話人任務(wù)實戰(zhàn)說話人識別Speaker Recognition與說話人日志Speaker Diarization完整指南 導(dǎo)讀 本文圍繞 N前端CMS上一篇WVP-GB28181-Pro如何構(gòu)建企業(yè)級國標(biāo)視頻監(jiān)控統(tǒng)一平臺下一篇rough-notation性能預(yù)算設(shè)置控制資源使用上限創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考