Chapter3-1_Speech Separation(Deep Clustering, PIT)
文章目錄
- 1 內容簡述
- 2 評價指標
- 2.1 Signal-to-noise ratio (SNR)
- 2.2 Scale invariant signal-to-distortion ratio (SI-SDR)
- 2.3 其他的評價指標
- 3 Permutation Issue
- 4 Deep Clustering
- 5 PIT
本文為李弘毅老師【Speech Separation - Deep Clustering, PIT】的課程筆記,課程視頻youtube地址,點這里👈(需翻墻)。
下文中用到的圖片均來自于李宏毅老師的PPT,若有侵權,必定刪除。
文章索引:
上篇 - 2-2 CycleGAN and StarGAN
下篇 - 3-2 TasNet
總目錄
1 內容簡述
人在一個嘈雜的環境下聽別人說話的時候,可以很神奇的抽取到說話人說話的信息,換而言之,也就是把說話人發出的聲音和說話人之外的聲音給分開了。而Speech Separation要做的事情,也就是把不同物體發出的聲音給分開。
Speech Separation可以分為兩大類:
-
Speech Enhancement
把人的聲音和其他的聲音給分開來,也被稱為denoising -
Speaker Separation
把不同人說話的聲音分開來
本篇的著重點在于Speaker Separation,而且在討論的時候,都以兩個speakers,單一麥克風的情況為例子。同時,要說明的是,用于訓練和驗證的聲音數據來自于不同的speaker,也就是說,訓練集是A,B,C,D說的,驗證集是E,F說的,這樣子。
Speaker Separation有一個特點,就是它的輸入和輸出的長度必然是一致的,所以可以不使用seq2seq的模型來解,用seq2seq的模型有一種殺雞用牛刀的感覺。
Speaker Separation有一個好處就是,數據集很容易構造,我們只需要找一堆單個speaker的聲音信號過來,然后兩兩合成一下,就可以了。
2 評價指標
2.1 Signal-to-noise ratio (SNR)
有一種評估模型輸出質量的方法叫做SNR,SNR的目的是讓模型的輸出X?X^*X?和X^\hat{X}X^越接近越好。SNR的計算公式如下所示
SNR=10log10∣∣X^∣∣2∣∣E∣∣2SNR=10 log_{10} \frac{||\hat{X}||^2}{||E||^2} SNR=10log10?∣∣E∣∣2∣∣X^∣∣2?
其中,X?X^*X?和X^\hat{X}X^均為向量,且
E=X^?X?E=\hat{X}-X^* E=X^?X?
不難看出,當EEE越大的時候,SNRSNRSNR就小,也就是SNRSNRSNR認為模型的結果越差,反之越好。
這種簡單粗暴的評價方式,在面對聲音的時候,會存在一個致命的問題。比如模型輸出的X?X^*X?和X^\hat{X}X^向量幾乎是平行的,只不過X?X^*X?短了一點(音量小了一點),這個時候SNR卻認為模型學的不好,這其實是不合理的,不我們只要把音量調大一點就可以了。
又比如說,模型輸出的X?X^*X?和X^\hat{X}X^偏差比較大,但是當X?X^*X?被調大了音量之后,這個SNRSNRSNR就認為模型變好了,這也是我們不希望看到的。
總而言之,SNRSNRSNR受音量大小的干擾太大。
2.2 Scale invariant signal-to-distortion ratio (SI-SDR)
另一種文獻中常用的評價指標叫做SI-SDR,SI-SDR也被稱為SI-SNR,知道這兩個是同一個東西就可以了。SI-SDR的計算公式為
SISDR=10log10∣∣XT∣∣2∣∣XE∣∣2SISDR=10log_{10} \frac{||X_T||^2}{||X_E||^2} SISDR=10log10?∣∣XE?∣∣2∣∣XT?∣∣2?
其中
{XE=X??XTXT=X??X^∣∣X^∣∣2X^\left\{ \begin{aligned} X_E = X^* - X_T \\ X_T = \frac{X^* \cdot \hat{X}}{||\hat{X}||^2}\hat{X} \end{aligned} \right. ??????XE?=X??XT?XT?=∣∣X^∣∣2X??X^?X^?
這個評價指標就是在看X?X^*X?與X^\hat{X}X^的平行程度,解決了SNR被音量大小干擾的問題。
而在實際使用的時候,我們看的,往往是SI-SDR的improvement。什么是improvement?比如我們要看下圖中藍色信號的improvement,那么我們就要先把輸入mixed audio和藍色信號的ground truth做一個SI-SDR得到SI-SDR1,然后再把藍色信號對應的輸出和藍色信號的ground truth算一個SI-SDR2,再用SI-SDR2減去SI-SDR1來看這個增量。
為什么要這么做?因為有些時候,mixed audio的紅色信號可能音量較低,這使得SI-SDR1本身就會比較大,SI-SDR2自然也就是大的,這個時候看增量improvement會更有意義。
2.3 其他的評價指標
除了SNR和SI-SDR之外,還有其他很多評價指標,比如用來評價輸出聲音質量的Perceptual evaluation of speech quality (PESQ),用來評價聲音清晰度的short-time objective intelligibility (STOI)。這些評價指標都比較復雜,這里不多做介紹。
3 Permutation Issue
講完了評價指標之后,我們就可以像正常了模型那樣開始train了,我們的Loss就用L1或者L2或者SI-SDR都是可以的,SI-SDR是可以微分的。我們就輸入一個mixed audio然后經過一個speaker Separation的model,出來一個X1X_1X1?和X2X_2X2?,再算一下loss,然后反向傳播,就結束了。真的就么就結束了嗎?錯錯錯!
我們仔細來思考一下,輸出X1X_1X1?的這端和X2X_2X2?的這端是連接著固定的weights的,為什么X1X_1X1?一定是紅色信號,X2X_2X2?一定是藍色信號。這兩個不能換一下嗎?加入我們又來了一個橙色信號,那這個橙色信號應該在哪個輸出?仔細想一下,這樣子網絡是沒法train起來的。這個其實就是Speech Separation中的Permutation Issue。
它不能像其他問題那樣直接轉變為一個可以直接train的神經網絡。
那怎么辦?下面來介紹一下Deep Clustering和PIT。
4 Deep Clustering
在介紹deep clustering之前,我們先來說一下其中用到的mask。由于Speech Separation只是對于輸入聲音信號的一個拆分,所以我們可以不生成聲音信號,而是生成兩個mask。這兩個mask是互斥的,即M1=1?M2M_1 = 1 - M_2M1?=1?M2?,mask中的值可以是binary的(0和1),也是可以是continuous的(0至1)。如果是binary的,X1X_1X1?就是XXX中M1M_1M1?對應元素為1的元素的組合,即X1=M1?XX_1 = M_1 \cdot XX1?=M1??X;X2X_2X2?就是X?X1=M2?XX-X_1 = M_2 \cdot XX?X1?=M2??X。
這種binary的方式,顯得非常簡單粗暴,這樣難道不會造成很多信息的丟失嗎?不管你信不信,實際情況下,這種做法是work的。不過既然要把我們的訓練目標變成一個mask,那在處理數據,生成label的時候,也有一些相應的操作。
如下圖中,我們有藍色的聲音和紅色的聲音,然后合成了左上角紅藍結合的聲音。藍色和紅色的矩陣表示聲音信號轉換之后得到的spectrogram,紅藍矩陣的shape是一樣的,矩陣中每個元素之間比個大小,藍的大的話,藍色mask相應為止的值就是1,反之是0。紅色的也是一樣。mask就是用這種方式構造出來的。
然后用這種方式得到的mask在mixed audio上去取值,得到左下角的信號,這個信號的聲音,和藍色信號的聲音,人聽起來,是沒什么區別的。這樣的mask叫做Ideal Binary Mask (IBM)。
也就是說,我們的模型只要能學到這樣的兩個IBM,就可以實現Speech Separation了。那么,我們的模型就變成了下圖這樣。
但是!到現在為止,我們仍舊沒有解決Permutation Issue。別急,馬上給你搞定。
先來說一下Deep Clustering的Inference的過程。我們的輸入是一個代表mixed audio的D×TD \times TD×T的矩陣,經過一個Embedding的網絡之后,生成了一個D×T×AD \times T \times AD×T×A的矩陣,這個AAA就是embedding之后的特征維度。然后,我們會對這個輸出做k-means clustering,如果有2個說話人,就把cluster的個數設置為2即可,然后每個cluster就代表一個speaker的Ideal Binary Mask。是不是很機智!完美解決Permutation Issue。
不過這個東西訓練該怎么train呢?k-means clustering是額外的算法,且不可導,要做loss的話,就要在D×T×AD \times T \times AD×T×A的這個矩陣上做文章。
我們是有Ideal Binary Mask這個label的,那么,我們呢就可以讓mask上值一樣的feature的距離越大越好,mask值上值不同的feature越遠越好,這樣的loss是可以做成可導的。
神奇的是,用2個speakers的聲音mix的的數據和deep clustering模型train出來的結果,針對于3個speakers的輸入,也是有效的!這真的是很了不起。
5 PIT
PIT是一種訓練的方法,全稱為Permutation Invariant Training。這種訓練方式就可以end-to-end去訓練,總體思想很直覺,就是我先隨便假設一個speakers對應于輸出的X1X_1X1?和X2X_2X2?的順序,稍微train幾下,得到一個model。然后,下一次train的時候,我會算兩次SI-SDR之類的評價指標,分別是紅1,藍2和藍1,紅2,然后把Loss小的那個作為排序,然后按這個順序train下去。
每train一次,這個排序都可能會發生變化,所以剛開始的時候,是非常不穩定的,但只要這樣train下去,最終,是可以收斂的。感覺這個真的要靠做實驗做出來。
還有就是,PIT相比于按照某種方式,假定一個順序的訓練方式是要好一點的。
總結
以上是生活随笔為你收集整理的Chapter3-1_Speech Separation(Deep Clustering, PIT)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 6055. 转化时间需
- 下一篇: LeetCode 2151. 基于陈述统