如何消除 librosa griffin lim 引入的失真?

Posted

技术标签:

【中文标题】如何消除 librosa griffin lim 引入的失真?【英文标题】:How can I remove distortion introduced by librosa griffin lim? 【发布时间】:2020-07-11 04:55:42 【问题描述】:

我在做:

import librosa


D = librosa.stft(samples, n_fft=nperseg, 
                 hop_length=overlap, win_length=nperseg,
                 window=scipy.signal.windows.hamming)

spect, _ = librosa.magphase(D)

audio_signal = librosa.griffinlim(spect, n_iter=1024, 
                                  win_length=nperseg, hop_length=overlap, 
                                  window=signal.windows.hamming)
print(audio_signal, audio_signal.shape)
sf.write('test.wav', audio_signal, sample_rate)

它会在重建的音频信号中引入明显的失真。我可以做些什么来改善它?

【问题讨论】:

你有原始相位信息吗?在这种情况下,最好使用用 GriffinLim 重建的那个(即使你已经修改了幅度) 我只有幅度 我对这个问题的细节不是很熟悉,但这里有一些建议:试试smoothing,使用更小的window_length,也许更大的hop_length,我会说50%是好...考虑先进的语音增强技术。您也可以在 Librosa 的 GitHub 页面上发布相关内容,开发人员可能会提供帮助,因为他们可能更熟悉此类问题。 timsainburg.com/noise-reduction-python.html @Shamoon 这是否为您的问题提供了任何线索? ieeexplore.ieee.org/document/8521304 【参考方案1】:

您需要使用居中的窗口函数,以便窗口信号为零相位, 即它在窗口中间完全对称。 在这种情况下,您可以使用 hann 窗口,它是具有非零端点的升余弦窗口。

D = librosa.stft(samples, n_fft=nperseg, 
                 hop_length=overlap, win_length=nperseg,
                 window=scipy.signal.windows.hann)

spect, _ = librosa.magphase(D)

audio_signal = librosa.griffinlim(spect, n_iter=1024, 
                                  win_length=nperseg, hop_length=overlap, 
                                  window=signal.windows.hann)
print(audio_signal, audio_signal.shape)
sf.write('test.wav', audio_signal, sample_rate)

【讨论】:

【参考方案2】:

您应该使用基于神经网络的声码器(如 WaveNet)进行重建

【讨论】:

以上是关于如何消除 librosa griffin lim 引入的失真?的主要内容,如果未能解决你的问题,请参考以下文章

Apache griffin的搭建及应用

如何从 librosa 中的 mel 频谱图重建 STFT 矩阵,以便重建原始音频?

如何将 Librosa 频谱图保存为特定尺寸的图像?

到 Librosa 的 AudioSegment

数据质量监控Griffin——使用

librosa.effect.Split结果太奇怪了