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



我使用以下代码在librosa中生成了一个melspectrogram

import os
from matplotlib import pyplot as plt
import librosa
import librosa.display
import pylab
import numpy as np

x, sr = librosa.load('audio/example.wav')
mel = librosa.feature.melspectrogram(x,sr)
P = librosa.power_to_db(mel, ref=np.max)
librosa.display.specshow(P)
pylab.savefig("example.png", bbox_inches=None, pad_inches=0)

据我所知,频谱图只是音频信号的STFT矩阵的视觉表示。我试图重建用于生成光谱图的STFT矩阵,以便使其通过格里芬-林函数。我该怎么做?

使用STFT数据生成光谱图

def generate_spectrogram(x, sr):
X = librosa.stft(x)
Xdb = librosa.amplitude_to_db(abs(X))
fig = plt.figure(figsize=(10, 10), dpi=100, frameon=False)
ax = fig.add_axes([0, 0, 1, 1], frameon=False)
ax.axis('off')
librosa.display.specshow(Xdb, sr=sr, cmap='gray', x_axis='time', y_axis='hz')
plt.savefig('example.png', quality=100, bbox_inches=0, pad_inches=0)
librosa.cache.clear()

我不确定这个问题在这个论坛中的当前形式是否合适(堆栈交换可能更适合(,但由于它与基于DNN的语音合成管道非常相关,我认为扩展一下它是个好主意。

我们不能从梅尔谱图中准确地重建STFT。原因是我们的Mel是STFT的"压缩"版本,其频率来自Mel标度,然后在这些频率下应用(到STFT(三角滤波器。一般来说,我们会丢失从STFT到mel的信息。请参阅这篇优秀的文章以获得详细的解释。

https://haythamfayek.com/2016/04/21/speech-processing-for-machine-learning.html

现在,回到你的问题——我假设你正在以Tacotron[1]的工作方式进行语音合成——为了应用Griffin-Lim,正如你正确指出的那样,我们需要线性声谱图。本文的方法是使用神经网络将Mel转换为STFT。他们称之为后网,因为它在预测梅尔之后充当后处理器。

要建立这个网络,请将地面实况(目标(音频转换为Mels,并创建一个递归网络(CBHG或其他任何网络(,将其转换为STFT等效网络。最大限度地减少这些STFT预测和我们可以从目标音频创建的实际STFT之间的损失。

[1]https://arxiv.org/abs/1703.10135

最新更新