總覽
單通道的語音降噪有兩種方式:
- 直接在一維的時域原始波形上進行操作
- 把一維的時域波形轉(zhuǎn)換為二維的時頻譜再進行操作
第二種方式的主流方法是預測一個時頻掩膜用來降噪琐簇,PHASEN也是采用這種方法炫七。
總的來說撩满,PHASEN是在時頻譜(復數(shù)域)基礎(chǔ)上預測了一個幅度掩膜和一個相位掩膜
截驮,然后用輸入的時頻譜的模(實數(shù)域)乘上兩個掩膜得到低噪聲時頻譜,公式如下:
PHASEN的結(jié)構(gòu)
首先整個模型呈雙流結(jié)構(gòu)讲弄,強度流用來預測幅度掩膜熔号,相位流用來預測相位掩膜
。也可以把模型分為三個部分:TSB之前华畏、TSBs鹏秋、TSB之后。
我個人在理解一個神經(jīng)網(wǎng)絡(luò)模型的時候亡笑,比較喜歡從模型的輸入輸出維度入手侣夷,所以下面會著重分析模型各部分的維度變化。
模型的輸入是復數(shù)域上二維的時頻譜仑乌,所以要先對一維的時域波形進行STFT(短時傅里葉變換)百拓。其次神經(jīng)網(wǎng)絡(luò)用到批處理琴锭,所以輸入的維度應當是
[B,2,t_len,f_len]
,這里的第二個維度2是指時頻譜的實部和虛部衙传。
TSB之前:
TSB之前的強度流是兩個二維卷積層决帖,卷積核分別為(1對應時域)和
(7對應時域)。這兩個卷積層不改變輸入tensor的時域和頻域長度蓖捶,只改變第二個維度的通道數(shù)地回,也就是說這兩個卷積層的輸出維度都是
[B,c_a,t_len,f_len]
,至于c_a
是多少俊鱼,論文中沒有提(畢竟沒有開源)刻像,參考文末一位大佬復現(xiàn)的模型代碼,可以將c_a
設(shè)置為24并闲。
TSB之前的相位流也是兩個二維卷積層细睡,卷積核分別為(5對應時域)和
(25對應時域)。同強度流一樣帝火,這兩個卷積層也不改變輸入tensor的時域和頻域長度溜徙,只改變第二個維度的通道數(shù),這兩個卷積層的輸出維度都是
[B,c_p,t_len,f_len]
犀填,根據(jù)參考可以將c_p
設(shè)置為12蠢壹。
TSBs:
這一部分由三個TSB模塊級聯(lián)而成。
每個TSB內(nèi)部的強度流由兩個FTB和三個二維卷積層構(gòu)成九巡。FTB以及三個卷積層的輸入和輸出維度都是[B,c_a,t_len,f_len]
知残。
TSB內(nèi)部的相位流比較簡單,由兩個卷積層構(gòu)成比庄,其輸入輸出維度都是[B,c_p,t_len,f_len]
,但需要注意的一點是乏盐,相位流的每個卷積層之前需要進行l(wèi)ayer normalization佳窑。
TSB的最末尾,雙流需要交換信息父能,公式如下:
由于和的第二維度(通道數(shù))不相同神凑,所以信息交換也要包含通道數(shù)的變換,這里可以起到通道數(shù)變換的有兩個地方何吝,一是圓圈代表的element-wise multiplication(在兩個維度不相同的張量element-wise multiplication時溉委,會以某種方式復制其中一個張量至與另一個張量維度相同再相乘),二是一個的卷積層爱榕。我更傾向于使用卷積層來做通道變換瓣喊。也就是:
的維度:
[B,c_a,t_len,f_len]
的維度:
[B,c_p,t_len,f_len]
的維度:
[B,c_p,t_len,f_len]
的維度:
[B,c_p,t_len,f_len]
的維度:
[B,c_a,t_len,f_len]
的維度:
[B,c_a,t_len,f_len]
TSB中的FTB
這篇論文提出了兩個創(chuàng)造性的點:
- 雙流模型的雙流之間需要相互交換信息,目的是為了更好的預測相位掩膜黔酥。
- FTB模塊( frequency transformation blocks )藻三,目的是為了捕獲頻域上的全局相關(guān)性洪橘。
下面來分析FTB模塊,其輸入輸出維度都是:[B,c_a,t_len,f_len]
棵帽。
首先要關(guān)注的是T-F attention熄求,這里用到了注意力機制,所以維度變換略微復雜逗概。
T-F attention 一開始先用一個的卷積層將輸入張量的通道數(shù)從
c_a
降至c_r
弟晚,此處c_r
為5,即輸出維度為[B,c_r,t_len,f_len]
逾苫,然后進行reshape卿城,結(jié)果維度為[B,c_r*f_len,t_len]
。接下來是關(guān)鍵一步隶垮,一個卷積核為9的一維卷積藻雪,輸出維度為[B,c_a,t_len]
,這個輸出要和FTB最開始的輸入做一次element-wise multiplication狸吞,由于維度不匹配勉耀,所以會將[B,c_a,t_len]
的張量復制f_len
次再與[B,c_a,t_len,f_len]
的張量相乘。
Element-wise multiplication后的張量維度為[B,c_a,t_len,f_len]
蹋偏,這個張量要通過一個不要偏置的全連接層便斥,其權(quán)重被論文稱為frequency transformation matrix (FTM),權(quán)重的維度為[f_len,f_len]
威始,這一步是FTB的核心枢纠,輸出的維度是[B,c_a,t_len,f_len]
。
全連接的輸出又要和FTB最開始的輸入進行合并黎棠,即將兩個[B,c_a,t_len,f_len]
張量合并為一個[B,2*c_a,t_len,f_len]
的張量晋渺,最后通過一個的卷積層降低通道數(shù)得到維度為
[B,c_a,t_len,f_len]
的輸出。
TSBs之后
TSBs之后的強度流首先通過一個的卷積層將
[B,c_a,t_len,f_len]
降低至[B,c_r,t_len,f_len]
脓斩,此處c_r
等于8木西。其輸出結(jié)果要進入一個BiLSTM,BiLSTM需要設(shè)置參數(shù) hidden_size
随静,這里盲猜為300八千,其輸出維度為[B,t_len,hidden_size*2]
。事實上燎猛,張量在進入BiLSTM之前恋捆,要進行一次reshape,因為BiLSTM對輸入張量的shape是有要求的重绷,所以[B,c_r,t_len,f_len]
要先reshape為[B,t_len,c_r*f_len]
沸停,而后通過BiLSTM得到[B,t_len,hidden_size*2]
。之后通過兩個600的FC層得到輸出[B,t_len,600]
昭卓,最后通過一個257的FC層得到星立,維度為
[B,t_len,257]
這里要說明一下爽茴,因為論文中有說明在STFT時的FFT長度為512,那么時頻譜的維度就應該是[t_len,512/2+1]
绰垂,即f_len=257
室奏,而應當具有和時頻譜相同的維度,那為什么論文原圖中最后的FC層的輸出是514通道呢劲装?我只能說可能論文寫錯了吧......
TSBs之后的相位流經(jīng)過一個的卷積層將
[B,c_p,t_len,f_len]
降低至[B,2,t_len,f_len]
然后進行一下幅度正則化即可胧沫。輸出的維度即為
[B,2,t_len,f_len]
,第二維的2表示復數(shù)的實部和虛部占业。
至此绒怨,模型的前向傳播過程就分析完了,得到了幅度掩膜和相位掩膜
谦疾,然后便可用公式
得到估計的時頻譜
Loss的計算
公式如下:
就是指無噪聲的時頻譜南蹂,是指冪律壓縮時頻譜(power-law compressed spectrogram),冪律壓縮參數(shù)為0.3念恍,坦白講我一個菜雞并不知道什么是冪律壓縮六剥,參考了其他大佬的復現(xiàn)代碼之后才知道。這里有個問題峰伙,無論是還是疗疟,它們都是復數(shù),而冪律壓縮是對實數(shù)的操作瞳氓,所以應當先abs()運算策彤,再壓縮,即匣摘,但這樣的話和應該怎么區(qū)分呢店诗?參考了大佬的復現(xiàn)后,我這樣做:
參考:https://github.com/huyanxin/phasen
https://hiedean.github.io/2020/04/10/PHASEN/