Audio-WestlakeU / FS-EEND

The official Pytorch implementation of "Frame-wise streaming end-to-end speaker diarization with non-autoregressive self-attention-based attractors". [ICASSP 2024]
MIT License
71 stars 4 forks source link

finetune 語料時數 #4

Closed jeremy110 closed 8 months ago

jeremy110 commented 9 months ago

您好,想請問一下,如果想要接續著fine-tune這個model,您建議語料時數為多少小時? 以及每個語者最少要講話多少分鐘?

期待您的回覆,感謝

DiLiangWU commented 9 months ago

您好,

  1. 我们在CALLHOME数据集上fintune使用的adaption set语料时长为8.7小时, test set时长为8.55小时;
  2. CALLHOME数据集的adaption set平均每个speaker的说话时长为51.3s(包含overlap的情况);
  3. 我们按照EEND-EDA论文里提供的模拟数据方法生成的simulated mixtures,即一条recording中每个speaker的句子数为10~20句。

因此,我们建议fintune的语料时长需要在10小时左右及以上,每个speaker的讲话时长在1分钟左右及以上。 希望以上信息可以为您提供参考。

jeremy110 commented 9 months ago

十分感謝您,這對我來說非常有幫助

另外想向您請教,我之前有使用以固定window size抽取embedding + clustering based的演算法去分出每個speaker,但在我的場景當中,會出現一個人講一段話,另一個人回答"是"或"正確",clustering based的演算法很難將另一個人的回答分成不同語者,不知道您提出的這個FS-EEND有沒有可能分出來呢? 或者您是否知道有其他方法呢?

期待您的回覆,十分感謝

DiLiangWU commented 9 months ago

不知道您设置的window size尺寸为多大。如果尺寸较大,在提取例如“是”这样短语句所对应speaker的embedding时就会包含上下文其他speaker的语句,导致embedding精确度有损,进而分错speaker。个人认为一些可以提取帧级别embedding的方法可能会更好一些。我对于提取帧级别embedding的clustering-based diarization方法了解的不多。end-to-end diarization的一系列论文[1,2],以及该FS-EEND在线提取embedding的方法[3]您可以尝试下。

[1] Yusuke Fujita, Naoyuki Kanda, Shota Horiguchi, Kenji Nagamatsu, and Shinji Watanabe, “End-to-end neural speaker diarization with permutation-free objectives,” in INTERSPEECH, 2019, pp. 4300–4304. [2] Shota Horiguchi, Yusuke Fujita, Shinji Watanabe, Yawen Xue, and Kenji Nagamatsu, “End-to-end speaker diarization for an unknown number of speakers with encoder-decoder based attractors,” in INTERSPEECH, 2020, pp. 269–273. [3] Di Liang and Nian Shao and Xiaofei Li, “Frame-wise streaming end-to-end speaker diarization with non-autoregressive self-attention-based attractors”, https://arxiv.org/abs/2309.13916

jeremy110 commented 9 months ago

我使用的是nvidia nemo提出的Multi-scale Diarization Decoder (MSDD) model,為0.5s~1.5s,5個scale的window size。 您說的沒錯,會包含其他speaker導致精确度有损。

我會再嘗試看看的,感謝您的建議及回覆。

jeremy110 commented 9 months ago

您好 想再請問一下 我目前有兩個類型的中文電話客服的資料,一個大概十小時我當fine-tune的adaption set,另一個大概2小時當test set,兩個類型的語者沒有重複,training loss是有明顯下降的,但test一直保持不變。

想請問是不是test set的語者一定要有出現過在adaption set當中,否則效果不好?

DiLiangWU commented 9 months ago

并没有这个限制。事实上我们在生成simulated dataset的时候是按照说话人划分的training/validation/test set,即这些set中出现的speakers是无交叉的。在CALLHOME上fintune时我不保证adaption set和test set包含的speaker是否有交叉。但是并没有test set的speaker要包含在training set中的限制。

我们在CALLHOME上fintune的时候未发现test loss/DER保持不变的现象。您这里test保持不变的是什么指标呢,loss还是DER,是完全相同的值还是在微小范围内波动? 是否是因为两个类型数据分布差异化太大?是否可以先使用同一种类型的数据集划分adaption和test set观察是否会出现该现象? 可能需要具体分析原因了。

jeremy110 commented 9 months ago

感謝您的說明 我照您說的先將第一種類型的資料劃分adaption和test set 在訓練上看起來問題不大(如下圖),我是直接打印出這些指標去看訓練的如何 image

那我一開始訓練的會長這樣,看diarization_error就感覺怪怪的,我有訓練到100 epoch,跟下圖的數據差不多,diarization_error都落在319左右 image

兩類型的數據因為保密的關係我不能放上來,但我能提供以下的截圖

比較小的dataset原先是兩個channel,那我用vad先跑過一遍,產生出label,並合併成單channel: image

比較大的dataset是單channel,然後label是我自己標: image

不知道這樣子的提供能否看出差異化太大? 再次感謝您的回覆及幫忙,感激不盡

DiLiangWU commented 9 months ago

您第一张图是adaption和test都属于同一类型,看起来DER = diarization_error / speaker_scored 在11%左右是正常的。 第二张图是用类型一做adaption set,用类型二做test set,DER已经超过100%并且接着训练也不下降,应该已经不属于模型训练的问题,个人推测可能属于数据或者标签方面的问题。

由于我不是信号方面的专家,大致只能可以看出第一类型的语音能量要比第二类型的强很多。 目前模型pre-trained和fintuned的模型使用的都是单channel的数据集,training/adaption和test数据都分布在同一数据空间。这里只能针对您说的问题为您提供一些参考。

  1. 您可以先check一下两种类型的网络输入的数据分布是否一致。比如可以保存下来输入的统计变量mean和standard deviation进行观察;
  2. 我们沿用了EEND-EDA论文里对dataset的操作,即提取信号的log-mel特征时做了均值norm,即减去了均值。在您这种情况下,您可以尝试将conf/spk_onl_tfm_enc_dec_nonautoregxxx.yaml文件里data: feat_type: logmel23_mn改为logmel23_mvn,将标准差做norm试试看。
  3. DER>100%的情况,也不排除是label有误,或者在用prediction和标签算DER时匹配的问题(因为涉及到两channel的label的合并)。这就需要您通过调试来定位问题的具体位置了。您也可以推理一下,将产生的predictions保存,然后由visualize/gen_h5_output.py产生speech activity probability,可视化目前的推理结果进行分析。

以上希望可以为您提供参考

jeremy110 commented 9 months ago

感謝您的回覆 照你的建議,我回去檢查label的部分,有些誤標,更正四個檔案之後,單獨測試這四個檔案,DER大概落在26%,我想我會花時間先排除label的問題 image

1.mean和standard deviation我會再做統計,目前有先統計(還沒做更正動作),兩種類型語者說話的時間比,比較大的資料集兩個 語者說話大部分比例落在6:4,但有一兩個是落在8:2,10~20%是落在7:3。 小的資料集,大部分比例落在7:3,但有三四個是落在9:1,20%是落在8:2。 我用clustering based的演算法,有發現比例越懸殊,speaker error會越高,不知道在EEND這部分也會有這種形況呢?

2.另外我也嘗試logmel23_mvn,DER好像差不多,我會再嘗試看看這部分

3.我是直接看預測出來的機率矩陣preds,大部分的問題應該是標錯語者,都標比例較大的那個語者,感覺跟1提到的有關

再次感謝您的回覆及幫忙,感激不盡

DiLiangWU commented 8 months ago

您好,图中显示的DER看起来是正常的了。顺便说下,推理文件中打印出的这个DER相当于一个初步的中间结果,供分析调试用的。是按照说话人出现顺序排列与label进行匹配的且没有使用任何后处理操作。主流的DER计算是先保存下preds,由README.md中第7步Evaluation计算得到,会比目前DER值更低。

A1: 您的问题很好,对于话者说话时长对性能的影响我并没有过多研究。但个人认为说话人时长比例对clustering-based和EEND的影响原因应该有所差别。首先,1. 如果一个speaker说话人的绝对时长太短,可能会影响speaker embedding的提取质量,对任何方法都会影响性能。此外,2.1 对于clustering-based来讲,可能会因为以上我们讨论的窗长问题导致混有其他speaker的信息;2.2 对于EEND来讲,网络如果见到的不同说话时长的情况不够多,可能影响其泛化能力。目前pre-traind model使用的每个说话人是随机在10-20句话中选择的,我查了一下2speakers训练集中的说话人时长比大部分处于1:1~5:2之间,极少的sample会达到4:1,由于训练集太大,目前我只能给出大概的比例。可能这方面与您的小资料集存在差异,但对于模型性能的影响多有少有待探究。

如果想要提高性能,可能需要在fintune时让网络见到更多比例悬殊的sample会更好,从大资料集只有10~20%是落在7:3,小资料集大部分比例落在7:3这一点看的确adaption set的确和test set分布存在差异。或者加入一些trick比如增大话语少的speaker的loss权重等,这就属于类别不平衡范畴里需要研究的问题了。

A2. 关于logmel23_mvn我目前也没有研究其对模型性能的影响。

A3. 同A1,另外您可以check一下小资料集中说话少的speaker的绝对话语时长是否过短。

jeremy110 commented 8 months ago

您好 感謝您的回覆及說明 我詳細述說一下我的場景,看能不能給我個建議或回答到您的A3。 我的場景是電話客服,是那種比例極端(8:2 或 9:1)的例子(但我這邊只有幾個測試音檔,然而大資料集有蠻多的但要自己標註),客服會先唸幾個一長串資料請顧客回答是否正確,那大部分顧客只會回答"是",少部分會回答"正確",後續核對電話等等,這部分客服會重複顧客唸的(快速切換語者),如: 客服: 長串資料(10-20s) 顧客: 是(大約0.3s) 客服: 長串資料(10-20s) 顧客: 是(大約0.3s) 客服: 請提供您的電話 顧客: 0900 客服: 0900 顧客: 123 客服: 123 顧客: 456 客服: 456

我用nemo clustering-based的分群,如果顧客的回答為"是",那幾乎無法分出語者,如果"正確"那有大概6成機率會分出語者。

我目前的想法是將此model應用在Post-Processing,也就是先用clustering-based得到分群的片段,然後再將每個片段做一次FS-EEND,目的希望能切出這個"是",所以我這邊才沒有執行README的第七步看整體的DER

我會照您的建議去研究類別不平衡的問題,和再增加一點比例懸殊的訓練資料看會不會有幫助,最後向您提供我統計的log small_log.txt large_log.txt

再次感謝您的回覆及幫忙

DiLiangWU commented 8 months ago

您好,我看到了log里说话人时长确实有一些是很短的。如您所说一个顾客可能每个片段只有0.3s这种情况,对应FS-EEND只有3帧,对这么短的信号提取一个好的speaker embedding的确是一个比较有挑战性的任务。之前做过关于speaker identification的一点经验是需要至少0.8s~1.0s以上的segments才会基本不影响identification的性能或者说speaker embedding的提取质量。

很抱歉目前我对这种情况的研究经验还不足。针对这种情况,增加speaker时长比例悬殊的训练集并且给时长小的speaker所对应的loss设置更大的权重可能会有帮助,但我并不确定帮助有多大。

jeremy110 commented 8 months ago

您好 感謝您的回覆 感謝您提供的經驗,我之前也試過用短segment(0.5s)去fine-tune speaker embedding model,只不過當初效果超差,應該如你所說需要0.8~1.0s。 我會先試你說的那幾種方法,如果不行我可能要再找有沒有方法了。

另外我一開始其實想實現這篇論文https://arxiv.org/abs/2309.06672 雖然有把model寫出來,但結果非常奇怪失敗了,能力有限找不到問題出在哪...

再次感謝您細心及快速地回覆