音声認識メモ(HMM)その2(HTK HCopyコマンド(2))

音声認識は音声データをそのまま扱うのではなく、MFCCという音響特徴データに変換する。

MFCCは"Mel Frequency Cepstrum Coefficents"の略で、日本語にすると以下。

メル周波数 間隔の バンドパスフィルタ(メル周波数上で等間隔)出力の 離散コサイン変換

音というのは波で、複数の純音が重なり合っている(ならば、純音に分離できるということ)。
音声データは"x軸が時間でy軸が振幅"なので、これを"x軸が周波数でy軸が振幅"に変換する。
人間の耳は、高い周波数の音ほど違いが分かりにくくなるので、周波数の帯域に重み付け(フィルタ)をする。
周波数のうち、音声の特徴をよく表しているものを取り出す("次元"というのは、いくつ取り出すかを表す)

音響特徴データを得るためのコマンドが「HCopy」コマンド。
ソースファイル(HCopy.c)の冒頭コメントでは、以下の一文で要約されている。

Copy one Speech File to another

使い方

HCopy -C "<configファイル名>" "<音声ファイル名>" "<出力結果ファイル名>"

configファイルに指定するパラメータ例

SOURCEFORMAT = WAV
SOURCEKIND = WAVEFORM
SOURCERATE = 625
NUMCEPS = 12
TARGETKIND = MFCC_0_D_A
WINDOWSIZE = 250000.0
TARGETRATE = 100000.0
USEHAMMING = T
PREEMCOEF = 0.97
NUMCHANS = 24

意味は以下の通り。

SOURCEFORMAT = WAV / NOHEAD

フォーマット状態(ヘッダがあるかないか等)

SOURCEKIND = WAVEFORM

データの種類、"WAVEFORM"なら波形データであることを示す

SOURCERATE = 625

音声データの1サンプルあたりの時間。100ナノ秒単位で指定。

16KHz ->  625
 8KHz -> 1250

周波数の逆数で求める(16KHzを例にした計算式は以下のとおり)

1 / 16000[Hz] * 1000[ms] * 1000[us] * 1000[ns] / 100[ns]

NUMCEPS = 12

MFCCの次元数

TARGETKIND = MFCC_0_D_A

MFCCのタイプ

_0 -> 0次の係数を使う
_D -> 1次差分
_A -> 2次差分

前出の"NUMCEPS"に"12"を指定した場合、0次の分を加えて13次元、これの1次差分、2次差分をとると、MFCCの出力は39個(=13 * 3)になる。

WINDOWSIZE = 250000.0

MFCC計算の単位となる時間。100ナノ秒単位で指定。

TARGETRATE = 100000.0

MFCC計算の周期となる時間。100ナノ秒単位で指定。

USEHAMMING = T

ハミング窓を使う。データ境界での情報量の落ち込みを低減。

PREEMCOEF = 0.97

プリエンファシス係数。音声データの周波数成分の強調で使う。

NUMCHANS = 24

フィルタバンク解析で指定する係数。