HTK(Hidden Markov Model Toolkit)

 

早稲田大学 人間科学部 菊池英明
 

(2006/05/20) 研究室内音声認識ゼミのために作成・公開

 

1. インストール

(1)HTKのインストール

まず、以下の方法でHTK本体をインストールする。

 

環境・目的に応じてダウンロードすべきものが異なります。

 

[linux]

(a)アーカイブファイルのダウンロード

http://htk.eng.cam.ac.uk/download.shtmlの[HTK source code(tar+gzip archive)]よりダウンロードして展開。(2006/5/20現在バージョン3.3)。

 

[HTK samples(tar+gzip archive)]からサンプルもあわせてダウンロードしておくとよい。

(b)インストール

展開してできたhtk-3.3ディレクトリの中にあるREADMEを参照しながらインストール。

基本的には以下のとおり。

% ./configure

root% make all

root% make install

これによって、HTKのコマンドが/usr/local/bin.linuxにインストールされるので、ここにパスを通しておく(PATH変数に/usr/local/bin.linuxを加える)。

 

サンプルのインストールは以下のとおり(展開する場所はどこでもよい)。

% tar xzf /tmp/HTK-samples-3.3.tar.gz

これによってhtk-3.3ディレクトリ内にsamplesディレクトリができる。

(c)インストールの確認

% cd samples

% cd HTKDemo

% ./runDemo configs/monPlainM1S3.dcf

(2)音響モデル・言語モデルの準備

「IT Text 音声認識システム」(オーム社)付属CD-ROMからphone_m, lang_mディレクトリをコピー。場所は($CD-ROM)/{phone_m,lang_m}[K-lab.]。

 

(参考) HTK Speech Recognition Toolkit

 

2. チュートリアル

(参考) HTKBook

 

以下には、HTKBookのチュートリアルの章Chapter 3の訳・要約を示す。

本文とあわせるために章番号を3とする。

 

3.1 データ準備

学習データ: TIMITデータベースから

プロンプト(音声データを集める際に用いる提示文テキスト)

書き起こし

発音辞書

3.1.1 Step1- タスク文法(task grammar)

タスク文法はユーザのため。HTKはこれを単語ネットワーク(word network)に変換したものを用いる。

単語ネットワークはSLF(HTK Standard Lattice Format)で記される。

以下のコマンドにより作成される。

% HParse gram wdnet

 

;;;gram

$digit = ONE | TWO | THREE | FOUR | FIVE | SIX | SEVEN | EIGHT | NINE | OH | ZERO;
$name = [ JOOP ] JANSEN |
[JULIAN ] ODELL |
[ DAVE ] OLLASON |
[ PHIL ] WOODLAND |
[ STEVE ] YOUNG;
( SENT-START (DIAL <$digit> | (PHONE|CALL) $name) SENT-END )

 

;;;wdnet

VERSION=1.0
N=31 L=62
I=0 W=SENT-END
I=1 W=YOUNG
I=2 W=!NULL
I=3 W=STEVE
I=4 W=WOODLAND
I=5 W=PHIL
I=6 W=OLLASON

(中略)

3.1.2 Step2- 辞書(dictionary)

まず、(学習や認識に)必要な単語の並べ替え済みのリストを作る。

プロンプトから単語リストすなわち辞書を作るスクリプトprompts2wlistはHTKTutorialディレクトリにある。

#日本語のプロンプトに対しては形態素解析を行って単語リストを作成する必要がある。

;;;prompts //プロンプト

S0001 IT IS RAINING TODAY

 

;;;wlist //単語リスト

IS

IT

RAINING

TODAY

 

% HTKTutorial/prompts2wlist prompt wlist

次に発音辞書をHDManコマンドによって作成する。このコマンドは別途用意される辞書データを用いる。なお、以下ではプロンプトを元に作成した単語リストについてのみ発音辞書を作っているが、テストデータの文テキストについても単語リストを作成して統合してから作っておく必要がある。

% HDMan -m -w wlist -n monophones1 -l dlog dict beep names

 

;;;monophones1 //辞書に出現する単語に対応する音素リスト

ih
z
sp
t
r
ey
n
ng
ax
d

 

;;;dlog //HDManのログ

 

;;;beep //British English BEEP pronouncing dictionary

// svr-ftp.eng.cam.ac.uk/pub/comp.speech/dictionaries/beep.tar.gz

// なぜかオリジナルのまま使うと発音辞書が作成されないので書式を真似して作成(beep.k)

IS ih z
IT ih t
RAINING r ey n ih ng
TODAY t ax d ey

 

;;;names //固有名詞などを記述するための別の辞書。不要。

 

;;;dict //作成される発音辞書

IS ih z sp
IT ih t sp
RAINING r ey n ih ng sp
TODAY t ax d ey sp

 

;;;global.ded //発音辞書作成時の仕様

AS sp    //語末にsp(short pause)を追加

RS cmu //ストレス位置のマーキング(?)

MP sil sil sp //sil(長いポーズ)とspをsilに統合

3.1.3 Step3- データ録音

以下では、プロンプトをタスク文法から自動的に作る方法を示す。

タスク文法に出現する全単語について発音辞書を作っておく必要がある。

#プロンプトを手動で用意する場合、音声データが既にある場合はこの過程は不要。

;;;gram2 //タスク文法

//発音辞書(beepの方)に存在しない人名は省いた

$digit = ONE | TWO | THREE | FOUR | FIVE | SIX | SEVEN | EIGHT | NINE | OH | ZERO;
$name = JANSEN |
[ PHIL ] WOODLAND |
[ STEVE ] YOUNG;
( SENT-START (DIAL <$digit> | (PHONE|CALL) $name) SENT-END )

 

;;;wdnet2 //単語ネットワーク

//gram2を元にHParseで再度作成

VERSION=1.0
N=26 L=52
I=0 W=SENT-END
I=1 W=YOUNG
I=2 W=!NULL
I=3 W=STEVE
I=4 W=WOODLAND

 

;;;dict_gram //発音辞書の元

//タスク文法に出現する単語でかつ発音辞書(beepの方)に存在しない人名を省き発音を記してソートしたもの。

CALL k ao l sp
DAVE d ey v sp
DIAL d ay ax l sp
EIGHT ey t sp
FIVE f ay v sp

(中略)

 

;;;testprompts //テストプロンプト

//以下のコマンドによって作成される

1. DIAL SEVEN ZERO ZERO ZERO FOUR ONE TWO ZERO SIX EIGHT SIX TWO EIGHT EIGHT OH OH TWO
2. PHONE STEVE YOUNG
3. CALL YOUNG
4. DIAL EIGHT EIGHT FOUR ONE FIVE SEVEN SIX THREE ONE FOUR FOUR NINE FIVE FOUR
(中略)

 

%HSGen -l -n 200 wdnet2 dict_gram.sort > testprompts

   3.1.4 Step 4- 書き起こしファイル作成

HMM(音響モデル)を作成するには音声データとそれに対応する音素書き起こしファイル(phone level transcription)が必要。

音素書き起こしファイルにはspありとなしの2種類がある。spありは離散発声の学習に用いられる。

 

まず最初は文字(単語レベル)での書き起こしファイルを用意する。

 

3.1.2もしくは3.1.3のステップでプロンプトを作ったのであれば、それを元に以下のコマンドで作成できる。

% ../HTKTutorial/prompts2mlf mlf prompt

#引数の順番を間違えるとプロンプトの内容が消えるので要注意!

 

;;;mlf

#!MLF!#
"S0001.lab"
IT
IS
RAINING
TODAY
.

このように作成された単語レベル書き起こしファイルを元に、以下のコマンドによって音素レベル書き起こしファイルを作成する。なお"-l '*'"オプションを加えると、各発話の音声データと場所が完全に一致していなくてもOKになる。

% HLEd -l '*' -d dict -i phones0.mlf mkphones0.led mlf

 

;;;mkphones0.led

EX    //全単語を指定された発音辞書(dict)で置換

IS sil sil    //全発話の最初と最後にsilを追加

DE sp    //spを削除

 

;;;phones0.mlf

#!MLF!#
"*/S0001.lab"
sil
ih
t
ih
z
r
ey
n
ih
ng
t
ax
d
ey
sil
.

3.1.5 Step 5- 音声データのコーディング

音声波形から特徴ベクトルにパラメータ化する。

HTKはFFT分析とLPC分析をサポートしている。

どの分析(つまり特徴量)を利用するかは用途や音声データの種類に依存するが、音声認識一般にはMFCC(Mel Frequency Cepstral Coefficients)が良く用いられている。

 

以下のコマンドで特徴ベクトルの計算を行う。

% HCopy -TC config -S training.script

 

;;;config

#Coding Parameters
#SOURCEFORMAT = NOHEAD
#SOURCEKIND = WAVEFORM
#SOURCERATE = 625.0 # source sampling frequyency is 16[kHz]

TARGETKIND = MFCC_0 # Mel Frequency Cepstral Coefficients +
TARGETRATE = 100000.0 # frame interval is 10[msec]
SAVECOMPRESSED = T # set T, if you'd like to save disk storage
SAVEWITHCRC = T
WINDOWSIZE = 250000.0 # window length in 25[msec]
USEHAMMING = T # use HAMMING window
PREEMCOEF = 0.97 # apply high-pass filtering
NUMCHANS = 26 # filterbank channels
CEPLIFTER = 22
NUMCEPS = 12 # output 12 dimentions MFCCs
ENORMALISE = F

 

;;;training.script //元の音声データと作成される特徴ベクトルの対応を記したファイル

/raw/001.raw /mfcc/001.mfc

(中略)

3.2 モノフォンHMMの作成

 

3.2.1 Step 6-フラットな最初のモノフォンを作成

 

3.2.2 Step 7- サイレンス(silとsp)を加えたモデル

 

3.2.3 Step 8- 学習データの再アライメント(自動ラベリング)

 

3.3 状態結合トライフォンの作成

 

3.3.1 Step 9- モノフォンからトライフォン作成

 

3.3.2 Step 10- 状態結合トライフォンの作成

 

3.4 音声認識の評価

 

3.4.1 Step 11- テストデータの認識

 

 

3. 音響モデルの学習

(参考) 研究報告「大語彙連続音声認識研究環境の整備 〜毎日新聞記事読み上げ音声コーパスの自動ラベリング〜」菊池英明, 1997.12(非公開)

 

#ファイルを指定しての音声認識

 

2. 連続音声認識

#ファイルを指定しての音声認識

% julius -C Sample.jconf

 

#マイクからの音声認識(あらかじめオーディオの設定(Windows, Linux)が必要)

% julius -C Sample.jconf -input mic

3. 孤立単語認識

3.0 インストール

juliusの孤立単語認識キットをインストールする必要がある(Unix環境が必要).さらに、julianがインストールされている必要もある.

 

まず、juliusのインストール時に、--enable-julianオプションを付加してconfigureを実行。

% cd julius-3.4.2

% ./configure --enable-julian

% make all

% make install

さらに、juliusの孤立単語認識キット(julius-wordrecog-kit-v2.tar.gz)を展開する。

% cd /pub/julius

% tar zxf julius-wordrecog-kit-v2.tar.gz

 

3.1 設定ファイル

設定ファイル(jconf.julian)をダウンロードして必要に応じて修正する。

単語辞書ファイル(発音辞書ファイル)の名前は"word.dic"に設定してある。

3.2 単語辞書ファイル(発音辞書ファイル)作成

Julius付属のツールを使ってあらかじめ作成した単語リストから単語辞書ファイルを作成する。

単語リストは以下の形式で作成する。

林檎 りんご

胡麻 ごま

マンゴー まんごー

上記単語リストファイルを"word.lst"、単語辞書ファイル(発音辞書ファイル)を"word.dic"とすると、以下のようにして単語辞書ファイルを作成できる。

 

% /pub/julius/julius-wordrecog-kit-v2/make_dict.pl word.lst > word.dic

 

作成される単語辞書ファイルは以下のようになる。

0   [林檎]  r i N g o

0   [胡麻]  g o m a

0   [マンゴー]  m a N g o:

1   [<s>]  silB

2   [</s>]  silE

3.3 孤立単語認識実行

以下のコマンドを実行。

 

% julian -C jconf.julian

4. 音素セグメンテーション(音素自動ラベリング)

[Win]

4.1 単語・音素セグメンテーションキットをインストール

単語・音素セグメンテーションキットをダウンロード。http://julius.sourceforge.jp/の[ダウンロード]→[応用キット]→[単語・音素セグメンテーションキット]よりダウンロードして解凍。

0) あらかじめCygwinをインストールしておく。

1) Cygwinの/tmpディレクトリなどに、ダウンロードしたアーカイブ(julian-segmentation-kit-v1.0.0.tar.gz)を移す。

2) Cygwinを起動。

3) ホームディレクトリで解凍。

$ tar xzf /tmp/julian-segmentation-kit-v1.0.0.tar.gz

 これでjulian-segmentation-kit-v1.0ディレクトリがホームディレクトリに出来る。

4.2 Julian記述文法音声認識キットをインストール

Julian記述文法音声認識キットをダウンロード。http://julius.sourceforge.jp/の[ダウンロード]→[文法認識キット]→[Windows版Julian記述文法音声認識キット v.3.0]をダウンロード。(音素セグメンテーションキットのreadmeにはv.3.1p1以降が必要とありますがWindows用は今のところこれを使うしかない(?))

ダウンロード後、zipファイルを展開するとjulian-kit-v3.0-winディレクトリができる。

ここで、4.1でできたjulian-segmentation-kit-v1.0の中の全てのファイルを、4.2でできたjulian-kit-v3.0-winディレクトリの中のbinディレクトリに入れてしまう。

4.3 音素セグメンテーションの起動スクリプトを修正

julian-kit-v3.0-winディレクトリの中にコピーした音素セグメンテーション起動スクリプトsegment_julian.plの一部を修正。

$julianbin ="julian";

$hmmdefs ="../model/phone_m/hmmdefs_monof_mix16_gid.binhmm

4.4 コマンドプロンプトで音素セグメンテーションキットを実行

0) あらかじめPerlをインストールしておく。

1) コマンドプロンプトを起動。

2) コマンドプロンプトで以下のコマンドを実行

> cd (julian-kit-v3.0-winディレクトリ)\bin

> segment_julian.pl sample\sample.wav sample\sample.trans

これでjulian-kit-v3.0-winディレクトリの下にコピーされたsampleディレクトリの中に自動ラベリング結果のsample.trans.alignが出来ているはずなので、中身を確認して、さらにその下のresultディレクトリにある同じ名前のファイルと結果が一致しているかを確認する。

他の音声に対して音素セグメンテーションを行うには、上のコマンドの様に音声ファイルとラベルファイルを指定すればよい。ラベルファイルは以下の形式。

silB ky o: w a i i t e N k i d a silE

4.5 結果の整形

音素セグメンテーション結果はjulius独自の形式であるため、他のソフトウェアで利用するには整形する必要がある。


 

Copyright ©2004 KIKUCHI Hideaki All rights reserved.