音響特徴量「メルスペクトル」と「MFCC(メル周波数ケプストラム係数)」の解説と実例紹介

  • by

R&Dセンターの筒井です。
本記事では、音声認識や音響分析にあまり馴染みがない方に向けて、実例を交えて音響特徴量を解説したいと思います。

音響特徴量とは?ですが、単純に、収音した音データ(信号波形)をモデルに入力しただけでは上手くいかないことが多く(補足: 信号波形を入力とするモデルも考えられています)、学習する上で重要な情報とそうでない情報とを考慮する必要があります。
一般に、音データのような信号波形ではフーリエ変換したスペクトルを起点に考えることが多く、これから得られる重要な情報のことを音響特徴量と言います。

ここで、取り上げる特徴量は、「メルスペクトル」と「MFCC(メル周波数ケプストラム係数)」です。
いずれも、音声認識の分野では非常に馴染みの深い特徴量となっています。

養豚の鳴き声と波形

これは、ある農業高校で飼育されている養豚の鳴き声です。
弊社が研究開発しているFAST-Dプラットフォームは、畜産分野をターゲットとした異音検知機能を搭載しています。
特に、養豚場における養豚については、咳やクシャミを音とAIで以て検知することにより、罹患状態を予見し豚舎での感染拡大を未然に防ぐ事が可能になります。
このように、弊社と関わりの深い「養豚」の鳴き声を音データのサンプルとして用いることにします。

まずは、波形をプロットしてみます。グリットで示していますが、大凡、鳴き声1個は0.8秒の時間スケールであることが分かります。

ここからは、連続した鳴き声を0.8秒区切りで分割して詳しく見ていきます。
一般的に、連続した信号波形は時間変化している(=定常的ではない)ため、このように分割してフレーム単位で考えます。

上のプロットは、分割してフレーム毎に鳴き声波形を表しています。各プロットの右上の数字は、全体を分割した鳴き声波形の序数を表しています。
各フレーム毎に窓関数(ここでは、hann関数)をかけています。
詳細は割愛しますが、後述するフーリエ変換では分割したフレーム単位で考えるため、波形の繋がりをスムーズにする窓関数が用いられます。
確かに、各プロットでは、波形の始めと終わりがゼロに収束していることが分かります。

波形からスペクトルへ

ある信号波形をあらゆる周波数の正弦波に分解した時、どの周波数成分が強いか?について調べるために、「フーリエ変換」します。特に、分割したフレーム単位で考えるため、「短時間フーリエ変換」と呼んでいます。
フーリエ変換の詳細については、以前の記事をお読み頂ければと思います。

下のプロットは、信号波形のパワースペクトルです。
サンプリング周波数が、44100 [Hz]で録音されたため、半分の22050 [Hz](ナイキスト周波数と言います)まで周波数成分の強さを見ることが出来ます。
波形でも違いが見えていましたが、4番目の鳴き声は、5000 [Hz]付近で比較的、違いが目立つスペクトルが見えています。

メル尺度とメル周波数

メル尺度は、人間の聴覚、すなわち音の聞こえ方に基づいた尺度です。
人間の聴覚には、周波数の低い音に対して敏感で、周波数の高い音に対して鈍感である、という性質から考案された尺度になっています。
意味合いとしては、メル尺度の差が同じであれば、人間が感じる音高の差が同一であるということになります。
1000 [Hz]の音を1000 [mel]の音高と定められ、一例として以下のような関係式があります。ここで、melはメル尺度を表し、fは周波数を意味します。

$$
mel = 2595.0 \log_{10} \left( 1.0 + \frac{f}{700.0} \right)
$$

メル尺度を用いて、どの周波数を選ぶべきか?については、次のように考えていきます。
まず、上記で登場した、22050 [Hz](ナイキスト周波数)に対応するメル尺度を算出します。
次に、このメル尺度の値を上限として、0 [mel]と上限値との間を等分割します。
最後に、等分割して得られたメル尺度の値を対応する周波数へ戻すことにより、人間の聴覚に即した周波数スケール(これをメル周波数と言います)を作ることが出来ます。

以下に、等分割して得られたメル尺度とメル周波数の関係をプロットしてみました。
ここでは、分割数は64に設定しています。この分割数を大きく設定するとより細かい目盛りのスケールを作ることが出来ます。その逆も然りです。

スペクトルからメルスペクトルへ

メル周波数のスケールを作りましたが、ここからメルフィルタバンクという、スペクトルにかける三角窓のフィルタ(前述の窓関数のようなものと考えて下さい)を作成します。

メルフィルタバンクを以下にプロットしてみました。

少し複雑かもしれませんが、色違いの64本の三角窓の折れ線があります。
1本の三角窓の折れ線は、各メル周波数で最大値( = 三角窓の頂上)を取ります。
更に、各三角窓の面積は1になるようになっているため、高周波になるにつれて底辺が大きくなると高さが低くなっていきます。

スペクトルを系列データと見なして、移動平均を取るのとどう違うか?というと、実は、移動平均に近いとも考えられます。
実際、一つのメルフィルタバンクとスペクトルをかける(正確には、内積を取る)処理は「重み付けした移動平均」そのものです。
更に、通常の移動平均が系列データ1点ずつ処理するのに対して、メルフィルタバンクの方は指定した分割数のメル周波数ポイントのみになります。

人間の聴覚に基づいたメルフィルタバンクをかけることで、17640( = 44100 Hz ✕ 0.8 秒 ÷ 2)ポイントの情報を有するスペクトルが、64( = 指定したメル周波数の分割数)まで集約されることになります。

以下のプロットは、鳴き声一つ一つに対して、メルフィルタバンクをかけて得られたメルスペクトル(各サブプロットの橙色折れ線)です。元のスペクトル(各サブプロットの青色折れ線)も合わせて載せています。
メルスペクトルは通常の移動平均を取ったように見えるかもしれませんが、プロットしている点は、64( = 指定したメル周波数の分割数)ポイントのみであり、その周りの重み付けした移動平均であることに留意して下さい。

また、得られたメルスペクトル同士を以下のプロットで比較してみました。
確かに、4番目の鳴き声が5000 [Hz]付近で違いが見えています。更に、1番目の鳴き声も5000 [Hz]以下の周波数帯域で少し違いが見えています。

メルスペクトルからMFCCへ

このようなメルスペクトルは、これ自体、音響特徴量として用いられたりします。一方、音声認識等で良く使用されてきたMFCCもメルスペクトルから作られます。
実際の音響分析では、メル周波数ポイントの分割数は128が用いられることもあります。そのため、より情報を圧縮して次元数の低い特徴量があると便利です。

例えば、(メルスペクトルもスペクトルであるため、)対数にしたスペクトルに対して、フーリエ変換を行い、成分分析するという方法があります(一般に、ケプストラム分析と言います)。
ここでは、フーリエ変換ではなく、より低次元へ情報を圧縮出来る、かつ、成分間の相関を小さく出来るという性質を有する離散コサイン変換を適用します。
メルスペクトルに対して、離散コサイン変換し得られた成分、あるいは係数がMFCCです。このとき、係数は全てではなく、第0, 1, 2, ‥成分と付したとして第1〜12成分を用いたりします。
(第0成分は直流成分のため除きます。)

以下のプロットで、実際に得られたMFCC同士を比較してみました。
ざっと観察すると、MFCCの第1, 3, 4, 6番目の成分は比較的揃っていますが、第2番目の成分、あるいはより分かりやすい第5番目の成分は4番目の鳴き声に違いが現れています。
また、第8, 9番目等のより高次の成分では、1番目の鳴き声がに違いが現れています。
よりサンプル数(ここでは、フレーム数)が多くなると、違いを見るためには各成分毎に標準化処理してみると良いかもしれません。

終わりに

余談になりますが、MFCC特徴量でケプストラムという用語が使用されている背景について簡単に触れたいと思います。

前節で、「対数にしたスペクトルに対して、フーリエ変換を行う」という方法(ケプストラム分析)を述べました。周波数領域(frequency)に対して、フーリエ変換を行うため本来は時間領域になりますが、この領域を特に、ケフレンシー領域(quefrency)と呼んでいます。
同様に、スペクトル(spectrum)に対しては、フーリエ変換したものをケプストラム(cepstrum)という呼び方をしています。
MFCC特徴量は、ケフレンシー領域でありケプストラムを見ているためこのような用語が使用されている訳です。

お気づきの方もいるかと思いますが、これらの用語はスペルを逆から読んだ、アナグラムになっています。

本記事を通して、音声認識や異音検知での音響分析の世界を少しでもお伝えできれば幸いです。