# Rev.3.4.1 の変更点

Julius rev.3.4.1 はマイナーバージョンアップですが、認識アルゴリズムの改善やバイナリHMMのサポート、およびネットワーク入出力に関して多くの改善がなされています。rev.3.4 からの具体的な変更点は以下のとおりです。

- 性能改善
  - 認識アルゴリズムの改善（重要）
  - MFCC計算の高速化
- 機能拡張
  - バイナリHMMのサポート（重要）
  - 探索空間の可視化機能の追加
  - 直流成分除去
  - モジュールモードで入力長を出力
- バグの修正
  - 特にネットワーク音声入力、モジュールモードに関して

なお、個々のソースファイルの変更点についてはこちらをご覧ください。

- ChangedFiles_3.4.1.xls（MS Excel形式）

以下に各変更点について詳しく解説します。なお、これらの変更に伴うオプション指定の変更について、本ドキュメントの末尾にまとめておきます。

## 認識アルゴリズムの改善

Juliusの探索アルゴリズムを見直しました。特に、第２パスの探索の失敗事例について調査し、以下の２つの改善を行いました。これによって標準〜低ビーム幅での認識精度の向上が見込まれます。各手法と評価結果について以下に述べます（Julian については性能の変更はありません）。

### 第2パスの言語スコアの多重計算を修正

第２パスで、展開対象の単語の言語スコアを二重に計算していた問題を修正しました。

Juliusでは、第２パス探索における部分文仮説の評価値として、その時点までの3-gramを用いた前向き（right-to-left）スコアに、第1パスから得られる2-gramを用いたヒューリスティックスコア(left-to-right)を足したものを用いますが、従来のJuliusでは、ある仮説から次単語を展開する際に、接続部の単語において第1パスの2-gramの値と第２パスの3-gramの値の双方を加えて評価してしまっていました。探索中の評価値として展開単語のスコアが二重に加算されることから、若干の探索の不安定や最尤解のロストを招いていたと考えられます。

Rev.3.4.1ではこの問題を修正し、3-gramの値のみが正しく適用されるよう修正しました。この修正により、IPA'98テストセットでの認識率は以下のように改善が見られました（高速版Julius, PTM(GD)）。

バージョン | Word Correct | Word Accuracy
--- | --- | ---
3.4 | 92.1 | 90.6
3.4+LMfix | 92.3 | 91.2

この修正はデフォルトで有効になっています。以前と同じ動作に戻すには、`configure` で `--disable-lmfix` を指定してください。

### 第1パスの単語間トライフォンの計算方法を変更

Juliusでは、第1パスの単語末トライフォンの計算において、近似値として同じ左コンテキストを持つ全てのトライフォンの最大値を用いてきました。しかし、調べたところ、単語接続部分での音響スコアが真のトライフォンの値に比べて高くなりすぎてしまい、そのためヒューリスティックとしての性能が下がり第２パスの探索を停滞させるケースがみられました。特に、一音素や二音素からなる短い単語が辞書に多い場合に影響が大きいと思われます。

Rev.3.4.1では、この第1パスの単語末トライフォンの近似計算方法として、新たに上位N個のトライフォンの平均値を採用しました。従来の最大値、および平均値の手法も選択できますので、これで単語末トライフォンの計算方法は3通りから選択できるようになりました。

この修正による、IPA'98テストセットでの認識率の変化は以下のとおりです（高速版Julius, PTM(GD), N=3）

バージョン | Word Correct | Word Accuracy
--- | --- | ---
3.4 | 92.1 | 90.6
3.4+iwcdbest(N=3) | 92.2 | 91.2

Rev.3.4.1では、この新しい単語末トライフォン計算方法がデフォルトとなっています。従来と同じ方法に切り替えたい場合は、下記のように起動時オプション `-iwcd1 max` を指定してください。

- `-iwcd1 best N`: 上位N個の平均値（Julius-3.4.1デフォルト, N=3）
- `-iwcd1 max`: 最大値（Julius 3.4以前のデフォルト）
- `-iwcd1 avg`: 平均値（Julianのデフォルト:変更なし)

なお、`N`は計算する上位トライフォンの個数です。デフォルトは 3 となっています(いくつかのテストセットでの最適値)。`N`=1の場合 `-iwcd1 max` と等価であり、`N=極大` の場合 `-iwcd1 avg` と等価となります。

### 評価結果

これら２つの改善を加えた Rev.3.4.1 の、IPA'98テストセットでの評価結果は以下のようになりました(クリックすると拡大）。

探索アルゴリズムの改善により、3.4.1は3.4に比べてPTM(fast.GD)で1.1％の単語認識精度の向上が見られました。また、高精度版(high)においても若干ながら改善が見られました。また、言語尤度重みと単語挿入ペナルティを 3.4.1 で最適化したところ（表中の3.4.1-LMtuned、`-lmp 7.0 -1.0 -lmp2 8.0 -1.0`）、さらに認識率が改善する傾向が見られました

なお、本修正はJuliusの探索アルゴリズムを調節して探索の誤りを改善するものです。第1パスの結果および第2パスの探索中の仮説のスコアは従来から変化しますが、最終的な文仮説スコアは変化しません。よって、第1パス（`-b`）、第2パス（`-b2`）とも十分に大きい（＝ほぼ全探索の）条件では、性能の変化は微少であると予測されます。

## MFCC計算の高速化

MFCCパラメータの算出において、sin, cos計算をテーブル化することで計算を高速化しました。3.4以前の計算時間はPC上で入力長のおおよそ1/20〜1/10程度でしたが、このテーブル化によってほぼ一瞬で計算できるようになりました。

テーブルに必要なメモリ量はサンプリングレートやフレームシフトによって変動しますが、およそ8KB〜12KB程度です。

この改善はデフォルトで有効になっています。計算精度はテーブル化する前と全く変わりません（繰り返し演算をキャッシュしているだけなので）以前と同じ動作に戻すには：`configure` オプション `--disable-mfcc-table` を指定してください。

## バイナリHMMのサポート

新たにバイナリ形式のHMM定義ファイルの読み込みをサポートしました。従来のHTKフォーマットの ascii（テキスト）形式の hmmdefs に比べて読み込みが早くなり、起動時の初期化が高速になります。

このバイナリHMMファイルはJulius独自形式であり、HTK の binary format とは非互換です。変換には付属のツール`mkbinhmm`を使ってください。この`mkbinhmm`は、トライフォンやPTMを含め、Juliusで読み込めるすべてのHMM定義ファイルをバイナリ形式に変換できます。変換は以下の要領で行います。

     % mkbinhmm hmmdefs バイナリHMM

バイナリHMMを Julius/Julian で使うには、従来と同様に `-h` オプションで指定してください。テキスト／バイナリの判別は Julius/Julian 上で自動的に行われます。

     % julius ... -h バイナリHMM

この追加機能はデフォルトで有効になっています。なお形式は自動判別されるため、ascii形式のhmmdefsについても従来と同様に読み込めます。

## 探索空間の可視化機能の追加

Julius/Julian の認識処理の過程を可視化する機能を追加しました。Julius/Julian の内部でどのように解探索が行われ解が展開されていったかをグラフィカルに表示する機能です。

単語グラフ使用時（`configure --enable-word-graph --enable-wpair`）はその第1パスの結果の単語グラフも図示されます。また、`sox`がインストールされていれば、認識対象の音声データをその場で再生することもできます。

この機能はデフォルトでは無効となっています。有効にするには、コンパイル時に `configure` オプション `--enable-visualize` を指定してください。なおコンパイル・実行には GTK のライブラリが必要です。

     % ./configure --enable-visualize

詳しくは、探索空間の可視化機能の使い方をご覧ください。

## 直流成分除去

音声入力の直流成分（DC offset）を除去するオプション `-zmean`を追加しました。ファイル入力の場合はファイル単位で直流成分の計算と除去を行います。マイクやネットワーク入力の場合は、Juliusが立ち上がり入力の検知が開始された時点から数えて最初の 3 秒分(16kHzサンプリング時)のサンプルから直流成分の算出を行い、以降はその算出値を用いて除去を行います。

この機能はデフォルトで無効となっています。用いる際には `-zmean`を指定してください。

## モジュールモードで入力長を出力

モジュールモード（`-module`）使用時に、入力音声の長さが認識結果とともにクライアントへ出力されるようになりました。出力形式は下記のとおりです。

    <INPUTPARAM FRAMES="入力長（フレーム）" MSEC="入力長（ミリ秒）">

## バグの修正

### ネットワーク経由の音声送受信に関して

ネットワーク経由の音声受信 (`-input adinnet`)に関して、以下のバグを修正しました。

- 音声を受信し始めると同時に認識がスタートしない
- モジュールモード (`-module`)併用時に `PAUSE`, `TERMINATE` が効かないバグをFIX
- 接続のたびにプロセスを fork しないようにした (`configure --enable-fork`で元のforkする動作に戻せます）
- adin-cut.c 内のメモリリークを修正

また、`adintool`を用いたネットワーク経由の音声送信に関して以下のバグを修正しました。

- ファイルを連続して送信することができない不具合を修正

### 逐次デコーディング（ショートポーズセグメンテーション）の訂正

逐次デコーディング（あるいはショートポーズセグメンテーション）に関する多くのバグ修正を行いました。修正点を以下に列挙します。

- マイク入力時の以下の不具合を修正し、マイク入力での逐次デコーディングが可能になった。
  - 認識再開後最初の無音部ですぐにセグメントしてしまうことがあるバグを修正
  - 認識再開後の最初の数フレームについてゆう度計算が正しく行われないバグを修正
- 認識中断時に直前の認識結果の最終単語を仮説履歴として引き継ぐ機能について、最終単語が無音単語の場合に文頭に書き換えていたバグを修正
- CMNをセグメント単位ではなく切り出し単位で行うよう変更
- 無音に対応する単語が辞書上で固定位置に記述しなければならなかったのを修正。ショートポーズモデル名を `-spmodel` で与え、そのショートポーズモデルのみからなる単語を無音単語として用いるようにした。
- 認識したファイル数がおかしくなるバグを修正
- セグメントごとの入力フレーム数、および再開位置の出力を追加
- -record が動かなかったバグを修正。（録音はセグメント単位ではなく、通常と同じ切り出し単位で行われる）

### アラインメント機能のメモリリーク解消

単語／音素／状態単位のアラインメント機能（`-walign`, `-palign`, `-salign`）使用時のメモリリークを解消しました。

### CMN関連の修正

音響モデルで Cepstral Mean Normalization (CMN) を使用する・しないに関わらず、入力音声に対して常にCMNを行っていたバグを修正しました。

### その他

Windowsのサウンドレコーダーで録音した wav ファイルを読めないバグを修正しました。

辞書中にtriphoneの誤りがあったときのエラー出力を見やすくしました。

Sample.jconf, Sample-julian.jconf 等を Rev.3.4.1 の仕様に合わせて更新しました。

Julian用の文法作成ツールの使い方の英語版マニュアルを用意しました。

## オプション変更一覧

Julius-3.4.1 で変更された`configure`オプションおよび起動時オプションの一覧です。
`configure`オプション：

- 新規追加：`--enable-visualize`
- 新規追加：`--disable-lmfix`
- 新規追加：`--disable-mfcc-table`
- 新規追加：`--enable-fork`

起動時オプション：

- 新規追加：`-iwcd1 best N`
- 新規追加：`-zmean`

$Id: WhatsNew_3.4.1.html,v 1.4 2004/02/25 03:39:25 ri Exp $