機械学習
記事内に商品プロモーションを含む場合があります

Audiomentations|音声データ向けデータ拡張ライブラリを解説

tadanori

Audiomentationsは、オーディオデータ/音声データ向けデータ拡張(data augmentation)ライブラリです。この記事では、Audiomentationsの使い方を解説します。

Audiomentationsとは

Audiomentationsは、オーディオデータ向けのデータ拡張ライブラリです。画像向けデータ拡張ライブラリ”Albumentations”に影響を受けて開発したと書かれていますので、名前も使い方も似ています。

Github: https://github.com/iver56/audiomentations
document: https://iver56.github.io/audiomentations/

あわせて読みたい
物体検出でも使えるAlbumentationsの使い方(画像データ拡張, Data Augmentation)
物体検出でも使えるAlbumentationsの使い方(画像データ拡張, Data Augmentation)
データ拡張(Data Augmentation)とは

データ拡張(Data Augmentation)は、訓練データセット内のサンプル数を増やすために、元のデータを変換・変更する手法です。

データ拡張の主要な目的は、モデルの汎化能力を向上させ、過学習を防ぎ新しいデータに対する性能を向上させることです。これにより、訓練データが限られている場合でも、より強力なモデルを構築できます。

インストール

Autimentationsのインストールは簡単です。

Google Colabでは以下のコードを実行します。

!pip install audiomentations

ローカルな環境では、先頭の!を外した以下のコマンドをコマンドラインで実行します。

pip install audiomentations

基本的な使い方

以下、基本的な使い方です。

まず、ライブラリをインポートします。画像の読み込みにlibrosaを利用したいと思いますので、librosaも一緒にインポートしておきます。

今回は、結果をグラフにして確認しますので、matplotlibとnumpyもインポートしています。

import matplotlib.pyplot as plt
import numpy as np

import audiomentations as A
import librosa

また、以下の関数は結果表示を行うためのものです。

def plot_waves(org, argumented): 
  # orgとargumentedの波形を表示する

  range = np.max([np.max(np.abs(org)), np.max(np.abs(argumented))])
  ave = np.mean(np.concatenate([org, argumented]))
  up, dn = ave + range, ave - range

  plt.figure(figsize=(12, 4))
  plt.subplot(1, 2, 1)
  plt.plot(org)
  plt.ylim(dn, up)
  plt.title('Original Waveform')
  plt.subplot(1, 2, 2)
  plt.plot(argumented)
  plt.ylim(dn, up)
  plt.title('Augmented Waveform')
  plt.show()

def plot_spectrum(s):
    f = np.fft.rfftfreq(len(s))
    plt.loglog(f, np.abs(np.fft.rfft(s)))[0]
    plt.show()

複数のデータ拡張を順番に呼び出す(Compose

Audiomentationsでは、「データ拡張Aの次にデータ拡張Bを実行する」といったように、複数のデータ拡張を組みあせて使うことが多いです。

複数のデータ拡張を順番に実行する場合は、以下のようにComposeを利用します。

以下の例では、AddGaussianNoiseTimeStretchPitchShiftを連続で呼び出しています。また、p=0.5にしていますので、それぞれの処理が行われる確率は1/2になります。

transform = A.Compose([
    A.AddGaussianNoise(min_amplitude=0.001, max_amplitude=0.015, p=0.5),
    A.TimeStretch(min_rate=0.8, max_rate=1.25, p=0.5),
    A.PitchShift(min_semitones=-4, max_semitones=4, p=0.5),
])

wave, sr = librosa.load('test.wav')
augmented_wave = transform(wave, sample_rate=sr)

plot_waves(wave, augmented_wave)
result01

リストに列挙された1つを処理する(OneOf

リストに列挙された処理の1つを選択して処理します。複数の処理のうち、1つを選んで処理したい場合に利用します。

Compose, OneOfは、Albumentationsと使い方はほぼ同じです。

Transforms

ここでは、Audiomentationsが用意している変換のうち、私が使っているごく一部だけを紹介します。ここで紹介した以外にも、audiomentationsではたくさんの変換が用意されています。詳しくは、ドキュメントを確認してください。

下記の例ではp=1.0を設定して、必ず変換が行われるようにしています。データ拡張で使う場合はpを0.5などに設定して、確率的に実行されるようにします。

AddBackgroundNoise

背景ノイズを追加します。この機能では、あらかじめ背景ノイズの音源を用意しておく必要があります。

transform = A.AddBackgroundNoise(sounds_path='sounds', p=1.0)

sr = 16000
wave = np.zeros(sr*5) + 0.001
augmented_wave = transform(wave, sample_rate=sr)

plot_waves(wave, augmented_wave)

無音データに、背景音を加えた例です。

result background noise
主要パラメータ
sound_path背景の音源データへのパス、または、ファイルリスト
min_snr_db最小のsignal to noise ratioをdBで設定
max_snr_db最大のsignal to noise ratioをdBで設定

AddColorNoise

色ノイズを加えます。

主要パラメータ
min_f_decayオクターブあたりの最小ノイズ減衰 (dB)
max_f_decayオクターブあたりの最大ノイズ減衰 (dB)
min_snr_db最小のsignal to noise ratioをdBで設定
max_snr_db最大のsignal to noise ratioをdBで設定

色ノイズの場合、min_f_decay, max_f_decayに以下の値をあ設定します。

色ノイズ毎のf_decayの設定値
Colourf_decay (dB/octave)
pink-3.01
brown/brownian-6.02
red-6.02
blue3.01
azure3.01
violet6.02
white0.0

ピンクノイズを加える

f_decayに-3.01を設定してピンクノイズを加えてみます。

transform = A.AddColorNoise(p=1.0, min_snr_db=10, max_snr_db=40, 
                            min_f_decay=-3.01, max_f_decay=-3.01)

sr = 16000
wave = np.zeros(sr*5) + 0.001
augmented_wave = transform(wave, sample_rate=sr)

plot_waves(wave, augmented_wave)
plot_spectrum(augmented_wave)

スペクトルをみると、ピンクノイズになってそうです。

result pink noise
Screenshot

ホワイトノイズを加える

ホワイトノイズを加えています。

transform = A.AddColorNoise(p=1.0, min_snr_db=10, max_snr_db=40, 
                            min_f_decay=0, max_f_decay=0)

sr = 16000
wave = np.zeros(sr*5) + 0.001
augmented_wave = transform(wave, sample_rate=sr)

plot_waves(wave, augmented_wave)
plot_spectrum(augmented_wave)

減衰率が一定で、正しくホワイトノイズが加えられています。

result white noise
Screenshot

AddGaussianNoise

ガウスノイズを加えます

transform = A.AddGaussianNoise(min_amplitude=0.001, max_amplitude=0.015, p=1.0)

sr = 16000
wave = np.zeros(sr*5) + 0.001
augmented_wave = transform(wave, sample_rate=sr)

plot_waves(wave, augmented_wave)
result gauss noise
主要パラメータ
min_amplitude最小ノイズ増幅率
max_amplitude最大ノイズ増幅率

AddGaussianSNR

ガウスノイズを加えます。こちらは、SNRでパラメータを設定します。

SNRなので数値が大きいほどノイズが少ない(音質が良い)点に注意します。

transform = A.AddGaussianSNR(p = 1.0, min_snr_db=5, max_snr_db=40)
wave, sr = librosa.load('test.wav')

augmented_wave = transform(wave, sample_rate=sr)

plot_waves(wave, augmented_wave)
result gaussian SNR
主要パラメータ
min_snr_db最小信号対雑音比 (dB)。数値が小さいほどノイズが多くなります
max_snr_db最大信号対雑音比 (dB)。数値が小さいほどノイズが多くなります

AdjustDuration

秒数を調整します。

wave, sr = librosa.load('test.wav')

transform = A.AdjustDuration(duration_samples=sr, p=1.0)

augmented_wave = transform(wave, sample_rate=sr)

plot_waves(wave, augmented_wave)

duration_samplesに合わせて、長さが調整されます。長い場合はランダムな位置をクロップし、短い場合はパディングが行われます。

result adjust

Gain

音量を調整します。

transform = A.Gain(p = 1.0, min_gain_db=-12, max_gain_db=12)

wave, sr = librosa.load('test.wav')

augmented_wave = transform(wave, sample_rate=sr)

plot_waves(wave, augmented_wave)
result gain
主要パラメータ
min_gain_db最小ゲイン (dB)
max_gain_db最大ゲイン (dB)

まとめ

以上、オーディオデータ用のデータ拡張ライブラリ”Audiomentations”について紹介しました。音声データに対するディープラーニングは、あまりがっつりやることは少ないですが、kaggleのコンペなどにもあるので、今回まとめておきました。

おすすめ書籍

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

記事URLをコピーしました