问题描述
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矩阵,以使其通过griffin lim函数。我该怎么办?
使用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,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。原因是我们的梅尔是STFT的“压缩”版本,其频率来自梅尔标度,然后在这些频率上应用(到STFT)三角滤波器。通常,我们会丢失从STFT到mel的信息。有关详细说明,请参见这篇出色的文章。
https://haythamfayek.com/2016/04/21/speech-processing-for-machine-learning.html
现在,回到您的问题-我假设您正在按照Tacotron [1]的方式进行语音合成-为了正确应用Griffin Lim,我们需要线性频谱图。本文完成的方法是使用神经网络将Mel转换为STFT。他们将其称为“ postnet”,因为在预测“梅尔斯”之后,它将用作后处理程序。
要设置此网络,请将地面真实(目标)音频转换为Mels,然后创建循环网络(CBHG或其他任何形式)以将其转换为STFT等效形式。最大限度地减少这些STFT预测与我们可以从目标音频创建的实际STFT之间的损失。