为什么InverseMelScale火炬音频功能这么慢?



我目前正在探索和学习音乐/音频生成的机器学习,我已经在第一步失败了。我的想法是在音频上使用基于图像的学习算法。为此,我想将音频转换为MEL谱图,然后应用机器学习的东西。然后,当模型被训练时,它显然应该再次生成音乐,这将是MEL谱图。所以我必须将MEL谱图转换回音频。

使用pytorchtorchaudio框架直接生成MEL谱图:

waveform, _ = torchaudio.load(os.path.join(folder, "drums.mp3"), normalize=True, format="mp3")
waveform = waveform.to(device)
mel_spectrogram_transform = torchaudio.transforms.MelSpectrogram(sample_rate=44100, hop_length=512, n_fft=2048, n_mels=512, f_max=16384).to(device)
mel_spectrogram = mel_spectrogram_transform(waveform)

为了能够将谱图保存为图像,还有一些预处理步骤,但为了简短起见,我在这里跳过它。让我头疼的是反步骤。torchaudio有一个函数,InverseMelScale。但它缓慢得令人痛苦。下面是代码:

inverse_melscale_transform = torchaudio.transforms.InverseMelScale(sample_rate=44100, n_mels=512, n_stft=2048 // 2 + 1).to(device)  
mel_spectrogram = mel_spectrogram.to(device)
spectrogram = inverse_melscale_transform(mel_spectrogram)

再次,我在这里省略了一些步骤,例如,使用GriffinLimspectrogram获取实际音频。

以下是我目前所做的:我在我的MacBook Pro (Intel)上运行代码,花了很长时间。然后我在一台256核的AMD Ryzen服务器上测试了它,我能在几分钟内得到结果。现在我的想法是使用GPU,在这种情况下是Titan XP,以更快地获得结果,但即使在使用100% GPU的情况下进行了30分钟的计算,也没有任何结果。

我做错了什么?为什么AMD的Ryzen要快得多?

目前,InverseMelScale使用SGD作为推理实现,即在InverseMelScale内部定义损失函数并运行优化器。

这种实现不仅效率低下,而且不准确。

选择这个实现的原因,您可以查看https://github.com/pytorch/audio/pull/366.

建议使用L-BFGS-B优化器https://github.com/pytorch/audio/issues/2643

最新更新