HTK と SPTK で簡単に MFCC を計算する


HTK と SPTK で MFCC を計算する方法です。 コマンドはコピーするだけなので簡単ですが、ここへたどり着くまでの道のりが険しかったです。

HTK

HTK で MFCC を計算するには HCopy と HList が使えます。 私の場合は HList があれば十分でした、

これらを使うことで、 39次元の MFCC 、 正確には MFCC, Power, ΔMFCC, ΔPower, ΔΔMFCC, ΔΔPower が出力できます。

config

HTK で wav ファイル から MFCC を計算する場合、 計算の基礎となるパラメータを config ファイル で設定できます。 設定しなくても使うことはできます。

以下がconfigファイルの例です。

HCopy

HCopy は Wave(.wav)ファイル から MFCC を計算できます。 計算された値はファイルに書き込まれます。

上のコードにより、 sample.mfc という、 MFCCデータの入ったファイルが作成されます。 HTK が定める形式のバイナリファイルです。

出力ファイルのフォーマットは、調べましたが私では読み解くことができませんでした。

HList

HListHCopy によって作成された MFCCファイル を解析・表示できます。 また、 HList 単体でも Wave(.wav) から MFCC を計算できます。

MFCCファイルを表示

HCopy によって出力された内容を表示する方法です。

標準出力に表示されます。 ファイルに保存する場合はリダイレクトを使います。

MFCCを計算して表示

config.txtHCopy で使用するものと同じファイルです。

使いそうなパラメータ

-s N

表示を開始するサンプルデータの番号。 デフォルトで 0。

-e N

表示を終了するサンプルデータの番号。 デフォルトで 0。

その他のオプションは HList を引数なしで実行すると表示されます。

SPTK

SPTK でも Wave(.wav) から MFCC(12次元) を計算できます。 mfccコマンドで、 MFCC と Power を出力できます。 deltaコマンドでデルタを計算できますが、試してはいません。

オプションにこだわらないでシンプルにしたコードが次のコードです。

これで MFCC のファイルが作成されます。 作成されたファイルのフォーマットは バイナリ形式で float の値を詰めた形です。

出力されたファイルを たとえば C++ で見ようとした場合次のようなコードで読み込みます。 (Qt 使っていますが、 重要なのはそこではなく、 fread のところです。)

Python だと struct.unpack を用いて値を展開することができます。