首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将MelSpectrogram与torchaudio倒置并获得音频波形?

如何将MelSpectrogram与torchaudio倒置并获得音频波形?
EN

Stack Overflow用户
提问于 2020-11-12 18:06:58
回答 3查看 2.1K关注 0票数 14

我有一个MelSpectrogram是从:

代码语言:javascript
复制
eval_seq_specgram = torchaudio.transforms.MelSpectrogram(sample_rate=sample_rate, n_fft=256)(eval_audio_data).transpose(1, 2)

所以eval_seq_specgram现在有一个size of torch.Size([1, 128, 499]),其中499是时间步数,128是n_mels

我正试图将其倒置,所以我尝试使用GriffinLim,但在此之前,我认为我需要反转melscale,所以我有:

代码语言:javascript
复制
inverse_mel_pred = torchaudio.transforms.InverseMelScale(sample_rate=sample_rate, n_stft=256)(eval_seq_specgram)

inverse_mel_pred有一个size of torch.Size([1, 256, 499])

然后我试着用GriffinLim

代码语言:javascript
复制
pred_audio = torchaudio.transforms.GriffinLim(n_fft=256)(inverse_mel_pred)

但我发现了一个错误:

代码语言:javascript
复制
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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-12-16 13:16:56

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

  1. 当您使用MelSpectrogram = n_ftt = 256创建n_ftt时,将生成256/2+1 =129个垃圾桶
  2. 同时,InverseMelScale以名为斯特夫特的参数作为输入,该参数指示回收箱的数量(因此在您的情况下应该设置为129个)。

顺便提一句,我不明白你为什么需要转置电话,因为根据医生和我的测试

代码语言:javascript
复制
waveform, sample_rate = torchaudio.load('test.wav')
mel_specgram = transforms.MelSpectrogram(sample_rate)(waveform)  # (channel, n_mels, time)

已经返回(通道,n_mels,时间)张量,InverseMelScale想要返回形状张量(…),n_mels,时间)

票数 1
EN

Stack Overflow用户

发布于 2020-12-13 03:53:38

只是看看火炬文件。

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

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

因此,如果你做了256个FFT比inverse_mel_pred的形状应该是[1,129,499]而不是[1,256,499]。要得到这个形状,您应该省略所有负频率箱的每一个光谱图在inverse_mel_pred。我不使用火炬,但通常情况下,垃圾箱是从负频率到正频率(火炬的实用程序只是包装其他工具,所以我相当肯定它也这样做)。因此,要得到所需的形状:

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

然后将它传递给GriffinLim,就像您已经做的那样。

在上面的线上,我可能会偏离一个左右,所以要确保形状是正确的。

票数 1
EN

Stack Overflow用户

发布于 2020-12-13 04:34:01

投入:

specgram (张量)具有形状(…, freq, frames),其中freqn_fft // 2 + 1

因此,如果inverse_mel_pred的大小为torch.Size(1,256,499),则n_fft应(256-1)*2 =510

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64809370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档