メル尺度で 等間隔に並んだ三角形フィルタ群 でスペクトルをまとめる
パワースペクトル(本実習:FFT長512 → 257ビン)
↓
三角フィルタをかける(例:40個)
↓
各フィルタ内のパワーを重み付きで合計
↓
40次元のメルエネルギーベクトル
X[n]はパワースペクトル、Hk[n]はフィルタの重み。
本回はフィルタの面積正規化を使わず、norm=Noneとする。
対数の役割:メルパワーの広い数値範囲を圧縮する。
聴覚に着想を得た処理だが、ラウドネスそのものではない。
power_to_dbを使用。底・基準・下限・切り詰め条件で数値は変わるWhisperは対数メルスペクトログラム、wav2vec 2.0は波形を入力する。MFCCとは区別する。
L[k]:対数メル値、K:帯域数。正規直交DCT-IIでは
α₀ = 1/√K、αₙ = √(2/K)(n > 0)。コードのnorm="ortho"に対応。
| 係数 | 表す変化 |
|---|---|
| 低次 | メル軸上の緩やかなスペクトル包絡 |
| 高次 | より細かな変化。音韻・話者・雑音などの情報を含みうる |
各係数とF1・F2に一対一の対応はない。n_mfcc=13はC[0]〜C[12]の13係数。
入力:音声波形 x[n]
↓
① プリエンファシス(採用する場合)x'[n] = x[n] − α x[n−1]
↓
② フレーム分割+Hann窓:25 ms窓、10 msホップ(重複15 ms)
↓
③ 必要に応じてゼロパディング、FFT → パワースペクトル
↓
④ メルフィルタでパワーを重み付き集約
↓
⑤ 正の下限を設け、対数へ(実習では基準1のdB値)
↓
⑥ 正規直交DCT-II → 残す係数を選択
↓
出力:MFCC(例:C[0]〜C[12])× フレーム数
プリエンファシスは必須ではない。librosaは自動では行わず、本実習も省略。
import librosa
import numpy as np
# 朗読音声。16 kHz、窓400点=25 ms、ホップ160点=10 ms
y, sr = librosa.load(librosa.example("libri1"), sr=16000, mono=True)
S_mel = librosa.feature.melspectrogram(
y=y, sr=sr, n_fft=512, win_length=400, hop_length=160,
n_mels=40, htk=True, norm=None)
# 同じログメル値をDCTへ。フィルタのnormとDCTのnormは別。
S_db = librosa.power_to_db(S_mel, ref=1.0)
mfcc = librosa.feature.mfcc(
S=S_db, n_mfcc=13, dct_type=2, norm="ortho")
print(mfcc.shape) # (13, フレーム数)、C[0]〜C[12]
FFT長512と窓長400は異なる。librosaの既定Slaney方式と本回のHTK設定を区別する。mfcc(y=...)で同じ条件にする場合、フィルタ側はmel_norm=Noneを指定。
1フレームのMFCCに、周辺フレームから求めた時間変化を明示的に追加する方法。
例:K = 2なら前後2フレーム(width = 5)。上式は1フレームあたりの傾き。
秒あたりにするならホップ秒数で割る。二階微分ならその二乗で割る。
13次元のMFCC+13次元のΔ+13次元のΔΔ = 39次元
# フレーム番号に対する微分の近似。端は最近傍値で延長。
mfcc_d = librosa.feature.delta(mfcc, width=5, order=1, mode="nearest")
mfcc_dd = librosa.feature.delta(mfcc, width=5, order=2, mode="nearest")
mfcc_39 = np.concatenate([mfcc, mfcc_d, mfcc_dd], axis=0)
librosaはSavitzky–Golay法を使用。order=2は二階微分の直接推定で、一次を2回適用する方法と常に同じではない。MFCC系列を時系列モデルに渡す方式もある。
| n_mfcc | n_mels | 設定の例 |
|---|---|---|
| 13 | 26〜40 | 従来の音声認識で使われる構成 |
| 20 | 40 | C[0]〜C[19]を残す |
| 40 | 80〜128 | より多くの係数を残す。精度は実験で判断 |
Whisperは80または128帯域の対数メル、wav2vec 2.0は波形。80次元MFCCを使うという意味ではない。
| パラメータ | 本実習 | 意味 |
|---|---|---|
| sr | 16000 Hz | サンプリング周波数 |
| win_length | 400点 | 25 msの窓 |
| n_fft | 512点 | FFT長。窓長とは別に設定 |
| hop_length | 160点 | フレーム中心の間隔10 ms |
締め切り:翌週末 23:59
問1:メル尺度について正しい説明はどれか
A. 全帯域を線形スケールで表したもの
B. 高音域を拡張したもの
C. 低音域を細かく、高音域を粗く扱うもの ✓
D. 基本周波数F0を検出するための尺度
問2:MFCCの正しい計算順序はどれか
A. FFT → メルフィルタ → 対数 → DCT ✓
B. DCT → FFT → メルフィルタ → 対数
C. メルフィルタ → FFT → 対数 → DCT
D. FFT → 対数 → メルフィルタ → DCT
| 概念 | ポイント |
|---|---|
| メル尺度 | 音の高さの心理尺度。弁別閾や蝸牛のフィルタ幅とは別 |
| メルフィルタバンク | 三角形フィルタをメル尺度で等間隔に配置 |
| ログメルスペクトログラム | メルエネルギーの対数。深層学習で多用 |
| DCT | メル帯域方向の変換。全係数なら可逆、係数の選択で次元削減 |
| MFCC | 対数メル値をDCTで変換。13など、残す係数数は設計で選択 |
| Δ・ΔΔ特徴量 | 時間変化を明示的に追加。13+13+13なら39次元 |
次回(第6回・オンライン同期):ピッチ・エネルギー・ゼロ交差などの前処理手法と音声活動検出(VAD)
第5回の理解度テストを受けてください
お疲れさまでした!
動画を視聴しながら、各ステップの「なぜ」を意識してほしい。
ピアノの音程は周波数比で説明できるが、オクターブ尺度とメル尺度を同一視しない。高域の100 Hz差が聞こえないとも断定しない。
HTK近似式は700 Hzに折れ目を持たない。700 Hzは約781メル、1000 Hzは約1000メル、7000 Hzは約2702メル。librosaの既定Slaney方式とhtk=Trueを区別する。
順序はFFTからパワーを求め、メルフィルタ、対数、DCT、係数の選択。DCTは全係数を残せば可逆で、相関の除去や独立性を保証しない。C[0]は対数メルパワーの平均に比例する。
n_mfccは返す係数数、n_melsはメル帯域数。13ならC[0]〜C[12]を含む。窓長win_lengthとFFT長n_fftは別。本実習は16 kHz、窓400点、FFT512点、ホップ160点。フィルタnorm=NoneとDCT norm=orthoを区別する。
問1〜5の正解と解説は授業ページの第5回本文を参照。Formsでは全5問を掲載する。Whisperは対数メル、wav2vec 2.0は波形を入力する。