如何使用 torchaudio 反转 MelSpectrogram 并获得音频波形?
How can I invert a MelSpectrogram with torchaudio and get an audio waveform?
我有一个 MelSpectrogram
生成自:
eval_seq_specgram = torchaudio.transforms.MelSpectrogram(sample_rate=sample_rate, n_fft=256)(eval_audio_data).transpose(1, 2)
所以 eval_seq_specgram
现在的 size
为 torch.Size([1, 128, 499])
,其中 499 是时间步数,128 是 n_mels
。
我正在尝试反转它,所以我尝试使用 GriffinLim
,但在此之前,我想我需要反转 melscale
,所以我有:
inverse_mel_pred = torchaudio.transforms.InverseMelScale(sample_rate=sample_rate, n_stft=256)(eval_seq_specgram)
inverse_mel_pred
的 size
为 torch.Size([1, 256, 499])
然后我尝试使用 GriffinLim
:
pred_audio = torchaudio.transforms.GriffinLim(n_fft=256)(inverse_mel_pred)
但我得到一个错误:
Traceback (most recent call last):
File "evaluate_spect.py", line 63, in <module>
main()
File "evaluate_spect.py", line 51, in main
pred_audio = torchaudio.transforms.GriffinLim(n_fft=256)(inverse_mel_pred)
File "/home/shamoon/.local/share/virtualenvs/speech-reconstruction-7HMT9fTW/lib/python3.8/site-packages/torch/nn/modules/module.py", line 727, in _call_impl
result = self.forward(*input, **kwargs)
File "/home/shamoon/.local/share/virtualenvs/speech-reconstruction-7HMT9fTW/lib/python3.8/site-packages/torchaudio/transforms.py", line 169, in forward
return F.griffinlim(specgram, self.window, self.n_fft, self.hop_length, self.win_length, self.power,
File "/home/shamoon/.local/share/virtualenvs/speech-reconstruction-7HMT9fTW/lib/python3.8/site-packages/torchaudio/functional.py", line 179, in griffinlim
inverse = torch.istft(specgram * angles,
RuntimeError: The size of tensor a (256) must match the size of tensor b (129) at non-singleton dimension 1
不确定我做错了什么或如何解决这个问题。
仅查看 Torch 文档。
格里菲斯重建的输入形状应该是
(...,freq,frame)
。这里的 freq 是 n_fft/2 + 1
(大概它省略了负频率)。
因此,如果您执行 256 FFT,inverse_mel_pred
的形状应该是 [1,129,499]
而不是 [1,256,499]
。要获得此形状,您应该只省略 inverse_mel_pred
中每个频谱图的所有负频点。我不使用 Torch,但通常这些 bin 是从负频率到正频率排序的(并且 Torch 的实用程序只是其他工具的包装器,所以我相当确定它也是如此)。因此要获得所需的形状:
inverse_mel_pred = inverse_mel_pred[:,128::,:]
然后将其传递给 GriffinLim
,就像您已经做的那样。
我可能在上面的行中偏离了一个左右,所以请确保形状正确。
输入:
specgram
(张量)具有 (…, freq, frames)
的形状,其中 freq
是 n_fft // 2 + 1
所以如果 inverse_mel_pred
的大小为 torch.Size([1, 256, 499]),n_fft
应该 (256 - 1) * 2 =510
通过查看文档并对 colab 进行快速测试,似乎:
- 当您使用 n_ftt = 256 创建 MelSpectrogram 时,会生成 256/2+1 = 129 bins
- 同时 InverseMelScale 将名为 n_stft 的参数作为输入,该参数指示 bin 的数量(因此在您的情况下应设置为 129)
附带说明一下,我不明白你为什么需要转置调用,因为根据文档和我的测试
waveform, sample_rate = torchaudio.load('test.wav')
mel_specgram = transforms.MelSpectrogram(sample_rate)(waveform) # (channel, n_mels, time)
已经returns一个(通道,n_mels,时间)张量
InverseMelScale wants 一个形状为 (…, n_mels, time)
的张量
我有一个 MelSpectrogram
生成自:
eval_seq_specgram = torchaudio.transforms.MelSpectrogram(sample_rate=sample_rate, n_fft=256)(eval_audio_data).transpose(1, 2)
所以 eval_seq_specgram
现在的 size
为 torch.Size([1, 128, 499])
,其中 499 是时间步数,128 是 n_mels
。
我正在尝试反转它,所以我尝试使用 GriffinLim
,但在此之前,我想我需要反转 melscale
,所以我有:
inverse_mel_pred = torchaudio.transforms.InverseMelScale(sample_rate=sample_rate, n_stft=256)(eval_seq_specgram)
inverse_mel_pred
的 size
为 torch.Size([1, 256, 499])
然后我尝试使用 GriffinLim
:
pred_audio = torchaudio.transforms.GriffinLim(n_fft=256)(inverse_mel_pred)
但我得到一个错误:
Traceback (most recent call last):
File "evaluate_spect.py", line 63, in <module>
main()
File "evaluate_spect.py", line 51, in main
pred_audio = torchaudio.transforms.GriffinLim(n_fft=256)(inverse_mel_pred)
File "/home/shamoon/.local/share/virtualenvs/speech-reconstruction-7HMT9fTW/lib/python3.8/site-packages/torch/nn/modules/module.py", line 727, in _call_impl
result = self.forward(*input, **kwargs)
File "/home/shamoon/.local/share/virtualenvs/speech-reconstruction-7HMT9fTW/lib/python3.8/site-packages/torchaudio/transforms.py", line 169, in forward
return F.griffinlim(specgram, self.window, self.n_fft, self.hop_length, self.win_length, self.power,
File "/home/shamoon/.local/share/virtualenvs/speech-reconstruction-7HMT9fTW/lib/python3.8/site-packages/torchaudio/functional.py", line 179, in griffinlim
inverse = torch.istft(specgram * angles,
RuntimeError: The size of tensor a (256) must match the size of tensor b (129) at non-singleton dimension 1
不确定我做错了什么或如何解决这个问题。
仅查看 Torch 文档。
格里菲斯重建的输入形状应该是
(...,freq,frame)
。这里的 freq 是 n_fft/2 + 1
(大概它省略了负频率)。
因此,如果您执行 256 FFT,inverse_mel_pred
的形状应该是 [1,129,499]
而不是 [1,256,499]
。要获得此形状,您应该只省略 inverse_mel_pred
中每个频谱图的所有负频点。我不使用 Torch,但通常这些 bin 是从负频率到正频率排序的(并且 Torch 的实用程序只是其他工具的包装器,所以我相当确定它也是如此)。因此要获得所需的形状:
inverse_mel_pred = inverse_mel_pred[:,128::,:]
然后将其传递给 GriffinLim
,就像您已经做的那样。
我可能在上面的行中偏离了一个左右,所以请确保形状正确。
输入:
specgram
(张量)具有 (…, freq, frames)
的形状,其中 freq
是 n_fft // 2 + 1
所以如果 inverse_mel_pred
的大小为 torch.Size([1, 256, 499]),n_fft
应该 (256 - 1) * 2 =510
通过查看文档并对 colab 进行快速测试,似乎:
- 当您使用 n_ftt = 256 创建 MelSpectrogram 时,会生成 256/2+1 = 129 bins
- 同时 InverseMelScale 将名为 n_stft 的参数作为输入,该参数指示 bin 的数量(因此在您的情况下应设置为 129)
附带说明一下,我不明白你为什么需要转置调用,因为根据文档和我的测试
waveform, sample_rate = torchaudio.load('test.wav')
mel_specgram = transforms.MelSpectrogram(sample_rate)(waveform) # (channel, n_mels, time)
已经returns一个(通道,n_mels,时间)张量 InverseMelScale wants 一个形状为 (…, n_mels, time)
的张量