MFCC 特徴量シミュレーター 戻る
音声信号処理シミュレーター

MFCC 特徴量シミュレーター — メル周波数ケプストラム係数

音声信号からプリエンファシス・ハミング窓・FFT・メルフィルタバンク・対数・DCT を経て MFCC を抽出する流れを段階的に可視化。音声認識の標準特徴量を直感的に学べます。

パラメータ設定
主成分周波数 1 f₁
Hz
主成分周波数 2 f₂
Hz
メルフィルタ数 M
MFCC 係数数 L

サンプリング周波数 F_s = 16000 Hz、フレーム長 N = 512、プリエンファシス係数 α = 0.97 を仮定しています。雑音は決定論的 LCG で生成しています。

計算結果
MFCC c₀(ログエネルギー成分)
MFCC c₁
最大エネルギーのフィルタ番号
最後のメルフィルタ中心周波数
MFCC 抽出パイプライン

上から:入力信号 x[n](青)/パワースペクトル |X[k]|²(緑)/メルフィルタバンクエネルギー log E_m(橙)/MFCC 係数 c_n(赤)

理論・主要公式

MFCC は音声信号を「人間の聴覚に近いメルスケール」と「ケプストラム解析」の組合せで圧縮した特徴量です。プリエンファシス → 窓掛け → DFT → メルフィルタバンク → 対数 → DCT の順に処理します。

プリエンファシスで高域を強調(α ≈ 0.97):

$$y[n] = x[n] - \alpha\,x[n-1]$$

ハミング窓を掛けた N サンプルから DFT し、パワースペクトル $|X[k]|^2$ を求めます。Mel スケール変換:

$$m(f) = 2595\,\log_{10}\!\left(1 + \frac{f}{700}\right)$$

M 個の三角メルフィルタ $H_m$ をメル軸上に等間隔で配置し、対数フィルタバンクエネルギーを得ます:

$$\log E_m = \log\!\left(\sum_{k} H_m[k]\,|X[k]|^2\right)$$

最後に DCT でケプストラム係数を取り出します:

$$c_n = \sum_{m=0}^{M-1} \log E_m \cdot \cos\!\left(\frac{\pi n (m+\tfrac{1}{2})}{M}\right)$$

DCT の役割は「対数スペクトルの包絡(声道)」と「微細構造(声帯)」の分離です。低次の c_n が声道形状、高次が声帯振動に対応します。

MFCC 特徴量シミュレーターとは

🙋
音声認識ってよく聞くんですけど、コンピュータって生の波形をそのまま比べてるわけじゃないんですよね?
🎓
いいところに気づいたね。生波形は同じ「あ」でも、話者・声の高さ・録音環境で形が全然違う。だから「特徴量」と呼ばれる、音素を識別しやすい数値のかたまりに変換するんだ。MFCC——Mel-Frequency Cepstral Coefficients——はその古典かつ強力な特徴量で、上のシミュレーターでは入力波形からスペクトル、メル軸、対数、DCT と段階的に変換していく様子が4段プロットで見える。
🙋
「メル」って何ですか?普通の周波数じゃダメなんですか?
🎓
人間の耳は低い音には敏感、高い音には鈍感だ。1000 Hz と 2000 Hz の差は大きく感じるけど、6000 Hz と 7000 Hz の差はほとんど分からない。メルスケールはこの聴覚特性をモデル化した非線形軸で、$m(f) = 2595\,\log_{10}(1 + f/700)$ という式で定義される。3段目のプロットを見ると、低周波側にフィルタが密に、高周波側に疎に並んでいるのが分かるはずだ。
🙋
最後の DCT は何のためですか?対数を取った後にまた変換するんですか?
🎓
DCT の役割は「圧縮」と「分離」だ。対数メルスペクトルには声道の形状(包絡)と声帯の振動(微細構造)が混ざっている。DCT を掛けると、低次の係数に「ゆっくり変化する成分=声道形状」が、高次に「速く振動する成分=声帯」が分離される。音素の識別には声道形状が一番大事なので、低次の 12〜13 個だけ取れば十分。シミュレーターで L を 4 から 20 へ増やすと、後半の係数が小さくて情報量が少ないことが見える。
🙋
なるほど!メルフィルタ数 M を 10 にすると、フィルタバンクのバーの数が減りますね。これって少なくしすぎるとダメですか?
🎓
そうそう、M はスペクトル分解能を決めるパラメータだ。10 だと粗すぎて音素の細かい違いが消える。逆に 40 まで上げると分解能は上がるけど隣り合うフィルタが強く相関し、後段の DCT で冗長になる。実務では 20〜40 のあいだ、特に 26 や 40 がよく使われる。シミュレーターで M を変えながら3段目と4段目のプロットを見比べると、その兼ね合いが体感できるよ。

よくある質問

音声信号は声帯振動の影響で低域成分のエネルギーが大きく、高域に行くほど -6 dB/oct 程度減衰します。プリエンファシス $y[n] = x[n] - \alpha x[n-1]$(α ≈ 0.97)はこの傾きを補正する高域強調フィルタで、後段のスペクトル表現で高域の音素情報(特に子音)が埋もれないようにする役割があります。
DFT は信号が周期的であることを仮定するため、有限長フレームを切り出すと両端の不連続によりスペクトルに偽の高周波成分(スペクトル漏れ)が現れます。ハミング窓はフレーム両端を滑らかに 0 に落とすテーパで、漏れを大きく低減し主成分のピークを鋭くします。窓の選択(Hamming, Hann, Blackman など)はピーク鋭さとサイドローブのトレードオフです。
三角形は計算が単純でかつメル軸上で隣接フィルタが半分ずつ重なるよう設計しやすいため広く採用されています。物理的には人間の聴覚がもつ「臨界帯域」に対応する帯域積分を近似していて、各フィルタが1つの聴覚チャンネルに相当します。形状を Gaussian や矩形に変えても結果は大差なく、三角形は実用上の妥協点です。
マイクの種類・部屋の残響・チャネル特性が変わると、対数スペクトルに直流バイアスが乗り MFCC 全体がオフセットします。CMVN は発話単位や数秒のウィンドウで MFCC の各次元から平均を引き分散で割る正規化で、チャネル不変な特徴を作ります。実運用では話者・録音条件のミスマッチに対するロバスト性を大きく向上させるため、ほぼ必須の後処理です。

実世界での応用

音声認識(ASR):HMM-GMM 時代の音声認識システムは、13 次元 MFCC + Δ + ΔΔ の 39 次元ベクトルを各 10ms フレームで抽出し、音響モデルに入力する構成が標準でした。Kaldi など現在も広く使われる音声認識ツールキットで、MFCC は基本特徴量として採用されています。

話者認識・話者照合:話者の声道形状や声帯特性は MFCC の包絡情報に強く現れます。古典的な GMM-UBM、i-vector、現代の x-vector など、多くの話者埋め込み手法で MFCC が入力特徴として使われています。スマートフォンの「OK Google」「Hey Siri」のような話者依存ウェイクワード検出でも内部では類似の特徴が活躍しています。

音楽情報処理:楽器音の音色識別、ジャンル分類、楽曲類似度検索でも MFCC は基本特徴として広く使われます。Shazam のような楽曲検索の指紋アルゴリズムでも、MFCC を補助特徴として組み合わせる実装があります。Librosa など Python 音楽解析ライブラリは、デフォルトで MFCC 抽出関数を提供しています。

異常音検知・予知保全:機械の運転音から異常を検出する CAE 周辺領域でも、MFCC は時間波形を低次元の特徴に圧縮する手段として有用です。回転機械のベアリング故障、電力機器のコロナ放電、自動車エンジンのノッキング検知など、人間が「音で違いを感じる」タスクの自動化に使われます。

よくある誤解と注意点

最も多い誤解は、「MFCC は周波数スペクトルそのもの」と思ってしまうことです。MFCC はスペクトルに対数を掛けた後にもう一度 DCT した「ケプストラム」です。横軸は周波数ではなく「ケフレンシ(quefrency)」と呼ばれる時間の次元を持ちます。低次の c_n は対数スペクトルの大局的な形状(声道)、高次の c_n は急峻な変動(声帯ピッチや雑音)を表します。シミュレーターの3段目(log E_m)と4段目(c_n)を見比べて、どちらも「縦軸が対数エネルギー」ではあるが、横軸の意味が全く違うことを意識してください。

次に多いのが、「フレーム長 N を長くするほど精度が上がる」と考えることです。本シミュレーターでは N = 512(32 ms 相当)に固定していますが、これは音声処理の典型値です。長くしすぎると同一フレーム内に複数の音素や有声無声の遷移が入り、特徴量がぼやけてしまいます。短すぎると低周波の分解能が不足します。実務では 20〜30 ms のフレーム長と 10 ms のシフトを組み合わせ、時間分解能と周波数分解能を両立させるのが定石です。

最後に、「MFCC は万能の音声特徴量」だと盲信することに注意してください。MFCC は線形予測やフーリエ変換と並ぶ古典的特徴量ですが、近年の end-to-end ニューラル音声認識ではメルフィルタバンク(DCT を掛けない log-mel spectrogram)や生波形を直接入力するモデルが主流になりつつあります。DCT で次元を圧縮するメリット(計算量・パラメータ削減)と、情報を捨てるデメリット(高次の係数を切り捨てる)はトレードオフです。タスクや計算資源、モデル構造に応じて、MFCC・log-mel・raw waveform のいずれが最適かを判断する必要があります。