当前位置:   article > 正文

一文看懂Griffin_lim声码器_griffin-lim

griffin-lim

Griffin_lim算法详解

声码器

声码器是语音分析和合成的一一种工具,目前主要用来将将声学参数转换成语音波形,即合成。
常见的传统声码器有 WORLD, STRAIGHT及其变种等; 还有目前较火的神经网络声码器,如WaveNet,一种可训练的基于深度神经网络的声码器,可生成高质量的语音波形。

GL算法

Griffin_lim声码器是将语谱图转回波形的一种算法。主要思想为已知幅度谱,未知相位谱,通过迭代生成相位谱,并用已知的幅度谱和计算得出的相位谱,重建语音波形。因为常见的特征MEL-spectrum 和 linear-spectrum里面节缺少相位信息。
由1984年的这篇文章提出:
Griffin, Daniel, and Jae Lim. “Signal estimation from modified short-time Fourier transform.” IEEE Transactions on Acoustics, Speech, and Signal Processing 32.2 (1984): 236-243

算法步骤

就是一个迭代算法,利用帧frame之间相位的约束来实现迭代收敛。

  1. 幅度谱Amplitude矩阵A1已知 ,无相位谱,所以先随机初始化一个相位谱w1;
  2. 用相位谱和已知的幅度谱经过IFFT,得到时域信号y1(此时相位并不准确);
  3. 对该时域信号再做STFT得y2,计算y2的幅度谱A2和相位谱为w2;
  4. 用新的相位谱w2和原幅度谱A1再IFFT,得到时域信号y3,如此重复。

代码实现

def griffin_lim(S, hparams):
    '''librosa implementation of Griffin-Lim
    Based on https://github.com/librosa/librosa/issues/434
    '''
    angles = np.exp(2j * np.pi * np.random.rand(*S.shape))#随机生成相位谱w1
    S_complex = np.abs(S).astype(np.complex)# A1
    y = _istft(S_complex * angles, hparams) # y1
    for i in range(hparams.griffin_lim_iters):
        angles = np.exp(1j * np.angle(_stft(y, hparams))) #w2,w3...
        y = _istft(S_complex * angles, hparams) #y2,y3...但已知是A1 
    return y

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

数学推导

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上图最后得到的更新方程如下:
在这里插入图片描述
其中:
在这里插入图片描述
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/342289?site
推荐阅读
相关标签
  

闽ICP备14008679号