目次
HTK と SPTK で MFCC を計算する方法です。 コマンドはコピーするだけなので簡単ですが、ここへたどり着くまでの道のりが険しかったです。
HTK
HTK で MFCC を計算するには HCopy と HList が使えます。 私の場合は HList があれば十分でした、
これらを使うことで、 39次元の MFCC 、 正確には MFCC, Power, ΔMFCC, ΔPower, ΔΔMFCC, ΔΔPower が出力できます。
config
HTK で wav ファイル から MFCC を計算する場合、 計算の基礎となるパラメータを config
ファイル で設定できます。 設定しなくても使うことはできます。
以下がconfig
ファイルの例です。
1 2 3 4 5 6 7 8 9 10 |
SOURCEFORMAT = NOHEAD SOURCEKIND = WAVEFORM SOURCERATE = 625 TARGETKIND = MFCC_0_D_A TARGETRATE = 100000.0 WINDOWSIZE = 250000.0 USEHAMMING = T PREEMCOEF = 0.97 NUMCHANS = 24 NUMCEPS = 12 |
HCopy
HCopy
は Wave(.wav)ファイル から MFCC を計算できます。 計算された値はファイルに書き込まれます。
1 |
HCopy -C config.txt sample.wav sample.mfc |
上のコードにより、 sample.mfc
という、 MFCCデータの入ったファイルが作成されます。 HTK が定める形式のバイナリファイルです。
出力ファイルのフォーマットは、調べましたが私では読み解くことができませんでした。
HList
HList
は HCopy
によって作成された MFCCファイル を解析・表示できます。 また、 HList
単体でも Wave(.wav) から MFCC を計算できます。
- MFCCファイルを表示
HCopy
によって出力された内容を表示する方法です。1HList -r sample.mfc標準出力に表示されます。 ファイルに保存する場合はリダイレクトを使います。
- MFCCを計算して表示
-
1HList -C config.txt -r sample.wav
config.txt
はHCopy
で使用するものと同じファイルです。
使いそうなパラメータ
- -s N
表示を開始するサンプルデータの番号。 デフォルトで 0。
- -e N
表示を終了するサンプルデータの番号。 デフォルトで 0。
その他のオプションは HList
を引数なしで実行すると表示されます。
SPTK
SPTK でも Wave(.wav) から MFCC(12次元) を計算できます。 mfcc
コマンドで、 MFCC と Power を出力できます。 delta
コマンドでデルタを計算できますが、試してはいません。
オプションにこだわらないでシンプルにしたコードが次のコードです。
1 2 |
wav2raw sample.wav wav +sf < sample.wav.raw | frame | mfcc |
これで MFCC のファイルが作成されます。 作成されたファイルのフォーマットは バイナリ形式で float
の値を詰めた形です。
出力されたファイルを たとえば C++ で見ようとした場合次のようなコードで読み込みます。 (Qt 使っていますが、 重要なのはそこではなく、 fread
のところです。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
FILE *pfp = popen("wav2raw sample.wav; x2x +sf < sample.wav.raw | freme | mfcc".c_str(), "r"); QVector<QVector<float>> lines; float d[12]; while (fread(d, sizeof(float), 12, pfp) != 0) { QVector<float> values; for (int i = 0; i < 12; ++i) { values.append(d[i]); } lines.append(values); } pclose(pfp); |
Python だと struct.unpack
を用いて値を展開することができます。