音声認識、話者識別や音環境分類などの入力特徴量としてよく使われるメルスペクトログラム (Mel Spectrogram)を、Pythonで時間波形から変換する方法について、PyTorchとlibrosa二つのライブラリを見ていきます。
メルスペクトログラムに変換するサンプル音源を、以下コードを実行して、_sample_dataフォルダにダウンロードします。また、スペクトログラム表示用の関数plot_melspectrogram
を定義します。
import os
import requests
import librosa
import matplotlib.pyplot as plt
# 音声の保存
_SAMPLE_DIR = "_sample_data"
SAMPLE_WAV_URL = "https://pytorch-tutorial-assets.s3.amazonaws.com/VOiCES_devkit/source-16k/train/sp0307/Lab41-SRI-VOiCES-src-sp0307-ch127535-sg0042.wav"
SAMPLE_WAV_PATH = os.path.join(_SAMPLE_DIR, "speech.wav")
os.makedirs(_SAMPLE_DIR, exist_ok=True)
with open(SAMPLE_WAV_PATH, 'wb') as f:
f.write(requests.get(SAMPLE_WAV_URL).content)
# メルスペクトログラム表示用関数
def plot_melspectrogram(spec, title=None, ylabel="freq_bin", aspect="auto", xmax=None):
fig, axs = plt.subplots(1, 1)
axs.set_title(title or "Spectrogram (db)")
axs.set_ylabel(ylabel)
axs.set_xlabel("frame")
im = axs.imshow(librosa.power_to_db(spec), origin="lower", aspect=aspect)
if xmax:
axs.set_xlim((0, xmax))
fig.colorbar(im, ax=axs)
plt.show(block=False)
torchaudio.transforms.MelSpectrogramの使い方
PyTorchでは、torchaudio.transforms.MelSpectrogramを用いることで、時間波形をメルスペクトログラムに変換することができる。sample_rateは時間波形のサンプリング周波数、n_melsはメルフィルタバンクのバンド数、n_fftはFFTのタップサイズ、win_lengthは窓関数のサイズ、hop_lengthはシフトするサイズ、window_fnは窓関数を指定する。
- 関連記事 – PyTorchで音声/音楽データを読み込むtorchaudio.load
- torchaudio.transforms.MelSpectrogram – v 0.11.0 Torchaudio Documentation
- PyTorchで用意されている窓関数 – v 1.11.0 PyTorch Documentation
import torch
import torchaudio
import torchaudio.transforms as T
waveform, sample_rate = torchaudio.load(filepath=SAMPLE_WAV_PATH)
sample_rate=sample_rate
n_mels = 40
n_fft = 1024
win_length = None
hop_length = 512
window_fn = torch.hann_window
spectrogram = T.MelSpectrogram(
sample_rate=sample_rate,
n_fft=n_fft,
n_mels=n_mels,
win_length=win_length,
hop_length=hop_length,
window_fn=window_fn,
power=2.0,
)
spec = spectrogram(waveform)
plot_melspectrogram(spec[0], title='torchaudio')
librosa.feature.melspectrogramの使い方
librosaでは、librosa.feature.melspectrogramを用いることで、時間波形をメルスペクトログラムに変換することができる。srは時間波形のサンプリング周波数、n_melsはメルフィルタバンクのバンド数、n_fftはFFTのタップサイズ、win_lengthは窓関数のサイズ、hop_lengthはシフトするサイズ、window_fnは窓関数を指定する。
- 関連記事 – librosaで音声/音楽データを読み込むlibrosa.load【Python】
- librosa.feature.melspectrogram – librosa API documentation
- Window functions – SciPy API reference
import numpy as np
waveform, sample_rate = librosa.load(SAMPLE_WAV_PATH, sr=None, mono=False)
sr = sample_rate
n_mels = 40
n_fft = 1024
win_length = None
hop_length = 512
window_fn = 'hann'
spec = librosa.feature.melspectrogram(y=waveform, sr=sr, n_mels=n_mels, n_fft=n_fft, hop_length=hop_length, win_length=win_length, window=window_fn)
plot_melspectrogram(spec, title='librosa')
コメント