14

我有一个MelSpectrogram生成自:

eval_seq_specgram = torchaudio.transforms.MelSpectrogram(sample_rate=sample_rate, n_fft=256)(eval_audio_data).transpose(1, 2)

所以eval_seq_specgram现在有一个sizetorch.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_predsize一个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

不知道我做错了什么或如何解决这个问题。

4

3 回答 3

1

只需查看 Torch 文档即可。

格里菲斯重建的输入形状应该是

(...,freq,frame). 这里 freq 是n_fft/2 + 1(大概它省略了负频率)。

因此,如果你做了 256 FFT,那么形状inverse_mel_pred应该[1,129,499]不是[1,256,499]. 要获得这种形状,您应该省略inverse_mel_pred. 我不使用 Torch,但通常这些垃圾箱是从负频率到正频率排序的(并且 Torch 的实用程序只是其他工具的包装,所以我相当确定它也是如此)。因此要获得所需的形状:

inverse_mel_pred = inverse_mel_pred[:,128::,:]

GriffinLim然后像你已经做的那样传递它。

我可能在上面一行中偏离了一个左右,所以请确保形状正确。

于 2020-12-13T03:53:38.073 回答
1

输入:

specgram(Tensor) 的形状为(…, freq, frames),其中freqn_fft // 2 + 1

所以如果inverse_mel_pred有一个尺寸为 torch.Size([1, 256, 499]),n_fft应该 (256 - 1) * 2 =510

于 2020-12-13T04:34:01.483 回答
1

通过查看文档并在 colab 上进行快速测试,似乎:

  1. 当您使用n_ftt = 256 创建 MelSpectrogram 时,将生成256/2+1 = 129 个 bin
  2. 同时 InverseMelScale 将名为n_stft的参数作为输入,该参数指示 bin 的数量(因此在您的情况下应设置为 129)

作为旁注,我不明白你为什么需要转置调用,因为根据文档和我的测试

waveform, sample_rate = torchaudio.load('test.wav')
mel_specgram = transforms.MelSpectrogram(sample_rate)(waveform)  # (channel, n_mels, time)

已经返回一个 (channel, n_mels, time) 张量,而InverseMelScale 想要一个形状为 (..., n_mels, time) 的张量

于 2020-12-16T13:16:56.043 回答