将谱图PNG转换为WAV音频
我正在做一个比较特殊的任务,但一直没能完成。我有一堆音频文件,我把它们转换成了频谱图的PNG格式(就是时间和频率的图表,我用plt保存的)。现在我在训练一个生成对抗网络(GAN),希望它能生成类似的频谱图,然后再把这些生成的频谱图转换回音频的.wav文件。
这是我用来获取频谱图的代码:
y, sr = librosa.load(wav_file, sr=rate, duration=1)
stft = librosa.stft(y, n_fft=n_fft, hop_length=hop_length, win_length=win_length)
mag_spectrogram, phase_spectrogram = librosa.magphase(stft)
plt.figure(figsize=(10, 4))
librosa.display.specshow(librosa.amplitude_to_db(np.abs(mag_spectrogram), ref=np.max), sr=sr, hop_length=hop_length, x_axis='time', y_axis='linear')
plt.gca().set_title('')
plt.colorbar().remove()
plt.axis('off')
plt.savefig("saved_mag_spec.png", bbox_inches='tight', pad_inches=0)
我该如何加载这些频谱图,使得我可以仅凭这些频谱图重建音频呢?
我明白,使用这个图作为频谱图并不完全正确,因为最终恢复音频时可能会有问题。我认为如果我能记录下每个频谱图的相位信息,使用istft方法,甚至可以恢复音频。
问题是,幅度频谱图或短时傅里叶变换(stft)的输出基本上是以(频率区间,帧)的形式存在。当我用librosa.specshow把它转换成PNG频谱图时,我改变了频谱图的大小和形状,使其变成了时间和频率的分布。那么,我该如何将这个图像加载回来,并保持相位信息,以便我可以利用这些频谱图信息生成音频呢?
1 个回答
0
看起来你让自己的事情变得比实际需要的要复杂。为什么一开始要把GAN的结果转换成PNG文件呢?
你应该让GAN直接生成可以用istft
处理的结果,比如短时傅里叶变换(stft)或者声谱图(spectrograms)。你需要用np.exp
把声谱图转换成短时傅里叶变换。你可以生成两个通道的声谱图,分别表示短时傅里叶变换的实部和虚部。如果有足够的数据,GAN应该能学会如何生成“正确”的相位。
另一个想法是使用另一个神经网络模型,来学习如何“恢复”声谱图的相位。需要注意的是,你实际上无法恢复原始的相位,因为在用abs
操作后,相位信息就永远丢失了。但你可以生成一些听起来还不错的东西。