griffin-lim算法及 vocoder声码器

G&L(griffin-lim)算法是一种已知幅度谱,未知相位谱,通过迭代生成相位谱,并用已知的幅度谱和计算得出的相位谱,重建语音波形的方法。其实语音合成汇总常常使用的MEL-spectrum 和 linear-spectrum里面节缺少相位信息。

griffin-lim是一种声码器,常用于语音合成,用于将语音合成系统生成的声学参数转换成语音波形,这种声码器不需要训练,不需要预知相位谱,而是通过帧与帧之间的关系估计相位信息,从而重建语音波形。



声码器(vocoder)

声码器是一种将声学参数转换成语音波形的工具。griffin-lim是一种较为经典的声码器,算法简单,高效。
另外较多使用的vocoder有: WORLD, STRAIGHT及其变种; WaveNet,一种可训练的基于深度神经网络的声码器,可生成高质量的语音波形,但是为了扩展其感受野,速度慢且复杂度高;WaveRNN, 另一种可训练的基于深度神经网络的声码器,可生成高质量高保真的语音波形, 速度相较于WaveNet有提升,在使用折叠并且硬件较充足的条件下,合成速度较快;LPCNet, 是一种新提出的可使用CPU即可实现重建波形的vocoder,主要思想是,语音是线性信号和非线性信号的有机组合,而DSP(数字信号处理)技术足以胜任其中的线性信号运算,非线性信号的处理可以交给神经网络学习得到,这种声码器速度得到了极大的提升,有望于应用于移动端。

另有较为常用的声码器及其变种, 如Multiband-WaveRnn, Parallel WaveNet, WaveGlow, FlowWaveNet, Parallel WaveGan, MelGan, MB-MelGAN



声学模型

语音合成一般需要进行前端处理,时长模型训练,声学模型训练,最后输出声学参数。对于端到端的语音合成系统而言,一般将大部分前端、时长模型和声学模型整合成了一个模型,直接建立输入文本与输出声学参数之间的映射关系。

声学参数的提取

语音合成的数据准备第一步,一般都是语音参数的提取。用于语音合成中的语音参数(声学参数)一般有MEL谱, MFCC, F0(基频), pitch, voice/unvoice, BAP(一种非周期型特征?)等等。端到端的语音合成系统较多的使用MEL谱。


MEL 谱为例

一般的提取过程为:

  • 语音信号预处理:预加重、分帧、加窗
  • 对语音信号按帧使用短时傅里叶变换STFT, 得到短时幅度谱
  • 生成MEL滤波器组,使用滤波器组对短时幅度谱滤波得到MEL谱

使用MEL谱训练声学模型

使用 对训练声学模型。对于汉语,text一般指的是带声调的拼音文本,audio一般指的是使用上述步骤得到的MEL谱。


声码器重建语音

MEL 谱为例
  • MEL谱转换成幅度谱
  • 幅度谱使用G&L算法重建波形
  • 去加重


griffin-lim 算法

算法思想:

griffin-lim重建语音信号需要使用到幅度谱和相位谱。而MEL谱当中是不含相位信息的,因此griffin-lim在重建语音博形的 时候只有MEL谱可以利用,但是通过一些运算,我们可以利用帧与帧之间的关系估计出相位信息,从而重建语音波形。
这里的MEL谱可以看做是实部,而相位信息可以看做是虚部,通过对实部和虚部的运算,得到最终的结果。

算法步骤:

  • 随机初始化一个相位谱
  • 用这个相位谱与已知的幅度谱(来自MEL谱)经过ISTFT(逆傅里叶变换)合成新的语音波形
  • 用合成语音做STFT, 得到新的幅度谱和新的相位谱
  • 丢弃新的幅度谱,用已知幅度谱与新的相位谱合成新的语音
  • 重复2,3,4多次,直至合成的语音达到满意的效果或者迭代次数达到设定的上限

算法解释:

  • 创建一个复数矩阵,将已知的幅度谱作为实层,用噪声随机初始化虚层。(至此, 已有振幅信息, 但是没有相位信息
  • 对复数矩阵进行ISTFT。(至此,仅依靠幅度谱得到一个初步的时域信号
  • 对上一步得到的时域信号进行STFT,得到一个复数矩阵。(获取小部分的,不准确的相位信息
  • 上一步得到的复数矩阵,是从一不准确的时域信号,得到了一个振幅与相位。用已知的振幅替换该矩阵的实部。(至此,有了已知振幅和初步准确的相位
  • 重复2,3,4
  • 迭代至一个满意的效果或者迭代次数到达指定的上限

reference

  • 梅尔频谱(mel-spectrogram)提取,griffin_lim声码器【python代码分析】
  • 声码器简介

你可能感兴趣的:(语音信号处理,语音合成)