从 melspectrogram 重建音频与 librosa 有一些剪裁

Reconstructing audio from a melspectrogram has some clipping with librosa

我在做:


    melspectrogram = librosa.feature.melspectrogram(
        y=samples, sr=sample_rate, window=scipy.signal.hanning, n_fft=n_fft, hop_length=hop_length)

    print('melspectrogram.shape', melspectrogram.shape)
    print(melspectrogram)

    audio_signal = librosa.feature.inverse.mel_to_audio(
        melspectrogram, sr=sample_rate, n_fft=n_fft, hop_length=hop_length, window=scipy.signal.hanning)
    print(audio_signal, audio_signal.shape)

    sf.write('test.wav', audio_signal, sample_rate)

重建的 wav 文件听起来与原始文件非常相似,但有一些轻微的剪辑和音频伪影。有什么方法可以更完美的重构吗?

正如 documentation 所述 mel_to_audio:

This is primarily a convenience wrapper for:

S = librosa.feature.inverse.mel_to_stft(M)
y = librosa.griffinlim(S)

换句话说,生成的 Mel 频谱图用于近似 STFT 幅度。然后使用 Griffin Lim 算法将 STFT 频谱图转换回时域。

从 Mel 到 STFT 频谱图的转换并不是完全无损的(由于构建 Mel 频谱图时使用了 overlapping triangular filters,可能会有重叠的频率范围),从 STFT 幅度频谱图到时域(即音频)当然不完美,因为 STFT 幅度谱图缺少相位信息,必须使用 Griffin Lim 算法对其进行近似。这种近似从来都不是完美的,并且会引入相位伪影(金属“相位”)。

不使用 Mel 尺度,而是简单地使用 STFT 和逆 STFT 会得到更好的结果。但是,一旦在反演之前开始在频域中操作任何东西,您就会 运行 遇到类似的问题,但可能没有使用 Mel 频谱图时那么严重。