我可以将使用 librosa 生成的频谱图转换回音频吗?
Can I convert spectrograms generated with librosa back to audio?
我将一些音频文件转换为频谱图并使用以下代码将它们保存到文件中:
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 个频谱图文件,想用它们训练一个生成对抗网络,这样我就可以生成新的音频,但如果我以后无法听到结果,我不想这样做.
是的,可以恢复大部分信号并估计相位,例如Griffin-Lim 算法 (GLA)。 Python 的 "fast" 实现可以在 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 是一篇讨论一些增强功能的论文。
我将一些音频文件转换为频谱图并使用以下代码将它们保存到文件中:
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 个频谱图文件,想用它们训练一个生成对抗网络,这样我就可以生成新的音频,但如果我以后无法听到结果,我不想这样做.
是的,可以恢复大部分信号并估计相位,例如Griffin-Lim 算法 (GLA)。 Python 的 "fast" 实现可以在 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 是一篇讨论一些增强功能的论文。