
5. 特徴量抽出
5.4 MFCC(メル周波数ケプストラム係数)
MFCCは、音の短い区間ごとに「どんな周波数の成分がどれくらい含まれているか」を、人の耳の感じ方に近い物差しで要約し、さらに重なりをほどいて少ない数の数値に圧縮した特徴量である。用途としては音声認識や話者認識で古くから使われ、機械音の分類や異常検知でも、周波数包絡(ザックリした形)の違いを安定に捉える特徴として有効である。[1][2][3][4]
最初に全体像をつかむ。MFCCを作る標準的な手順は、1) 短い時間で区切る(フレーミング)、2) 各フレームに短時間フーリエ変換(STFT)を行いパワースペクトル(周波数ごとの強さ)を得る、3) それをメル尺度に並んだ三角形フィルタ群(メルフィルタバンク)に通して帯域のエネルギーを集計する、4) 各帯域エネルギーを対数にする、5) その列に離散コサイン変換(DCT)をかけて係数を得る、という5段階である。このうちメル尺度は、人の耳が低い周波数ほど細かく差を感じ、高い周波数では大まかに感じる性質を数式化した軸で、周波数f(Hz)とメル値mの対応は m=2595log10(1+f/700) などの式で表される。メルフィルタバンクは、メル軸に等間隔で配置された20〜40個程度(よくあるのは26や40)の三角形フィルタで、各帯域のエネルギーをすくい取る役目を持つ。[5][6][7]
続いて、各段階の意味をやさしく説明する。短い時間で区切るのは、音が時間とともに変わるからで、瞬間ごとの周波数構成を測るためである。フーリエ変換で得たパワースペクトルは横軸が周波数、縦軸が強さだが、そのままだと周波数軸が人の聴感と乖離している。そこでメル尺度上に並んだフィルタ群で帯域ごとに足し合わせると、低域は細かく、高域は粗くまとめる「聴感に近い」帯域エネルギー列になる。このエネルギーに対数を取るのは、強さの大きさを人の感じ方(対数的)に合わせ、さらに後段のDCTで扱いやすくするためである。最後のDCTは、隣り合う帯域で似た値になりやすい相関をほどき、情報を前の少数係数に集約する働きを持つ。結果として、低次の係数にスペクトル包絡(なめらかな形)の情報が集まり、高次の係数は細かいギザギザ(急峻な変化)を表すため、多くの応用では前から12〜13係数程度だけを残して利用することが多い。[8][6][7][9][5][1]
メルフィルタバンクのイメージを補足する。三角形の峰を中心周波数に置き、左右に線形に0へ下がる形で帯域を重ねる(隣同士は山の裾で交差する)ので、連続帯域を滑らかにつなぎながら、メル間隔で低域を密、高域を疎にサンプリングしている、と考えればよい。実装例では40バンドから13係数に圧縮(DCT)という設定がよく使われるが、26バンドや13係数などの“古典的”な組み合わせも一般的で、標準的なオーディオ処理ツール群も同様の仕様を採用している。[6][7][9][10][11][5]
MFCCに動きの情報を加える拡張として、デルタ(一次差分)とデルタデルタ(二次差分)がある。これは、フレームごとに得られるMFCCの時間変化(傾き、加速度)を近似的に求め、元の係数に付け足して特徴次元を増やす方法で、音声処理で古典的かつ有効とされる。一般には、静的なMFCC(13次など)にデルタとデルタデルタを連結して合計39次元とする設定がよく使われる。デルタの計算は、前後フレームとの差を重み付きで平均する形で定義され、窓幅2フレーム程度を用いるのが通例である。[12][13][14][15][16]
ここまでが「なぜそうするか」と「どう計算するか」の骨子である。次に、現場で役立つ設計と注意点をまとめる。- フレーム長と周波数分解能:短いフレームは時間変化に敏感だが周波数分解能が粗く、長いフレームは分解能が細かいが時間の平均が進む。目的に応じてバランスを取る(STFTと同じ基本原理)。- フィルタ数と係数数:バンクは26〜40、係数は12〜13+ログエネルギーという古典設定が普及しているが、学習器の性質(相関に弱いかどうか)や計算資源に合わせて調整する。- DCTと相関の除去:メルフィルタ出力は重なりのため相関があるが、DCTで直交成分に分けることで、単純な統計モデル(対角共分散など)と相性が良くなる、という歴史的背景がある。- 実装の流儀の違い:MFCCの細部(フィルタ数、帯域、DCTの種類、正規化など)は実装差がある。代表的な実装では「40バンド→13係数」や「26バンド→13係数」が使われ、HTK互換など設定プリセットが用意されることも多い。[7][17][10][8][5][6]
MFCCと類似の表現として「メルフィルタバンク特徴(ログメルスペクトル)」がある。こちらは「DCTをかけずにメル帯域の対数エネルギー列をそのまま使う」もので、近年のニューラルネットでは、相関があってもモデル側で扱えるためログメルを直接入力する選択も増えている。一方で、相関に弱いモデルや古典的な統計モデルでは、MFCCで相関を減らす方が扱いやすい、という整理が示されている。[5]
故障予知の観点ではどう活かすか。- 周波数包絡の違いを捉える:異常音は、特定帯域の膨らみや全体の傾きの変化として表れることが多い。MFCCは低次係数に包絡情報が集約されるため、正常と異常の差を少ない次元で表しやすい。- 時間変化の追跡:デルタ・デルタデルタを加えると、異常出現時の立ち上がりや周期変動の変化を敏感に拾えるが、差分はノイズに弱くなりがちなので、平滑化や十分なフレーム設定で安定化を図る。- ログメルとの比較運用:ディープラーニングを用いる場合は、ログメルを画像のように入力する設計も強力で、MFCCとログメルを両方試して、精度と計算量・解釈性の折り合いで選ぶのが現実的である。[3][16][17][1][12][5]
実務の手順例を簡潔に示す。1) 録音(適切なサンプリング、過大入力回避)→短時間フレーミング→各フレームに窓(例:ハン)を適用しSTFTでパワースペクトルにする。2) メルフィルタバンク(例:40バンド)で帯域エネルギーに集計し、対数を取る。3) DCTで13係数に圧縮し、必要に応じてフレームの対数エネルギーを追加、さらにデルタ・デルタデルタを連結する(合計39次元など)。4) フレームごとの特徴ベクトル列を学習器に入力(古典MLなら2次元配列、深層学習なら時間×係数のテンソル)とし、ラベルや運転条件と合わせて学習・評価を行う。[13][14][17][10][11][7][5]
最後に、パラメータ設計の指針を箇条書きでまとめる。- バンク数と帯域:26〜40の範囲で開始し、対象帯域(マイク・機械の特性、fs/2の上限)に合わせて上下限を設定する。- 係数の本数:12〜13係数+ログエネルギーを基本に、必要なら20係数程度まで拡張して比較する(過剰な高次はノイズ感度が上がる)。- デルタ設定:窓幅2前後で一次・二次差分を付与し、39次元構成をまず試す(差分はノイズに弱いため、前処理や平均化で安定化)。- 実装差の確認:DCTの種類、正規化、フィルタの定義(HTK式など)は実装差があるため、ツールの仕様を明示して再現性を確保する。- 代替表現の検討:ニューラルネット前提なら、ログメルフィルタバンク特徴を直接入力する案も比較し、相関の扱いや学習の収束性で選ぶ。[17][10][6][7][12][13][5]
MFCCは、「耳に近い帯域のまとめ方」と「相関をほどく圧縮(DCT)」という二つの工夫で、少ない次元に本質的な差を閉じ込める設計になっている。正しく設定すれば、音声だけでなく機械音の状態識別や異常検知でも、安定して効く“第一選択”の特徴量である。[2][4][1] [1] https://en.wikipedia.org/wiki/Mel-frequency_cepstrum
[2] https://www.sciencedirect.com/topics/computer-science/mel-frequency-cepstral-coefficient [3] https://speechprocessingbook.aalto.fi/Representations/Melcepstrum.html [4] https://www.geeksforgeeks.org/nlp/mel-frequency-cepstral-coefficients-mfcc-for-speech-recognition/ [5] https://haythamfayek.com/2016/04/21/speech-processing-for-machine-learning.html [6] https://essentia.upf.edu/reference/streaming_MFCC.html [7] http://practicalcryptography.com/miscellaneous/machine-learning/guide-mel-frequency-cepstral-coefficients-mfccs/ [8] https://privacycanada.net/mel-frequency-cepstral-coefficient/ [9] https://www.ideas2it.com/blogs/mfcc-stft-from-audio-data [10] https://www.mathworks.com/help/audio/ref/mfcc.html [11] https://jp.mathworks.com/help/audio/feature-extraction.html [12] https://speechprocessingbook.aalto.fi/Representations/Deltas_and_Delta-deltas.html [13] http://www.jatit.org/volumes/Vol79No1/5Vol79No1.pdf [14] https://ijarse.com/images/fullpdf/1472553022_P518-819.pdf [15] https://desh2608.github.io/2019-07-26-delta-feats/ [16] https://arxiv.org/pdf/2112.07940.pdf [17] https://mac.kaist.ac.kr/~juhan/gct634/2021-Fall/Slides/%5Bweek2-1%5D%20audio%20feature%20extraction.pdf [18] https://arxiv.org/pdf/1410.6903.pdf [19] https://qiita.com/martin-d28jp-love/items/34161f2facb80edd999f [20] https://ieeexplore.ieee.org/document/8955286/※本ページは、AIの活用や研究に関連する原理・機器・デバイスについて学ぶために、個人的に整理・記述しているものです。内容には誤りや見落としが含まれている可能性もありますので、もしお気づきの点やご助言等ございましたら、ご連絡いただけますと幸いです。
※本ページの内容は、個人的な学習および情報整理を目的として提供しているものであり、その正確性、完全性、有用性等についていかなる保証も行いません。本ページの情報を利用したこと、または利用できなかったことによって発生した損害(直接的・間接的・特別・偶発的・結果的損害を含みますが、これらに限りません)について、当方は一切責任を負いません。ご利用は利用者ご自身の責任でお願いいたします。