Skip to content

メル・MFCC・音色 ​

問いの中には、どの音かではなくどんな音かを問うものがあります。明るいか暗いか、滑らかかノイジーか、フルートか歪んだギターか。それが音色(ティンバー)で、ここで扱う特徴量がそれを記述します。いずれも スペクトログラムと STFT のスペクトログラムを土台にします。

音色: 音の「色」 ​

音色(ティンバー)は、同じ音・同じ音量でもピアノとギターが違って聞こえる理由です。倍音の相対的な強さと、それが時間とともにどう変化するかから生まれます。ピッチからは音名が、音色からは声色が分かります。

メル尺度: 人の聞こえ方に沿った周波数 ​

人は周波数を線形には聞きません。100 Hz から 200 Hz への跳びは大きく感じますが、5000 Hz から 5100 Hz はほとんど感じません。

メル尺度は、この聞こえ方に合わせた知覚的な周波数尺度です。低域は細かく、高域は粗くなります。

メルスペクトログラムは STFT をその尺度へ写し直します。耳が実際に聞き分ける帯域へ詳細を集中させるため、多くの音声機械学習で標準的な前処理として使われます。

通常のスペクトログラムは周波数を均等な間隔で並べますが、メルスペクトログラムは耳が細かく聞き分ける低域を細かく、差を感じにくい高域をまとめて扱います。機械が扱いやすく、しかも人の聞こえ方に近い形で音を表したものです。

片方の尺度では等間隔、もう片方では不等間隔
010002000300040005000600070008000周波数(Hz、線形)狭く、密広く、疎同じ中心周波数をメル尺度で見る14 本のフィルターを描画
  • 三角形のメルフィルター
  • 等間隔
フィルターはメル尺度の上で等間隔に並べてあります。それを Hz に戻して見ると、同じ配置が低域では狭く密に、高域では広く疎になります。耳が細かく聞き分ける低域に多くのフィルターが割かれ、高域には少ししか割かれないのはこのためです。
MEL · SPECTRALIDLE
メルスペクトログラム — 人の聞こえ方の周波数

STFT のパワーを、知覚に基づく周波数帯域へまとめたメルスペクトログラムです。低域の帯域は細かく、高域は広くなります。倍音とフォルマントの帯を、線形周波数軸の STFT と比較してください。メル尺度は周波数の知覚を近似するもので、耳の反応を直接測定した図ではありません。

MFCC: コンパクトな音色の指紋 ​

MFCC(メル周波数ケプストラム係数)は、メルスペクトログラムを相関を除いた少数の数値へ圧縮し、スペクトル包絡、つまり細かいピッチの詳細を無視したスペクトルの全体形状を捉えます。メルエネルギーの対数をとり、DCT(離散コサイン変換。情報を最初の数係数へ集める余弦基底の変換)を適用して計算します。結果は音色の小さく安定した「指紋」で、楽器・声・音種の分類に広く使われます。

MFCC は、音そのものを再生するためのデータではなく、分類や比較のための要約です。たとえば「これは声に近いか、打楽器に近いか」「前半と後半で音色が変わったか」を見るには便利ですが、「どの音名が鳴っているか」を知りたいならクロマやピッチ検出を使います。

MFCC · TIMBREIDLE
MFCC マップ — コンパクトな音色の指紋

MFCC は、対数メルスペクトルを少数のケプストラム係数で表します。低次の係数を残すと、大まかなスペクトル包絡が強調され、細かな倍音構造が減ります。各行は、ひとつの係数の時間変化です。この図では、対数メルパワーの平均を表す 0 次係数を除いています。0 次係数は波形のエネルギーそのものではありません。

1 つの数値で明るさ: 重心と平坦度 ​

スペクトル形状をフレームごとに要約する 2 つのスカラーがあります。

特徴量測るもの高い値の意味
スペクトル重心スペクトルの「重心」(Hz)より明るく、高域エネルギーが多い
スペクトル平坦度ノイズ的か調性的か(0〜1)明確なピッチ(0)よりノイズ(1)に近い

どちらも明るさ/ノイズ性の安価な代理指標で、UI メーター、しきい値、MFCC ベクトル全体までは要らない簡易記述子に向きます。

無音の平坦度は 0 ではなく 1.0 になります

平坦度はパワースペクトルの幾何平均を算術平均で割った値で、平均を取る前に各ビンを amin(1e-10)で下限クリップします。そのため完全な無音フレームはすべてのビンが同じ下限値になり、比は 1.0、つまり直感とは逆に「最もノイズ的」を意味する値として返ります。libsonare はこの点を librosa.feature.spectral_flatness に合わせており、無音を特別扱いしません。

先にレベルでゲートしてください。フレームの RMS やピークを確認し、ノイズフロアを下回る区間では平坦度の値を無視します。平坦度をそのまま UI メーターやノイズゲートに繋ぐと、静かな箇所で反応してしまいます。

libsonare がこれらをどう計算するか

MelSpectrogram はメルフィルターバンクを STFT パワーに適用してメルスペクトログラムを作り、対数圧縮と DCT 相当の処理で MFCC を導きます。

項目内容
メル設定n_mels = 128、fmin/fmax(0 は sr/2)
解析窓n_fft = 2048/hop_length = 512、Hann 窓
メル尺度式htk = false で Slaney 式、true で HTK 式(尺度の式そのものの選択)
正規化norm = MelNorm::Slaney(フィルターの面積正規化)。尺度式とは独立で、HTK 式と Slaney 正規化の組み合わせも指定できます
リフタリングmfcc 末尾の lifter(ケプストラルリフタリング、既定 0 = リフタリングなし)は librosa の lifter に対応
追加指標スペクトル重心と平坦度はフレームごとの振幅スペクトルから直接計算

いずれもリファレンス比較に足る程度に librosa の規約に従っています。スペクトル指標は TimbreAnalyzer などの上位記述子に再利用されます。メルと MFCC はプレビュー用に近似音声へ逆変換できます(逆変換特徴量を参照)。

メルや MFCC の結果は順変換のパラメータ(nFft、適用された fmin・fmax、htk、isDb。MFCC ではさらに sampleRate、hopLength、nMels、lifter)を保持しているので、結果だけで逆変換できます。Node と WASM では melToAudio({ result }) と mfccToAudio({ result })、Python では mel_result_to_audio と mfcc_result_to_audio です。

関連: MIR の全体像、スペクトログラムと STFT、セクションと構成、クロマ特徴量