我已经使用以下代码在librosa中生成了质谱图

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矩阵,以使其通过格里芬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, 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之后,它充当了后处理器。
要设置此网络,请将地面真相(目标)音频转换为Mels,然后创建循环网络(CBHG或其他任何形式)以将其转换为STFT等效形式。最小化这些STFT预测与我们可以从目标音频创建的实际STFT之间的损耗。
[1] https://arxiv.org/abs/1703.10135

关于python - 如何从librosa中的梅尔声谱图重建STFT矩阵,以便重建原始音频?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63663865/

10-15 17:42