先日(2020年5月)、製造業の技術者様向けに、センサデータを処理して特徴量抽出し、DataRobotで機械学習モデルを作成するウェビナーを実演しました。
アーカイブ(閲覧には登録が必要)
内容を要約したブログ(DataRobotブログ)
その中で、Pythonライブラリのlibrosaを使って、音声データから20次元のメル周波数スペクトラム係数(MFCC)を抽出する、ということを実演しました。本記事で、そのスクリプトサンプルを共有させていただきます!
処理するwavデータ
想定シーンとしては、機械設備が発する音が「正常」か「異常」かを予測するものとします。学習に使うデータは、下記スクリーンショットのように、正常な音は「normal_*.wav」、異常な音は「anomaly_*.wav」としてフォルダに保存されているとします。(normal, anomaly合わせて4368ファイル)
librosaのスクリプトサンプル
必要なライブラリをインポートします。
import pandas as pd # おなじみpandas
import glob # ファイル名を取得するライブラリ
import librosa # 今回の主役librosa
抽出したMFCCと、正常(0)・異常(1)ラベルを格納するリストを予め作っておきます。
list_ceps = [] # 抽出したMFCCを格納するリスト
list_label = [] # 正常(0)、異常(1)ラベルを格納するリスト
まずは、正常な音声データファイル(wav)から、MFCCを抽出し、正常(0)のラベルをつけます。
# normalのwavを処理
filelist = glob.glob('data/normal_*.wav') # ワイルドカードでnormal_*.wavのリストを作成
for filename in filelist:
y, sr = librosa.core.load(filename,sr=None)
mfcc = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=20)
# 複数のローリングウィンドウでそれぞれ20次元のMFCCを得られるので、その平均をとる。
ceps = mfcc.mean(axis=1)
# リストに追加
list_ceps.append(ceps) # 20次元のMFCCを追加
list_label.append(0) # 正常ラベル(0)を追加
次に、異常な音声データファイル(wav)からも同様にMFCCを処理し、異常(1)のラベルをつけます。
# 続いてanormalyのwavを処理
filelist = glob.glob('data/anomaly_*.wav') # ワイルドカードでanomaly_*.wavのリストを作成
for filename in filelist:
y, sr = librosa.core.load(filename,sr=None)
mfcc = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=20, dct_type=1)
# 複数のローリングウィンドウでそれぞれ20次元のMFCCを得られるので、その平均をとる。
ceps = mfcc.mean(axis=1)
# リストに追加
list_ceps.append(ceps) # 20次元のMFCCを追加
list_label.append(1) # 異常ラベル(1)を追加
これだけで、4368個のwavファイルから、それぞれ20次元のMFCCを抽出できました。データフレーム化して見てみましょう。
# データフレーム化
# 20次元のMFCCのデータフレームを作成
df_ceps = pd.DataFrame(list_ceps)
columns_name = [] # カラム名を"dct+連番"でつける
for i in range(20):
columns_name_temp = 'dct{0}'.format(i)
columns_name.append(columns_name_temp)
df_ceps.columns = columns_name
# ラベル(正常0、異常1)のデータフレームを作成
df_label = pd.DataFrame(list_label, columns=['label'])
# 横にconcat
df = pd.concat([df_label, df_ceps], axis = 1)
以下のように、4368行×21列(ラベル1列と、MFCC 20列)のデータフレームが得られました!
このテーブルをDataRobotで学習し、正常な音(label: 0)と異常な音(label: 1)を高い精度で分類するモデルを作ることができました。ぜひ、ウェビナーのアーカイブや、ブログもご覧ください!