音声特徴量の抽出と可視化

音声特徴量の抽出と可視化

1 音声特徴量の抽出と可視化

前回は 音声データの読み込みと波形・スペクトログラムの可視化 を行いました。
今回は 音声特徴量の抽出 を行い、データの数値化と可視化を進めます。


目的

  • 音声特徴量の抽出とは何かを理解する
  • Kaggleのデータから以下の特徴量を抽出する
    • MFCC(メル周波数ケプストラム係数)
    • ゼロ交差率(Zero Crossing Rate)
    • スペクトルセントロイド(Spectral Centroid)
    • RMSエネルギー(RMS Energy)
    • スペクトルバンド幅(Spectral Bandwidth)
  • 特徴量をプロットし、可視化する
  • 特徴量を数値データとして保存する

2 音声特徴量の基礎

音声データはそのままだと機械学習に使用できません。
そのため、以下の特徴量を抽出し、数値データとして利用できるようにします。

特徴量説明
MFCC(Mel-Frequency Cepstral Coefficients)人間の聴覚特性に近い周波数スケールで特徴を抽出する手法
ゼロ交差率(Zero Crossing Rate)波形がゼロを跨ぐ回数(音の変化の激しさを示す)
スペクトルセントロイド(Spectral Centroid)周波数成分の重心(音の明るさを示す)
RMSエネルギー(RMS Energy)音のエネルギー(音量の大きさを示す)
スペクトルバンド幅(Spectral Bandwidth)セントロイド周辺の周波数成分の広がり(音の複雑さを示す)

3 音声特徴量の計算と可視化

以下のコードを実行することで、特徴量を抽出し、可視化することができます。

import os
import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np

# Kaggle から取得した音声データのパスを指定
DATA_DIR = "./data"
sample_file = os.path.join(DATA_DIR, "yes", "0a7c2a8d_nohash_0.wav")  # yes フォルダ内の音声を指定

# 音声ファイルをロード
y, sr = librosa.load(sample_file, sr=None)

# 各特徴量を計算
mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)  # MFCC(13次元)
zcr = librosa.feature.zero_crossing_rate(y)  # ゼロ交差率
centroid = librosa.feature.spectral_centroid(y=y, sr=sr)  # スペクトルセントロイド
rms = librosa.feature.rms(y=y)  # RMSエネルギー
bandwidth = librosa.feature.spectral_bandwidth(y=y, sr=sr)  # スペクトルバンド幅

# 特徴量をプロット
plt.figure(figsize=(10, 8))

plt.subplot(5, 1, 1)
librosa.display.specshow(mfccs, x_axis="time", sr=sr)
plt.colorbar()
plt.title("MFCC")

plt.subplot(5, 1, 2)
plt.plot(zcr[0], label="Zero Crossing Rate")
plt.legend()

plt.subplot(5, 1, 3)
plt.plot(centroid[0], label="Spectral Centroid", color="r")
plt.legend()

plt.subplot(5, 1, 4)
plt.plot(rms[0], label="RMS Energy", color="g")
plt.legend()

plt.subplot(5, 1, 5)
plt.plot(bandwidth[0], label="Spectral Bandwidth", color="purple")
plt.legend()

plt.tight_layout()
plt.show()

音声特徴量の保存

抽出した音声特徴量を CSV ファイルNumPy配列(.npy) に保存する方法を説明します。
これにより、機械学習の学習データとして利用できるようになります。


1. CSV形式で保存する

CSV形式で保存すると、ExcelやPandasで簡単に確認できます。

import pandas as pd

# 保存するデータを辞書形式で作成
feature_data = {
    "MFCC1": mfccs[0],
    "MFCC2": mfccs[1],
    "MFCC3": mfccs[2],
    "MFCC4": mfccs[3],
    "MFCC5": mfccs[4],
    "MFCC6": mfccs[5],
    "MFCC7": mfccs[6],
    "MFCC8": mfccs[7],
    "MFCC9": mfccs[8],
    "MFCC10": mfccs[9],
    "MFCC11": mfccs[10],
    "MFCC12": mfccs[11],
    "MFCC13": mfccs[12],
    "Zero_Crossing_Rate": zcr[0],
    "Spectral_Centroid": centroid[0],
    "RMS_Energy": rms[0],
    "Spectral_Bandwidth": bandwidth[0],
}

# Pandas DataFrame に変換
df = pd.DataFrame(feature_data)

# CSVファイルとして保存
csv_path = os.path.join(DATA_DIR, "features.csv")
df.to_csv(csv_path, index=False)

print(f"✅ 音声特徴量をCSVとして保存しました: {csv_path}")

2. NumPy配列(.npy)で保存する

NumPy形式で保存すると、Pythonのプログラムからすぐに読み込める。

# NumPy配列として保存
npy_path = os.path.join(DATA_DIR, "features.npy")
np.save(npy_path, mfccs)

print(f"✅ 音声特徴量をNumPy配列(.npy)として保存しました: {npy_path}")

3. 保存したデータの確認

保存したデータを 再度読み込んで確認 できます。

CSVを読み込む

df_loaded = pd.read_csv(csv_path)
print(df_loaded.head())  # データの最初の5行を表示

NumPy配列を読み込む

mfccs_loaded = np.load(npy_path)
print(mfccs_loaded.shape)  # 配列の形状を確認

ラベルデータも必要らしいので追加

import numpy as np
import os

# ✅ ラベルデータ(例えば yes/no を 0,1 に変換して保存する例)
labels = ["yes", "no", "up", "down", "left", "right", "on", "off", "stop", "go"]
label_dict = {label: i for i, label in enumerate(labels)}

# ✅ すでにデータがある `DATA_DIR` を使用
DATA_DIR = "./data"

# ✅ 音声データのフォルダ名を取得し、それをラベルとして使用
data_folders = [f for f in os.listdir(DATA_DIR) if os.path.isdir(os.path.join(DATA_DIR, f))]

# ✅ フォルダ名(ラベル)を数値に変換
labels_array = np.array([label_dict[label] for label in data_folders if label in label_dict])

# ✅ ラベルデータを NumPy 配列として保存
labels_path = os.path.join(DATA_DIR, "labels.npy")
np.save(labels_path, labels_array)

print(f"✅ ラベルデータを保存しました: {labels_path}")

4. 今後の流れ

  1. 複数の音声ファイルに対して特徴量を計算 し、データセットを作成する
  2. 保存した特徴量を用いて機械学習モデルを構築 する

1つのファイルで特徴量が保存・再利用できることを確認 した。