簡稱SD,顧名思義,在采集的語音信號流中,分辨出不同說話人的說話時長並標注,即以時間為索引,檢測出每段語音所對應的說話人身份,其通常由說話人分割和聚類兩步組成。
參照2010年8月的文獻[1]中的一張圖:
又稱說話人分割等,在語音信號處理的多種場景下均有應用需求,近年來也被多來越多的研究者所關注。SD的方法分為以下兩種:1)無監督方法,比如譜聚類以及k均值等;2)監督方法,深度神經網絡,比如RNN等方法。
原理
Diarisation是一個生造的詞,可以翻譯為“分割和聚類”,在一些場景中,如一段電話對話、一場會議、一段廣播語音或者是一個電視節目等等日常生活中的語音場景,對語音信息進行切分,找到每個人說的語音,即對整個語音信息的分割和聚類。
Speaker diarisation is the task to find “who spoke when”, while speech recognition is to find “what was spoken”. 這個在語音識別系統中,是作為一個對對話、會議和電視節目識別前的進行預處理的部分,同時在帶有語音信息的視頻理解等任務中,也是一個很重要的組成部分。
Speaker diarization consists of segmenting and clustering a speech recording into speaker-homogenous regions, using an unsupervised algorithm. In other words, given an audio track of a meeting, a speaker-diarization system will automatically discriminate between and label the different speakers (“Who spoke when?”). This involves speech/non-speech detection (“When is there speech?”) and overlap detection and resolution (“Who is overlapping with whom?”), as well as speaker identification.
所以事實上,SD不能簡單的被翻譯為說話人分割或者說話人分類。但是為了方便以及辨識性,大部分會如此稱呼。
pipeline
參考http://pyannote.github.io/pyannote-metrics/reference.html,下圖為SD的典型pipeline:
參考[3],首先一段語音信息流,通過VAD模塊(Voice Activity Detection, 語音活躍性檢測),檢測出哪些幀是有語音的,哪些幀是沒有語音的(無聲音或者只有背景聲)。接着通過CPD模塊(Change Point Detection,變更點檢測)來檢測出說話人的變更點。最后對分割后的每一段語音,提取特征,進行聚類(Speaker Clustering),得到每一段的語音屬於哪個人說的。當然最后,會使用迭代的方法,對上述過程進行反復優化迭代,即refine過程,來獲得更好的diarisation的結果。
- VAD模塊(Voice Activity Detection, 語音活躍性檢測),任務就是找到,什么時候有語音,也可叫“端點檢測”或者”End Point Detection”。傳統方法基於信號處理(Model-free),如時域處理或者頻域能量分析,這些方法很不魯棒。比較好的是基於Model-based的方法。
- CPD模塊(Change Point Detection,變更點檢測),任務就是尋找說話人變更點,找到這些點,對語音信息進行分割。比如可以使用滑動窗,在語音流上滑動,當提取的特征對應的分數發生一定閾值以上的變更,就認為發生了說話人身份變更現象。也可以使用神經網絡,對每個點進行一個分類,分出變更點和非變更點。
- 說話人聚類(Speaker Clustering)模塊,就是對CPD模塊的分割輸出,進行聚類,將同一個人說的話聚類到一起。常用的方法如IAC、AHC、k-means以及譜聚類等,或者基於每個人的說話特點,提取特征進行聚類等。
- 最后對上述的流程進行反復迭代,refine結果。常用的方法如iterative Variational Bayes,以及不同迭代次數中,改變滑動窗的長度,甚至也有使用語音識別結果,來迭代修正前面的流程。
challenges
1、一個端到端模型?
2、說話人數目不確定、無上限,如何聚類?
3、CPD模塊是否必要,如何改進適用?
基於聚類的無監督方法
基於RNN的監督方法
UIS-RNN[2]
這是谷歌2019年發表的一篇文章,研究了實時處理的說話人分類,不限制說話人數目,基於d-vector特征,為每一個說話人建立了一個RNN模型,並且持續更新。文中表示實時說話人分割的准確率可以達到92%,並且DER降低至7.6%,超過了其先前基於聚類方法(8.8%)和深度網絡嵌入方法(9.9%)。
文章主要提出了無界間隔狀態(Unbounded Interleaved-State) RNN,一個可以通過監督學習訓練的對於時變數據分割和聚類的算法。
首先看一張圖,這是文中的SD results show:
不同顏色表示不同的說話人,橫軸為時間索引。
這一方法與通常聚類方法的主要區別在於研究人員使用了參數共享的循環神經網絡為所有的說話人(embeddings)建模,並通過循環神經網絡的不同狀態來識別說話人,這就能將不同的語音片段與不同的人對應起來。
具體來看,每一個人的語音都可以看做權值共享的RNN的一個實例,由於生成的實例不受限所以可以適應多個說話人的場景。將RNN在不同輸入下的狀態對應到不同的說話人即可實現通過監督學習來實現語音片段的歸並。通過完整的監督模型,可以得到語音中說話人的數量,並可以通過RNN攜帶時變的信息,這將會對在線系統的性能帶來質的提升。
系統的baseline結構為:
UIS-RNN是一個整句(X,Y)的在線生成處理過程,提出的算法結構為:
解碼過程中采用最大后驗概率准則解碼,采用beam search方法處理。
同時,在speaker segment建模中,采用了一個貝葉斯非參數模型:distance dependent Chinese restaurant process (ddCRP)的loss,用來估計number of clusters。
為驗證模型,作者們選用數據集CALLHOME(2000 NIST SRE,disk-8),5折交叉驗證,模型效果采用DER評價參數衡量。此外,又使用了兩個off-domain數據集:Switchboard(2000 NIST SRE,disk-6) 和 ICSI會議語料庫。最終DER可以低至7.6%,分割性能超過現有的SOTA算法。
在未來研究人員將會改進這一模型用於離線解碼上下文信息的整合;同時還希望直接利用聲學特征代替d-vectors作為音頻特征,這樣就能實現完整的端到端模型了。
中餐館過程
Chinese restaurant process,中國餐館過程是一個典型的Dirichlet過程混合模型。參考:中國餐館過程(Chinese restaurant process)_qy20115549的博客-CSDN博客
集束搜索
Beam Search Algorithm. 可參考:集束搜索(Beam Search) - Skye_Zhao - 博客園 (cnblogs.com)
貪心搜索只選擇了概率最大的一個,而集束搜索則選擇了概率最大的前k個。這個k值也叫做集束寬度(Beam Width)。下圖中k=2:
Beam Search(集束搜索)是一種啟發式圖搜索算法,通常用在圖的解空間比較大的情況下,為了減少搜索所占用的空間和時間,在每一步深度擴展的時候,剪掉一些質量比較差的結點,保留下一些質量較高的結點。這樣減少了空間消耗,並提高了時間效率。
使用廣度優先策略建立搜索樹,在樹的每一層,按照啟發代價對節點進行排序,然后僅留下預先確定的個數(Beam Width-集束寬度)的節點,僅這些節點在下一層次繼續擴展,其他節點就被剪掉了。
- 將初始節點插入到list中,
- 將給節點出堆,如果該節點是目標節點,則算法結束;
- 否則擴展該節點,取集束寬度的節點入堆。然后到第二步繼續循環。
- 算法結束的條件是找到最優解或者堆為空。
參考
[1] Speaker Diarization: A Review of Recent Research
[2] Fully Supervised Speaker Diarization, 2019 ICASSP accepted.
[3] 劍橋大學張超:《基於深度學習的多說話人分割聚類》 (qq.com)