キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

[アーカイブ] [Pythonサンプルスクリプト] librosaによる音声データからの特徴量抽出 (MFCC)

YusukeK
データサイエンティスト
データサイエンティスト
3 0 5,376

先日(2020年5月)、製造業の技術者様向けに、センサデータを処理して特徴量抽出し、DataRobotで機械学習モデルを作成するウェビナーを実演しました。

スクリーンショット 2020-05-14 15.27.19.png

アーカイブ(閲覧には登録が必要)

内容を要約したブログ(DataRobotブログ)

 

その中で、Pythonライブラリのlibrosaを使って、音声データから20次元のメル周波数スペクトラム係数(MFCC)を抽出する、ということを実演しました。本記事で、そのスクリプトサンプルを共有させていただきます!

 

処理するwavデータ

 

想定シーンとしては、機械設備が発する音が「正常」か「異常」かを予測するものとします。学習に使うデータは、下記スクリーンショットのように、正常な音は「normal_*.wav」、異常な音は「anomaly_*.wav」としてフォルダに保存されているとします。(normal, anomaly合わせて4368ファイル)

YusukeK_0-1589439023455.png

 

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列)のデータフレームが得られました!

YusukeK_0-1589439773014.png

 

このテーブルをDataRobotで学習し、正常な音(label: 0)と異常な音(label: 1)を高い精度で分類するモデルを作ることができました。ぜひ、ウェビナーのアーカイブや、ブログもご覧ください!

お知らせ
DataRobotコミュニティにようこそ!

AIとMLに関するあらゆることについて探求し、学び、コミュニティの仲間と交流しましょう。

クラスルーム形式のトレーニングをご希望の方は DataRobot University へどうぞ