語音合成目前比較流行的方案是Tacotron(2) + WaveNet(WaveRNN, LPCNet)等神經網絡聲碼器。
這些方案的流程大緻相同,先由文本生成特征譜,再将特征譜重建為音頻。在選擇特征譜的時候,有的使用了Mel譜,有的使用了倒譜。
本文通過梳理計算倒譜的流程,試圖說明使用Mel譜和倒譜并無差別。下圖是Matlab計算倒譜的過程
可以分成以下幾步:
- 音頻時域信号分幀
- 對每一幀進行傅裡葉變換,并取幅值,得到線性譜
- 對線性譜進行Mel刻度的權重求和,得到Mel譜
- 取log10,得到Fbank
- 取離散餘弦變換,得到倒譜系數
從以上過程可以知道,Mel譜和倒譜系數的差別,在于一個取對數和取離散餘弦變換的過程。
我們知道,離散餘弦變換是一個線性變換。線性變換對于神經網絡來說是小菜一碟。是以Mel譜和倒譜系數的
主要差別是取對數的過程。
在幾乎所有的開源代碼中,使用Mel譜特征的時候,
都會對Mel譜特征求db值,也就是求一個N*log10()的值。其中N與mel譜幅值是否平方有關:如果Mel譜單是傅裡葉變換後的幅值,那麼N一般取10;如果Mel譜是傅裡葉變換後幅值的平方,那麼N一般取20。按照這樣的方法,Mel譜特征和倒譜特征隻差了一個線性變換矩陣,對于神經網絡來說相當于沒差。
是以,
在使用Mel譜特征時,如果計算了db值,那麼和使用Mfcc倒譜特征效果應是相同的。