【发布时间】: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