# Rev.3.4 の変更点

Julius/Julian rev.3.4 の主な改善点は，Julianの統合・単語信頼度のサポート・クラスN-gram のサポートおよび細かいバグ修正です．Rev.3.3p4 から 3.4 への具体的な変更点は以下のとおりです。

- Julian（記述文法ベースの認識）の統合
- ライセンスの使用制限条項の撤廃
- 機能拡張
  - 単語信頼度のサポート（重要）
  - クラスN-gramのサポート（重要）
  - 録音ファイル形式をWAVに変更
- バグの修正
  - 音声入力・切り出しに関する修正（重要）
  - 一部の音響モデルがある条件で正しく計算できないバグを修正
  - バイナリN-gramの非互換性チェック
  - モジュールモードの出力の修正
  - 起動時のSystem Infoの出力書式を変更
- その他

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

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

以下に各項目の詳細を述べます。また、これらの変更に伴うオプション指定の変更について、本ドキュメントの末尾にまとめておきます。

## Julian（記述文法ベースの認識）の統合

本バージョンより、記述文法に基づく認識を行うエンジン「Julian」がJuliusに統合され、Julius/Julianともにフリーソフトウェアとして無償利用できるようになりました。

Julian は、Julius をもとに作られた、有限状態文法(DFA)に基づく連続音声認識パーザです。認識対象とする文のパターンを記述した認識用文法（有限状態文法）を与えることで、入力音声に対してその文法規則の元で最も尤もらしい単語系列を探しだし、文字列として出力します。

ディクテーションベースの Julius と異なり、Julianは人手で記述した認識文法を用いるので、小語彙の音声対話システムや音声コマンド入力など比較的小規模な音声認識システムに有用です。 またJulian では Julius で培われた音声認識の高精度化技術が多く含まれており、数千語の認識を非常に高速かつ高精度に行うことができます。

コンパイル時に`configure`オプション`--enable-julian`を指定することで、Julian をコンパイルできます。 Julian は多くのコンポーネントを Julius と共有していますので、使用方法はほぼ同バージョンのJulius と同じです。

Julianは、これまで連続音声認識コンソーシアムの会員にのみ配布されてきましたが、コンソーシアム活動の終了に伴い、Rev.3.4 より Julius とともに無償配布されることになりました。

Julius のアーカイブには、Julian および認識用文法の作成ツールが含まれています。Julian のコンパイル方法、使い方、および認識用文法の作成方法については、付属のドキュメントの以下の項目をご覧ください。（一部記述が古い部分があります）

- Julius/Julianについて
- Julius/Julianのインストール
- オンラインマニュアル
- 認識用文法の記述方法
- 文法作成ツールの使い方

## ライセンスの使用制限条項の撤廃

Juliusはこれまでもフリーソフトウェアとして無償公開してきましたが、 これまでのJuliusの利用ライセンス中に、下記のような条項がありました。

    4. あなたは、本ソフトウェアを原子力関連、航空管制その他の交通関連、医
    療、救急関連、警備関連その他人の生命、身体、財産等に重大な損害が発生す
    る危険を有するシステムに使用してはいけません。

この利用範囲に関する制限条項のために、Juliusは厳密にはフリーソフトウェアの定義に当てはまらず、自由な利用が憚られる可能性があるとの指摘を受けました。これをうけて、Rev.3.4より上記の利用条件を改めたライセンスに改訂しました。 詳しいライセンスの内容については以下をご覧ください。

- 新ライセンス (rev.3.4以降)

## 単語信頼度のサポート

Julius/Julianにおいて、認識結果に新たに「単語信頼度」を付与する機能が追加されました。以下に詳しく述べます。

### 単語信頼度とは

単語信頼度とは、認識システムの出す認識結果をどれだけ「信頼」してよいかを表す尺度です。認識システムがどれだけの確信をもってその認識結果を導き出したかを表す尺度とも言えることから、「確信度」とも呼ばれます。値は 0.0 〜 1.0 の値で、数値が高いほど信頼度が高い、すなわちその単語に競合するような他の候補が見あたらなかったことを示し、0 に近づくほど信頼度が低い、すなわち認識過程においてその単語のほかにも似たスコアをもつ単語の候補が多く競合していたことを示します。

この単語信頼度を用いることで、認識結果の処理において、信頼度の低い単語を認識結果から除外したり、信頼度の高い単語のみを用いて意図抽出やコマンド検出を行うといった処理を行うことができます。ただし、この信頼度はあくまで、認識エンジン自身が与えられた言語モデル・音響モデルの元で算出する「確信の度合い」にすぎません。確信度と認識精度の間にある程度高い相関はありますが、必ずしも常に「確信度が高い＝必ず正解」あるいは「確信度が低い＝必ず誤り」とは限りません。利用に際しては、この点をご留意ください。

### 算出アルゴリズム

このJulius/Julianで用いている単語信頼度算出アルゴリズムは、単語事後確率に基づく手法の一種で、探索中の部分文仮説のスコアから事後確率を近似的に算出することで、従来の単語グラフを用いる方法に比べて高速性を重視した計算方法となっています。詳しくは以下の文献をご覧ください。

- 李晃伸、河原達也、鹿野清宏、 "２パス探索アルゴリズムにおける高速な単語事後確率に基づく信頼度算出法", 情報処理学会研究報告, 2003-SLP-49-48, 2003-12
- Akinobu Lee, Kiyohiso Shikano, Tatsuya Kawahara, "Real-Time Word Confidence Scoring using Local Posterior probabilities on Tree Trellis Search," Proceedings of IEEE International Conference on Acoustics, Speech, and Signal Processing (ICASSP2004), May 2004 (accepted).

### 使い方

単語信頼度の出力は、以下のように第2パスの認識結果中に出力されます（赤文字の部分）。 値は 0.0 〜 1.0 の範囲です。

    ### Recognition: 2nd pass (RL heuristic best-first with 3-gram)
    samplenum=288
    sentence1:  個人技 が 、 随所 で 光っ た 。
    wseq1: <s> 個人技+コジンギ+2 が+ガ+58 、+、+75 随所+ズイショ+2 で+デ+58 光っ+ヒカッ+光る+44/17/8 た+タ+70/47/2 。+。+74 </s>l
    phseq1: silB | k o j i N g i | g a | sp | z u i sh o | d e | h i k a q | t a | sp | silE
    cmscore1: 0.667 0.262 0.217 0.925 0.732 0.610 0.808 0.544 0.897 1.000
    score1: -6941.169434
    822 generated, 712 pushed, 28 nodes popped in 288

認識結果の各単語の単語信頼度がスペース区切りで出力されます。なお`silB`, `silE`等の出力文字列を持たない単語も1単語として含んでいる点に注意してください（すなわち sentence行 ではなく wseq行に対応）。

### モジュールモードでの出力

モジュールモードで、クライアントへ第２パスの認識結果とともに単語信頼度を送ることができるようになりました。下記のように出力されます。

    <WHYPO WORD="個人技" CLASS="個人技+コジンギ+2" PHONE="k o j i N g i" CM="0.262"/>

信頼度を出力するには、サーバー側(Julius/Julian側)で起動時オプション "-outcode" の引数に "C" を追加してください。以下は第2パスで単語表記・単語列・音素列・スコア・信頼度を出力する場合の Julius 側の設定です。

     % julius .... -outcode WLPSC

### 設定

単語信頼度の計算はデフォルトで有効になっています。無効にする場合は`configure`で`--disable-cm`を指定してください。

信頼度計算のスムージング係数alphaを変更することが出来ます。この係数は事後確率計算におけるゆう度のダイナミックレンジを補正する係数で、0 に近いほど信頼度の値分布が平坦化します。単語信頼度の性能は、この係数によっても左右されます。値を変更するにはオプション `-cmalpha` で指定してください。デフォルトは 0.05 です（値の意味については上記の算出アルゴリズムの文献等をご覧ください）。

## クラスN-gramのサポート

Rev.3.4 のJuliusで、新たにクラスN-gramをサポートしました。 JuliusではクラスN-gramを以下の２つに分けて記述します。

1. クラス間のN-gram接続確率
2. クラス内の単語生起確率

以下にJuliusでのクラスN-gramの記述方法を説明します。

### クラス間N-gram

クラス間のN-gram確率は、通常の単語N-gramと全く同様に、クラス名を単位としたN-gramとして与えます。ARPA 形式の前向き2-gramファイルおよび後ろ向き3-gramファイル、あるいはそれらを `mkbingram` でバイナリ化したバイナリN-gramファイルとして与えることができます。

### クラス内単語生起確率

各クラスに属する単語については、そのクラス内での生起確率と読みなどの定義を単語辞書上で定義します。まず通常の単語N-gramの場合は、辞書中の単語エントリは以下のようになっています。

    単語表記 [出力文字列] 音素列・・・

クラスN-gramを用いる場合は、これらの前に「属するクラス名」、「クラス内単語生起確率」を以下のように記述します。

    クラス間N-gram上のクラス名 @クラス内単語生起確率の対数値 単語表記 [出力文字列] 音素列・・・

第1カラム目の「クラス名」は、クラス間のN-gramでのクラス名を表記します。 第2カラム目の「クラス内単語生起確率の対数値」は、その単語のクラス内での生起確率を、常用対数(log10)で指定します。

認識実行時には、このようにして作成したクラス付き単語辞書を、通常と同様に `-v` で指定します。形式はJulius側で自動判別されます。もちろん、 同時に使用するクラスN-gramと第1カラム目の名前の対応がとれている必要があります。

### 部分クラスN-gramについて

Juliusの内部では、単語N-gramとクラスN-gramを明示的に区別しておらず、単語N-gramはすべて「1クラス1単語からなるクラスN-gram」として処理しています。このため、単語エントリとクラスエントリを混在させることが可能です。たとえば単語N-gramにおいて一部の品詞カテゴリのみをクラス化する、といったような部分クラスN-gramを使用することができます。

このような部分クラスN-gramを使用する場合、単語N-gramのエントリは通常と同じように単語辞書で記述し、クラス化されたエントリについてのみ、上記のようにクラスの情報を記述します。以下は、地名が「＜地名＞」でクラス化されている部分クラスN-gramを想定した場合の辞書の記述例です。

    今日+42	[今日]	ky o:
    は+16	[は]	w a
    ＜地名＞ @-2.33251 京都+52 [京都] ky o: t o
    ＜地名＞ @-1.68893 奈良+52 [奈良] n a r a
    ＜地名＞ @-2.63574 和歌山+52 [和歌山] w a k a y a m a
    出張+6	[出張]	sh u q ch o:
    です+67	[です]	d e s u

### 設定

クラスN-gramサポートはデフォルトで有効になっています。クラスN-gramサポートにより単語辞書のメモリ使用量が（語彙数）x 4byte 増えます。クラスN-gramサポートを無効にしたい場合は`configure`で`--disable-class-ngram`を指定してください。

## 録音ファイル形式をWAVに変更

Julius/Julian および付属ツールで音声データをファイルに記録する際のファイル形式を、RAW形式から WAV 形式に変更しました。具体的には、以下の機能やツールにおいて、録音される音声ファイルの形式がデフォルトでwav形式になります。

- Julius/Julian の `-record` オプション
- `adinrec`
- `adintool`

なお、`adinrec`、`adintool` ではオプション `-raw`で従来と同じRAW形式での録音が可能です。

## バグの修正

### 音声入力・切り出しに関する修正

音声入力および音声区間切り出しに関する下記の修正を行いました。

- `Julius`,`adinrec`,`adintool`の音声切り出しのレベルしきい値(`-lv`)のデフォルト値を、3000から2000に変更
- 音声区間検出において末尾の無音部が長くなることがあるバグを修正
- 数フレームの短い入力を行うと落ちることがある脆弱性を修正
- DATLink/NetAudioでコンパイルに失敗するバグを修正
- マイクデバイスでモノラルの録音が出来ない場合に、代わりにステレオ録音を行いその左チャンネルを認識する機能を追加

### 一部の音響モデルがある条件で正しく計算できないバグを修正

tied-mixture ベースの音響モデルで、mixture 定義の一部に欠けがある場合に、Gaussian pruning をオフ (`-gprune none`) に指定すると正しく音響尤度の計算ができないバグを修正しました。

### モジュールモードの出力の修正

- 第２パスで認識誤り時の出力するタグ`<RECOGFAIL>`を`<RECOGFAIL/>`に訂正。
- 第２パスで`-n`で指定した数の文候補が見つからずに探索を終了したときに`</RECOGOUT>`が出力されないバグを修正

### バイナリN-gramの非互換性チェック

6万語以上の語彙を用いる設定（`./configure --enable-words-int`）の場合、通常設定で作成したバイナリN-gramは使用できません。上記の設定でコンパイルしたmkbingramを用いて作成しなおす必要があります。

Rev.3.4 では、JuliusのバイナリN-gram読み込み時にこの非互換性をチェックし、合わない場合はエラー終了するように改善しました。

### 起動時のSystem Infoの出力書式を変更

起動時のSystem Infoの出力書式を再構成しました。

## その他

- `-setting`オプションでエンジンのコンパイル時の設定を出力するようにしました。
- 全ソースのCopyright表示を更新しました。
- 音声ファイル名入力プロンプトでreadlineライブラリを使用しないようにしました。
- `-version`を`-setting`に変更
- `-hipass`を`-hifreq`に、`-lopass`を`-lofreq`に変更

なお古いオプションもこれまで通り受け付けます。

## オプション変更一覧

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

- 新規追加：`--enable-julian`
- 新規追加：`--disable-cm`
- 新規追加：`--disable-class-ngram`

起動時オプション：

- 新規追加：`-cmalpha value`
- 新規追加：`-outcode C`
- デフォルト変更：`-lv 2000`
- 新規追加：`-setting`
- 新規追加：`-hifreq`
- 新規追加：`-lofreq`

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