Last Updated on 2021-05-08 by Clay
正如同大家所熟悉的那樣,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 音訊處理套件?我想我有空的話應該多研究一下這個套件。