我有一个MelSpectrogram
生成自:
eval_seq_specgram = torchaudio.transforms.MelSpectrogram(sample_rate=sample_rate, n_fft=256)(eval_audio_data).transpose(1, 2)
因此eval_seq_specgram
现在具有torch.Size([1, 128, 499])
的size
,其中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
具有torch.Size([1, 256, 499])
的size
然后我尝试使用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条答案
按热度按时间eit6fx6z1#
通过查看文档并对colab进行快速测试,可以看出:
1.创建 n_ftt = 256的梅尔谱图时,将生成256/2+1 = 129个箱
1.同时,InverseMelScale将名为n_stft的参数作为输入,该参数表示bin的数量(因此在您的情况下应设置为129)
顺便说一句,我不明白为什么需要转置调用,因为根据文档和我的测试
已返回(通道、n_mels、时间)Tensor,而InverseMelScale需要形状的Tensor(...、n_mels、时间)
7kqas0il2#
只是从看 Torch 文件。
Griffith重建的输入形状应为
这里freq是
n_fft/2 + 1
(假定它省略了负频率)。因此,如果执行256 FFT,则
inverse_mel_pred
的形状应为[1,129,499]
,而不是[1,256,499]
。要获得此形状,只需忽略inverse_mel_pred
中每个谱图的所有负频率单元。我不使用Torch,但是通常仓从负频率到正频率排序(Torch的实用程序只是其他工具的 Package 器,所以我相当肯定它也是这样做的)。因此,要获得所需的形状:inverse_mel_pred = inverse_mel_pred[:,128::,:]
然后像之前一样将其传递给
GriffinLim
。我可能会关闭了一个左右,在上面的行,所以请确保形状是正确的。
zz2j4svz3#
输入:
specgram
(Tensor)的形状为(…, freq, frames)
,其中freq
为n_fft // 2 + 1
因此,如果
inverse_mel_pred
的大小为torch.Size([1,256,499]),则n_fft
应该为(256 - 1)* 2 =510agxfikkp4#
仅用于历史,完整代码:
还有
x一个一个一个一个x一个一个二个x