Skip to content

[PyTorch] Audio: PyTorch 中的音訊處理模組 torchaudio

正如同大家所熟悉的那樣,torchvision 是 PyTorch 內專門用來處理圖片的模組 —— 那麼我今天要筆記的 torchaudio,便是 PyTorch 中專門用來處理『音訊』的模組。

能夠處理文字、圖片、音訊 …… PyTorch 真的是個相當方便的深度學習框架呢!

一如既往,附上官方的教學,若是感興趣,直接閱讀官方的教學想必是好的:Pytorch tutorial


torchaudio 介紹

順帶一提 torchaudio 是需要另外下載的,並沒有包在 PyTorch 本體當中。若是第一次使用,要使用以下指令下載:

pip3 install torchaudio

下載時可能需要點時間,請耐心等候。

# -*- coding: utf-8 -*-
import torchaudio
import matplotlib.pyplot as plt
import requests



首先,我們需要匯入所有我們需要的模組。

# Test music
fileName = 'test.wav'
url = "https://pytorch.org/tutorials//_static/img/steam-train-whistle-daniel_simon-converted-from-mp3.wav"
r = requests.get(url)

# Save
with open(fileName, 'wb') as f:
    f.write(r.content)



這是官方給的測試音檔,要使用自己的也可以。我直接將檔案存成 test.wav。不過根據官方給的說明,torchaudio 只支援 wav 以及 mp3,這方面可能要稍微小心一點。


繪製波形圖

waveform, sample_rate = torchaudio.load(fileName)

print('Shape of waveform: {}'.format(waveform.size()))
print('Sample rate of waveform: {}'.format(sample_rate))

plt.figure()
plt.plot(waveform.t().numpy())
plt.show()



Output:

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

其實也並不一定要使用 numpy() 來轉成 numpy,使用原本的 tensor 資料型態就可以了。最重要的是要使用 t() 來轉置,這樣一來才是一個維度裡面包含著兩個數值,我們才能會製成波形。

  • waveform: 按照官網的解釋,為『原始音訊信號』。
  • sample_rate 為『採樣率』,這裡看到的是 44100 Hz,常被用來當作 CD 的採樣率。

另外,我們也能重新採樣:

new_sample_rate = sample_rate/10
channel = 0
transformed = torchaudio.transforms
transformed = transformed.Resample(sample_rate, new_sample_rate)
transformed = transformed(waveform[channel, :].view(1, -1))
print('Shape of transformed waveform:', transformed.size())

plt.figure()
plt.plot(transformed[0, :].numpy())
plt.show()



Output:

Shape of transformed waveform: torch.Size([1, 27686])
tensor([ 4.5531e-03,  1.6837e-02,  8.0987e-03,  …, -5.0898e-06, 6.0601e-06,  2.6707e-05])

頻譜圖

頻譜,顧名思義,便是『時域』的訊號在『頻域』的表示方法,通常通過『傅立葉轉換』而轉成。通常振幅是 y 軸、頻率為 x 軸。

# Spectrogram
specgram = torchaudio.transforms.Spectrogram()(waveform)
print('Shape of spectrogram:', specgram.size())

plt.figure()
plt.imshow(specgram.log2()[0, :, :].numpy())
plt.show()



Output:

Shape of transformed waveform: torch.Size([1, 27686])
tensor([ 4.5531e-03,  1.6837e-02,  8.0987e-03,  …, -5.0898e-06,
         6.0601e-06,  2.6707e-05])

後記

基本上,我只 follow 了幾個我可能會用到的功能;至於 torchaudio 提供的許多 transform 技術,我想我會找時間完整的紀錄一篇,不該跟這篇簡單介紹視覺化之後的音訊檔案混在一起。

官方 PyTorch 的教學底下,還有著像 Mel Spectrogram 之類的繪圖教學;不過我可能暫時比較不會用到。

值得記敘的是,官方教學的底下提到了 Kaldi 這個 Package —— 糟糕,我完全不熟啊!看來是個知名的 Python 音訊處理套件?我想我有空的話應該多研究一下這個套件。


Read More

Leave a Reply