pytorch 如何使用torchaudio反转梅尔谱图并获得音频波形?

llycmphe  于 2023-03-18  发布在  其他
关注(0)|答案(4)|浏览(449)

我有一个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

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

eit6fx6z

eit6fx6z1#

通过查看文档并对colab进行快速测试,可以看出:
1.创建 n_ftt = 256的梅尔谱图时,将生成256/2+1 = 129个箱
1.同时,InverseMelScale将名为n_stft的参数作为输入,该参数表示bin的数量(因此在您的情况下应设置为129)
顺便说一句,我不明白为什么需要转置调用,因为根据文档和我的测试

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

已返回(通道、n_mels、时间)Tensor,而InverseMelScale需要形状的Tensor(...、n_mels、时间)

7kqas0il

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
我可能会关闭了一个左右,在上面的行,所以请确保形状是正确的。

zz2j4svz

zz2j4svz3#

输入:
specgram(Tensor)的形状为(…, freq, frames),其中freqn_fft // 2 + 1
因此,如果inverse_mel_pred的大小为torch.Size([1,256,499]),则n_fft应该为(256 - 1)* 2 =510

agxfikkp

agxfikkp4#

仅用于历史,完整代码:

import torch
import torchaudio
import IPython

waveform, sample_rate = torchaudio.load("wavs/LJ030-0196.wav", normalize=True)

n_fft = 256

n_stft = int((n_fft//2) + 1)
transofrm = torchaudio.transforms.MelSpectrogram(sample_rate, n_fft=n_fft)
invers_transform = torchaudio.transforms.InverseMelScale(sample_rate=sample_rate, n_stft=n_stft)
grifflim_transform = torchaudio.transforms.GriffinLim(n_fft=n_fft)

mel_specgram = transofrm(waveform)
inverse_waveform = invers_transform(mel_specgram)
pseudo_waveform = grifflim_transform(inverse_waveform)

还有
x一个一个一个一个x一个一个二个x

相关问题