torchaudio教程

译者:片刻

校验:片刻

PyTorch是一个开源深度学习平台,提供了从研究原型到具有GPU支持的生产部署的无缝路径。

解决机器学习问题的巨大努力在于数据准备。torchaudio利用PyTorch的GPU支持,并提供许多工具来简化数据加载并使其更具可读性。在本教程中,我们将看到如何从简单的数据集中加载和预处理数据。

对于本教程,请确保matplotlib已安装该软件包, 以方便查看。

  1. import torch
  2. import torchaudio
  3. import matplotlib.pyplot as plt

打开数据集

torchaudio支持以wav和mp3格式加载声音文件。我们将波形称为原始音频信号。

  1. filename = "https://pytorch.org/tutorials/_static/img/steam-train-whistle-daniel_simon-converted-from-mp3.wav"
  2. waveform, sample_rate = torchaudio.load(filename)
  3. print("Shape of waveform: {}".format(waveform.size()))
  4. print("Sample rate of waveform: {}".format(sample_rate))
  5. plt.figure()
  6. plt.plot(waveform.t().numpy())

https://pytorch.org/tutorials/_images/sphx_glr_audio_preprocessing_tutorial_001.png

日期:

  1. Shape of waveform: torch.Size([2, 276858])
  2. Sample rate of waveform: 44100

转换 torchaudio支持越来越多的 转换

  • Resample :将波形重采样为其他采样率。
  • Spectrogram :根据波形创建频谱图。
  • MelScale :使用转换矩阵将普通STFT转换为Mel频率STFT。
  • AmplitudeToDB :这将频谱图从功率/振幅标度转换为分贝标度。
  • MFCC :从波形创建梅尔频率倒谱系数。
  • MelSpectrogram :使用PyTorch中的STFT功能从波形创建MEL频谱图。
  • MuLawEncoding :基于mu-law压扩对波形进行编码。
  • MuLawDecoding :解码mu-law编码的波形。

由于所有变换都是nn.Modules或jit.ScriptModules,因此它们可以随时用作神经网络的一部分。

首先,我们可以以对数刻度查看频谱图的对数。

  1. specgram = torchaudio.transforms.Spectrogram()(waveform)
  2. print("Shape of spectrogram: {}".format(specgram.size()))
  3. plt.figure()
  4. plt.imshow(specgram.log2()[0,:,:].numpy(), cmap='gray')

https://pytorch.org/tutorials/_images/sphx_glr_audio_preprocessing_tutorial_002.png

Out:

  1. Shape of spectrogram: torch.Size([2, 201, 1385])

或者我们可以以对数刻度查看梅尔光谱图。

  1. specgram = torchaudio.transforms.MelSpectrogram()(waveform)
  2. print("Shape of spectrogram: {}".format(specgram.size()))
  3. plt.figure()
  4. p = plt.imshow(specgram.log2()[0,:,:].detach().numpy(), cmap='gray')

https://pytorch.org/tutorials/_images/sphx_glr_audio_preprocessing_tutorial_003.png

Out:

  1. Shape of spectrogram: torch.Size([2, 128, 1385])

我们可以一次对一个通道重新采样波形。

  1. new_sample_rate = sample_rate/10
  2. # Since Resample applies to a single channel, we resample first channel here
  3. channel = 0
  4. transformed = torchaudio.transforms.Resample(sample_rate, new_sample_rate)(waveform[channel,:].view(1,-1))
  5. print("Shape of transformed waveform: {}".format(transformed.size()))
  6. plt.figure()
  7. plt.plot(transformed[0,:].numpy())

https://pytorch.org/tutorials/_images/sphx_glr_audio_preprocessing_tutorial_004.png

Out:

  1. Shape of transformed waveform: torch.Size([1, 27686])

作为变换的另一个示例,我们可以基于Mu-Law编码对信号进行编码。但是要这样做,我们需要信号在-1和1之间。由于张量只是常规的PyTorch张量,因此我们可以在其上应用标准运算符。

  1. # Let's check if the tensor is in the interval [-1,1]
  2. print("Min of waveform: {}\nMax of waveform: {}\nMean of waveform: {}".format(waveform.min(), waveform.max(), waveform.mean()))

Out:

  1. Min of waveform: -0.572845458984375
  2. Max of waveform: 0.575958251953125
  3. Mean of waveform: 9.293758921558037e-05

由于波形已经在-1和1之间,因此我们不需要对其进行归一化。

  1. def normalize(tensor):
  2. # Subtract the mean, and scale to the interval [-1,1]
  3. tensor_minusmean = tensor - tensor.mean()
  4. return tensor_minusmean/tensor_minusmean.abs().max()
  5. # Let's normalize to the full interval [-1,1]
  6. # waveform = normalize(waveform)

让我们对波形进行编码。

  1. transformed = torchaudio.transforms.MuLawEncoding()(waveform)
  2. print("Shape of transformed waveform: {}".format(transformed.size()))
  3. plt.figure()
  4. plt.plot(transformed[0,:].numpy())

https://pytorch.org/tutorials/_images/sphx_glr_audio_preprocessing_tutorial_005.png

Out:

  1. Shape of transformed waveform: torch.Size([2, 276858])

现在解码。

  1. reconstructed = torchaudio.transforms.MuLawDecoding()(transformed)
  2. print("Shape of recovered waveform: {}".format(reconstructed.size()))
  3. plt.figure()
  4. plt.plot(reconstructed[0,:].numpy())

https://pytorch.org/tutorials/_images/sphx_glr_audio_preprocessing_tutorial_006.png

Out:

  1. Shape of recovered waveform: torch.Size([2, 276858])

我们最终可以将原始波形与其重构版本进行比较。

  1. # Compute median relative difference
  2. err = ((waveform-reconstructed).abs() / waveform.abs()).median()
  3. print("Median relative difference between original and MuLaw reconstucted signals: {:.2%}".format(err))

Out:

  1. Median relative difference between original and MuLaw reconstucted signals: 1.28%

从Kaldi迁移到Torchaudio

用户可能熟悉 语音识别工具包Kaldi。torchaudio在中提供与之的兼容性 torchaudio.kaldi_io。实际上,它可以通过以下方式从kaldi scp或ark文件或流中读取:

  • read_vec_int_ark
  • read_vec_flt_scp
  • read_vec_flt_arkfile /流
  • read_mat_scp
  • read_mat_ark

torchaudio为GPU提供支持 spectrogram 并 fbank受益于Kaldi兼容的转换,请参见此处以获取更多信息。

  1. n_fft = 400.0
  2. frame_length = n_fft / sample_rate * 1000.0
  3. frame_shift = frame_length / 2.0
  4. params = {
  5. "channel": 0,
  6. "dither": 0.0,
  7. "window_type": "hanning",
  8. "frame_length": frame_length,
  9. "frame_shift": frame_shift,
  10. "remove_dc_offset": False,
  11. "round_to_power_of_two": False,
  12. "sample_frequency": sample_rate,
  13. }
  14. specgram = torchaudio.compliance.kaldi.spectrogram(waveform, **params)
  15. print("Shape of spectrogram: {}".format(specgram.size()))
  16. plt.figure()
  17. plt.imshow(specgram.t().numpy(), cmap='gray')

https://pytorch.org/tutorials/_images/sphx_glr_audio_preprocessing_tutorial_007.png

Out:

  1. Shape of spectrogram: torch.Size([1383, 201])

我们还支持根据波形计算滤波器组特征,与Kaldi的实现相匹配。

  1. fbank = torchaudio.compliance.kaldi.fbank(waveform, **params)
  2. print("Shape of fbank: {}".format(fbank.size()))
  3. plt.figure()
  4. plt.imshow(fbank.t().numpy(), cmap='gray')

https://pytorch.org/tutorials/_images/sphx_glr_audio_preprocessing_tutorial_008.png

Out:

  1. Shape of fbank: torch.Size([1383, 23])

结论

我们使用示例原始音频信号或波形来说明如何使用torchaudio打开音频文件,以及如何预处理和转换此类波形。鉴于torchaudio是基于PyTorch构建的,则这些技术可在利用GPU的同时用作更高级音频应用(例如语音识别)的构建块。

脚本的总运行时间: (0分钟2.343秒)

Download Python source code: audio_preprocessing_tutorial.py

Download Jupyter notebook: audio_preprocessing_tutorial.ipynb