【问题标题】:Can I convert spectrograms generated with librosa back to audio?我可以将使用 librosa 生成的频谱图转换回音频吗?
【发布时间】:2020-07-22 17:55:35
【问题描述】:

我将一些音频文件转换为频谱图并使用以下代码将它们保存到文件中:

import os
from matplotlib import pyplot as plt
import librosa
import librosa.display
import IPython.display as ipd

audio_fpath = "./audios/"
spectrograms_path = "./spectrograms/"
audio_clips = os.listdir(audio_fpath)

def generate_spectrogram(x, sr, save_name):
    X = librosa.stft(x)
    Xdb = librosa.amplitude_to_db(abs(X))
    fig = plt.figure(figsize=(20, 20), dpi=1000, 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(save_name, quality=100, bbox_inches=0, pad_inches=0)
    librosa.cache.clear()

for i in audio_clips:
    audio_fpath = "./audios/"
    spectrograms_path = "./spectrograms/"
    audio_length = librosa.get_duration(filename=audio_fpath + i)
    j=60
    while j < audio_length:
        x, sr = librosa.load(audio_fpath + i, offset=j-60, duration=60)
        save_name = spectrograms_path + i + str(j) + ".jpg"
        generate_spectrogram(x, sr, save_name)
        j += 60
        if j >= audio_length:
            j = audio_length
            x, sr = librosa.load(audio_fpath + i, offset=j-60, duration=60)
            save_name = spectrograms_path + i + str(j) + ".jpg"
            generate_spectrogram(x, sr, save_name)

我想保留音频的最细节和质量,这样我就可以将它们转回音频而不会造成太多损失(每个都是 80MB)。

是否可以将它们转回音频文件?我该怎么做?

我尝试使用 librosa.feature.inverse.mel_to_audio,但它不起作用,我认为它不适用。

我现在有 1300 个频谱图文件,想用它们训练一个生成对抗网络,这样我就可以生成新的音频,但如果我以后不能听到结果,我不想这样做。

【问题讨论】:

  • 不是真的 - 你已经丢掉了很多信息(所有阶段,以及一些幅度)。
  • @PaulR STFT 通常包含大量可用于估计相位的冗余信息。它几乎不是完美的,但如果你将 Griffin-Lim 算法与例如在生成深度神经网络方面取得了进展,它可以变得相当不错。
  • @LukaszTracewski:非常有趣 - OP 只是保存对数幅度谱(不确定这是否被量化?) - 你认为这仍然有效吗?
  • @PaulR 这是一个有效的点,完全逆变换是不可能的(由于在amplitude_to_db 中应用了阈值并且保存为有损格式(jpeg)。话虽如此,除非 OP 正在处理一些极端情况下,这应该不是大问题。OP希望“与他们一起训练生成对抗网络,以便我可以生成新的音频”,无论如何这不是一个精确的数学。结合例如tensorflow / magenta和OP是一个好的开始。
  • 谢谢 - 非常有趣。

标签: python audio signal-processing spectrogram librosa


【解决方案1】:

是的,可以恢复大部分信号并估计相位,例如格里芬-林算法 (GLA)。它对 Python 的“快速”实现可以在librosa 中找到。使用方法如下:

import numpy as np
import librosa

y, sr = librosa.load(librosa.util.example_audio_file(), duration=10)
S = np.abs(librosa.stft(y))
y_inv = librosa.griffinlim(S)

这就是原始和重建的样子:

该算法默认随机初始化相位,然后迭代正向和反向 STFT 操作以估计相位。

查看您的代码,重构信号,您只需要这样做:

import numpy as np

X_inv = librosa.griffinlim(np.abs(X))

这当然只是一个例子。正如@PaulR 所指出的,在您的情况下,您需要从jpeg 加载数据(这是有损的!),然后首先对amplitude_to_db 应用逆变换。

由于人工神经网络的进步,该算法,尤其是相位估计,可以进一步改进。 Here 是一篇讨论一些增强功能的论文。

【讨论】:

  • @RamonGriffo 祝你好运!将质量设置为 100 通常不会为您提供无损压缩,请参见例如此答案了解详情stackoverflow.com/questions/7982409/… 如果您负担得起空间,请使用无损格式。我经常选择 HDF5,可以选择高压缩。如果这回答了您的问题,请接受答案 - 谢谢!
  • 您是否了解如何将 jpg 图像加载/转换为频谱图?,我认为这个答案不能完全回答这部分。
  • @materialvision 那是因为没有明确的方法可以做到这一点。你怎么知道图像的色阶如何转化为幅度?对于灰度图像,您至少知道相对差异,因此恢复信号并不是什么大问题。
  • @LukaszTracewski 谢谢,关于如何使用灰度图像进行操作的提示也会很棒。我可以在 mel 对象上做 griffinlim,但不能直接在 mel 的图像上做......所以我正在寻找一种方法来扭转这个过程。首先生成频谱图的图像,训练模型(使用不同的基于现有图像的 GANS)并生成结果图像,然后将新图像转换回声音。最后一部分是问题所在。
  • 这适用于频谱图的图像吗?如果我有图像,请将图像作为输入传递并从中获取音频。能否请您分享相同的代码 sn-p。
猜你喜欢
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 2020-03-22
  • 2017-08-31
相关资源
最近更新 更多