我目前正在探索和学习音乐/音频生成的机器学习,我已经在第一步失败了。我的想法是在音频上使用基于图像的学习算法。为此,我想将音频转换为MEL谱图,然后应用机器学习的东西。然后,当模型被训练时,它显然应该再次生成音乐,这将是MEL谱图。所以我必须将MEL谱图转换回音频。
使用pytorch
的torchaudio
框架直接生成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)
再次,我在这里省略了一些步骤,例如,使用GriffinLim
从spectrogram
获取实际音频。
我做错了什么?为什么AMD的Ryzen要快得多?
目前,InverseMelScale使用SGD作为推理实现,即在InverseMelScale内部定义损失函数并运行优化器。
这种实现不仅效率低下,而且不准确。
选择这个实现的原因,您可以查看https://github.com/pytorch/audio/pull/366.
建议使用L-BFGS-B优化器https://github.com/pytorch/audio/issues/2643