语音合成目前比较流行的方案是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倒谱特征效果应是相同的。