python - 如何从 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 矩阵,以便将其传递给 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, 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。他们称之为 postnet,因为它在预测 Mels 后用作后处理器。
为了建立这个网络,将真实(目标)音频转换为 Mels,并创建一个循环网络(CBHG 或其他任何东西)将其转换为 STFT 等价物。最小化这些 STFT 预测与我们可以从目标音频创建的实际 STFT 之间的损失。
推荐阅读
- apache-spark - 为什么我在 Spark 中得到类型不匹配?
- python - Python 线程 - 内存不足
- python - 为什么我在 Python 中计算 textwrap 模块时在输出末尾得到“无”?
- python - 将 for 循环变量传递给新函数
- list - Prolog 读取文件并将数据用作不同功能的输入
- python - 获取 Tkinter 上的顶级列表
- git - 如何从不再存在的周期性中跳过 github url?
- python - Python:字符串到 CamelCase
- python - 用 beautifulsoup 提取一个 img URL
- apache-spark - Apache Spark:爆炸导致随机溢出