HTKに関する先日の考察を踏まえて ruby による HTK ラッパーを実装してみました。
いまは連続数字音声認識のタスク(CENSREC-4の音声をrawからwavに変換したデータが対象)に依存したスクリプトになっているのですが、
$ rake clean
$ rake
$ rake train
$ rake hvite
$ rake hresults
のように使うことができます。
実装における基本的な考え方は
- インタフェースが複雑であったり安定しない場合は、目的に応じて自前のラッパーをかぶせる
- 手続きではなくモデルに着目してクラスを設計する
というところでしょうか。もはや HInit と HCompV と HRest の違いで初心者が躓くのは時代遅れのような気もするし、やりたいことをコーディングするときに入出力をファイル名やディレクトリ名で指定することも直感的ではないと思うのです。
下記では、音響モデルをコーパスで学習しながら精緻化するプロセスを、Model のインスタンス配列によって扱っています。
models = [] models << Model.first_train(data0,label) while models.last.num_mixes < TARGET_NUM_MIXES models << models.last.mixup_train(data0,label) end models.last.vite(data1,recout)
first_train メソッドはプロトタイプのモデルを作る処理、HCompV で平均と分散の初期化をする処理、HERest で最初の連結学習を行う処理をまとめてラップしています。クラスメソッドになっており、新しい Model クラスのインスタンスを返します。
mixup_train メソッドは Model のインスタンスメソッドです。HHEd でガウス分布の混合数をひとつ増やし、HERest を再度実行し、学習された新しいモデルのインスタンスを返します。メソッドの中で新しいインスタンスが生成されています。
Model クラスのインスタンスの実体は、一時ディレクトリに作られる MMF ファイルですが、ファイルやディレクトリに通し番号を付けて管理する作業を Model クラス実装の中に隠しています。
Model のインスタンスについて、dir メソッドで MMF が保存されたディレクトリ名を返します。また num_mixes メソッドは混合数を返します。
認識結果を得る HVite コマンドは Model の vite メソッドにラップされています。vite メソッドの引数で認識対象データを指定します。MFCC (*.mfc) ファイルのリストが格納されたスクリプトファイル名を指定しています。
まだまだ中途半端な実装ですが、なかなか興味深い方向性かなと思っています。
R のクラス設計をお手本に考えると、HVite や HResults などの出力をクラス化するのもよさそうです。
- 2009-06-27 : メソッドの説明を加筆しました。
- 2009-07-02 : wav 変換されたデータが対象であることを加筆しました。