
		Julius におけるポーズの扱いについて

							'03/01/08
							  李 晃伸

-*-Text-*-

□はじめに
===========

発話データにおける無音区間の扱いは，時間や発声位置によって，区間検出ア
ルゴリズム，音響モデル，言語モデル，デコーディングの様々なレベルでの対
処が必要である．以前より，Juliusでは無音区間の切り出しや無音単語の扱い，
ショートポーズセグメンテーションなどの機能が実装されていた．また，
Julius rev. 3.3p3 より，マルチパス版において単語間ショートポーズへの対
応が追加された．しかし，このように，発話データ中の無音部分について，そ
れぞれを扱う機能が個々に実装されており，各機能間の役割分担や設定方法な
どに不明確な点があった．

本文書では，3.3p3 における無音区間の扱いについてまとめて解説する．
無音区間をその出現位置と持続時間から分類を行い，それぞれに対応する処理
として，音声区間検出や無音単語，および3.3p3からの新機能である単語間ショー
トポーズの対応について解説する．また通常版/マルチパス版，Julius/Julian
などの設定の違いごとの設定方法を詳解する．ショートポーズセグメンテーショ
ンについても，ここで関連を整理して述べる．

なお，この文書は，Julius rev. 3.3p3 以降を対象とする．



□無音区間の分類
===============

入力音声データ中における，発話部分以外の「無音区間」について，その継続
時間から以下のように分類する．

1) long pause … 文と文の間の長い無音区間．Juliusはこれを基準に入力を
		 区切る．長さの目安はおよそ 300ms 以上．

2) short pause… 文中の無音．主にブレスや息継ぎによるもの．前後の音素
		 にコンテキストとして影響をおよぼす長さのものとする．
		 長さの目安は 100ms 以上300ms 以下．
3) very short pause … 文中の特に短い無音．瞬間の区切れに対応する．ト
		 ライフォンのコンテキストとしては無視される．
		 長さの目安は 20 〜 100ms．



□long pause … 音声入力の区切りのレベルで対処
===============================================

○解説

Julius/Julian は，音声データの入力ストリームに対して，発声区間のみを検
出して無音区間をカットし，その検出された発声区間単位で認識を行う機能を
持っている．

切り出しは，認識処理・特徴量抽出の前段階で行われる．ここでの「無音」の
基準は，一定時間内の零交差数とレベルの閾値である．

この音声切り出し処理は，デフォルトでマイク入力のときに ON, それ以外の
入力のときに OFF である．すなわち，マイク入力の場合は非発話状態（＝無
音状態）のときは認識が行われず，発話開始と同時に切り出しが行われ（同時
に第1パスの認識が始まる），発話終了（＝長い無音区間の発生）と同時に第1 
パスが終了し，第２パスが実行される．ファイル入力の場合は，デフォルトで
は切り出しは行われず，そのファイル全体を１つの入力として，特徴量抽出→
第1パス→第2パスの順で認識が行われる．


○設定方法

明示的に音声切り出し処理を ON/OFF したい場合は，オプション
"-cutsilence"および "-nocutsilence" を用いる．例えば，ファイル入力では
デフォルトでは切り出しを行わないが，複数の発話を含んだ長い音声ファイル
をオフラインでの切り出しを行わずにJuliusで切り出しながら逐次認識を行いたい
場合は，-cutsilence を指定すればよい．

切り出しのための音声区間検出アルゴリズムは，一定時間内の零交差数と振幅
レベルを基準とする．ある一定時間内において，振幅レベルが指定値以上の振
幅の零交差数が一定数以上になれば音声区間開始，同数が一定数以下になれば
発声終了とみなす．実際には，音声区間の先頭や末尾において音声の立ち上が
りや立ち下がりに相当する振幅の小さい部分が切れてしまうことを防ぐため，
発声開始時点より前と発声終了時点より後ろに，それぞれマージンを持たせて
検出する．振幅レベルの閾値は "-lv" （0-3276 7），零交差数は"-zc" （一
秒あたり），切り出し先頭のマージン長は "-headmargin" （単位：ミリ秒），
切り出し末尾のマージン長は "-tailmargin" （単位：ミリ秒）で指定する．

切り出しの1区間の最大長は 20 秒である．これを変更したい場合は，
ソースアーカイブの libsent/include/sent/speech.h の MAXSPEECHLEN の値
を変更して再コンパイルすればよい．ただし指定長に応じて必要メモリ量が増大
するので注意すること．


○モデルの対応

通常，音声区間はその先頭と末尾に無音区間を含む．通常の音声認識において
は，これらの無音は /sil/ （あるいは /silB/, /silE/）などの「無音単語」
を音響モデル・言語モデル上で用意することとなる．音響モデルでは学習サン
プルの文頭と文末の無音区間に対して学習した /silB/ や /silE/ などのモデ
ルを用意する．言語モデルにおいては，Julius （単語N-gram）では，通常，
元コーパスの学習文の最初と最後に文開始タグ <s> や文終了タグ</s> などを
付与して学習を行い，それぞれに「無音単語」を読みとして付与することでモ
デル化される．

     <s> [<s>] silB
     </s> [</s>] silE

また，記述文法（Julian）においては，文の先頭と末尾の無音単語は，
文法で明示的に指定する必要がある．

     S: NS_B SENTENCE NS_E

     % NS_B
     silB	silB
     % NS_E
     silE	silE

Julius では，以上のようなモデル化が行われていることを前提条件としてお
り，音声データの始終端の単語仮説をそれぞれ "<s>","</s>" に固定して探索
を行う．このため，Julius で認識を行う際には，"<s>", "</s>" という読み
の単語が単語辞書に登録されている必要がある．（ただしこれらの単語の発音
が /silB/, /silE/ である必要はない）これらの始終端単語の読みは，それぞ
れオプション "-silhead", "-siltail" で変更可能である．



□short pause … 言語モデル・辞書のレベルで対処
==================================================

○解説

実際の発話においては，1回の発話中にも，息継ぎや punctuation，言い淀み
などによる短い無音が出現する．この無音部は，より自然で日常的な発話におい
て多く現れる傾向にある．このような発話中の短い無音を，ここではショート
ポーズと呼ぶ．

ある程度の長さを持つショートポーズであれば，文頭や文末の無音単語と同様
に，ショートポーズを読みとする単語を辞書に加え，その文中の出現パター
ンを言語モデルで，音響的特徴を音響モデルで定義することで対処することが
できる．このショートポーズに対応する辞書中の単語を，以後『sp 単語』と呼ぶ．


○モデルの対応

sp単語の音響的特徴と出現位置は，それぞれ音響モデルと言語モデルでモデル
化される．通常，sp 単語は，学習コーパス中の無音部分から学習した無音モ
デル /sp/ として学習される．/sp/ の学習方法には，/sil/ との tee モデル
として学習する方法や，学習データベースに正確なショートポーズのアノテー
ションを行う方法などがあるが，Julius は学習方法には依存しない．

sp単語は通常の単語と同様に，トライフォン使用時には前後で単語間の音素環
境依存性が考慮される．すなわち，

    a | sp | b   →    ..-a+sp | sp | sp-b+..

というように，sp 単語の前後の単語については，sp がコンテキストとして考
慮される．

sp単語の出現パターンのモデル化は，言語に依存する部分が大きい．例えば，
IPAやCSRCで配布している日本語のN-gram言語モデルでは，読み上げ文中の読
点「、」にあたる部分にショートポーズが発生しやすいと考え，以下のように
読点を sp 単語として定義することで，ショートポーズを予測している．

    、+78 [、]  sp

あるいは，言語モデルで予測していない場合は，単純に辞書に sp 単語を追加
登録するだけでも効果があると考えられる．


○設定方法

辞書上の sp 単語の検出は，Julius/Julian の起動時に行われる．「単一また
は複数の /sp/ のみからなる単語」を検出し，それを sp単語として認識する．
この sp に相当する音響モデル名は，オプション "-spmodel" で変更できる．

Julius と Julian で，sp単語の扱いは異なる．

Julius では，sp 単語は通常の単語と全く同様に扱われる．
言語モデルや辞書中に sp 単語が定義されていない場合は，jconf オプション
"-iwspword" を指定することで，起動時に自動的に sp 単語のエントリを辞書
に追加して認識を行うことができる．この際，追加される sp 単語のエントリ
の内容は，"-iwspentry" で指定できる．デフォルトは "<UNK> [sp] sp sp"
である．

Julian では，文法で sp 単語の出現位置を明示的に指定する必要がある．sp 
単語の出現位置が文法（および辞書）で定義されていれば，その sp 単語に対
してスキップを考慮した特別な認識処理が行われる．sp 単語が定義されてい
ない場合，これらの sp 単語に関する処理はいっさい行われない．

また，Julius/Julian とも，sp 単語は辞書上で複数指定しても構わない．
Julius で辞書に既に sp 単語があるときに "-iwspword" を指定した場合も，
辞書にある sp 単語と "-iwspword" により自動追加された sp 単語は独立に
扱われる．



□very short pause … 音素 HMM のレベルで対処 （マルチパス版のみ）
==================================================================

○解説

実際の発話において，息継ぎなどによる短い無音が出現することは述べたが，
より自然な発声においては，さらに短い数十msのごく短時間の無音が単語間に
出現する場合があるとされている．

この単語間の短時間の無音に対処するために，Julius/Julian のマルチパス版
では，単語の末尾にコンテキストとして考慮されないショートポーズモデルを
付加してデコーディングを行う機能がある．オプション "-iwsp" を指定する
ことで，ショートポーズの音響モデル /sp/ を全単語の末尾に自動付加して
認識処理を行う．このとき、単語末尾に sp が登場しない場合も考慮して、そ
の /sp/ 全体をスキップする遷移も同時に付加される．すなわち，各辞書単語
に対する /sp/ の付加は以下のように行われる．


      <>  <>  <>           <>               <>  <>  <>  
  ○->●->●->●->○ + ○->●->○   =>  ○->●->●->●--->○
                                                      \<>/
                                                       ●
         /a/              /sp/                /a sp/

なお、/sp/ がモデルをスキップする遷移をあらかじめ持っている場合は，それ
を用いる．そのような遷移を持たない場合には，確率 1.0 のスキップ遷移が
自動的に付与される．

前節の sp 単語と比較したときの大きな処理の違いは，この sp がトライフォンの
コンテキストとして無視される点にある．単語間における音素環境依存性の処
理は，以下のように sp をスキップして行われる (context free)．これは，
このような短時間の無音はその前後の単語間の音素環境に対して影響が小さい
としているためである．

    a | sp | b   →    ..-a+b | sp | a-b+..

すなわち，Julius/Julian では，単語間のショートポーズに対する単語間音素
環境依存性の扱いを，ポーズの長さで変えていることとなる．ポーズが比較的
長い場合は sp 単語（context aware）にマッチさせ，短い場合は単語末尾へ
付加された sp (context free) で対処する．

単語末 sp と sp 単語との違いを以下にまとめる．

・対象時間：sp単語＝長時間(50msから200ms)，単語末sp＝単時間(10msから50ms)
・出現：sp単語＝言語モデルで指定，単語末sp＝全ての単語間に出現可能
・単語間トライフォン：sp単語＝context aware，単語末sp＝context free

なお，この単語末への /sp/ 自動付与による単語間ショートポーズの扱いは，
マルチパス版でのみサポートされる．通常版では，スキップ遷移の扱いの実装
が異なるため、現在はサポート外となっている．


○設定方法

単語末 sp 処理はデフォルトでは OFF であり，"-iwsp" を指定することで ON
となる．

付加するショートポーズの音響モデル名 /sp/ は "-spmodel" で変更可能
である．また，単語末尾に付加された sp への遷移確率（対数尤度）はオプショ
ン"-iwsppenalty" で指定できる．マイナス方向に大きくなるほど，sp の挿入
を抑制できる．（default: -1.0）



□自動アラインメント機能とショートポーズ処理について
======================================================

自動アラインメント(-walign, -palign, -salign)についても，上記のショー
トポーズの扱いが考慮される．認識結果について，sp 単語や単語末spが考慮
されたアラインメント結果が出力される．

sp 単語のアラインメント結果は通常の単語と同様に出力される．認識結果に
sp 単語が含まれれば，その部分は sp を挿入した形で forced alignment が
実行される．

単語末 sp については，自動アラインメントにおいて，各単語末ごとに sp を
挟む場合と挟まない場合で尤度の高い方が選択され，出力される．例えば「今
日」のアラインメント結果は，なら，-walign では「ky o:」「ky o: sp」の
うち尤度が高い方の区間が出力される．-palign では「ky」に続いて「o:」
「o: sp」のうち尤度が高い方の結果が出力される．-salign の場合は，sp 部
分の遷移に関しては [o:#4 (sp)] のように出力される．



□Julius/Julian の動作と設定方法
=================================

Julius における "-iwspword" による sp 単語の自動追加，および
Julius/Julian のマルチパス版における "-iwsp" による単語末へのsp付与は，
Julius-3.3p3 でサポートされた新機能である．
"-iwsp" では context-free な短時間ショートポーズに対応し，
"-iwspword" では context-aware な長時間ショートポーズに対応する．

Julius/Julian および 通常版/マルチパス版 ごとに設定可能な動作が異なる
ので注意されたい．以下に各エンジンでの設定方法をまとめる．

Julius（通常版）:
"-iwspword" のみ．"-iwsp" は扱えない．sp単語の出現確率は，あらか
じめ N-gram と辞書で学習しておくか，あるいは "-iwspword" で自動追加する
ことになる．自動追加の場合，読みやN-gramエントリを "-iwspentry" で指定
できる．

Julian（通常版）:
"-iwspword", "-iwsp" ともサポートしない．sp単語については辞書で明示的
に定義し，その出現しうる位置を文法で明示的に指定する必要がある．また，
sp 単語の読みに /sp/ と異なる名前の音響モデルを用いている場合は，
Julian がその単語を sp 単語として検出できるよう，"-spmodel" でその音響
モデル名を指定する必要がある．

Julius-multipath:
"-iwspword" および "-iwsp" を両方ともサポートする．"-iwspword"で自動追
加される sp 単語の読みや N-gramエントリは "-iwspentry"，"-iwsp" で単語
末へ付与される sp のモデル名は "-spmodel" で指定可能．

Julian-multipath:
"-iwsp" のみサポート．"-iwspword" は扱えない．sp単語については，辞書で
明示的に定義し，その出現しうる位置を文法で明示的に指定する必要がある．
また，sp 単語の読みに /sp/ 以外の名前の音響モデルを用いている場合は，
Julianがその単語を sp 単語として検出できるよう，"-spmodel" でその音響
モデル名を指定する必要がある．
"-iwsp" により単語末へ付与される sp のモデル名 "-spmodel" で指定する．



□ ショートポーズセグメンテーションについて
============================================

(注意！以下の使用は3.3p3ではまだ実現されていません。
 次回アップデートで対処の予定です）

Julius 3.2 以降の機能として，入力をショートポーズで逐次区切って認識し
ていくショートポーズセグメンテーションが実装されている．これはコンパイ
ル時に configure オプションとして "--enable-sp-segment" を指定すること
で可能となる．

音声データ入力の場合のショートポーズセグメンテーションは，
以下のアルゴリズムで行われる．

(1)入力音声に対して，前述の音声区間の切り出しが行われる．
(2)切り出された音声区間について，特徴量抽出が行われる．
(3)以下，音声区間全体の処理が終わるまでループ．
  (a)認識処理の第1パスを実行する．その際，sp 単語が『一定フレーム数以上連
     続して最尤仮説であった』場合，そこでいったん第1パスを中断して(b)へ．
  (b)(a)で処理した区間について第２パスを実行し，認識結果を出力する．
  (c)(a)で中断した位置から第1パスを再開する．(a)へ．

(3)の検出の条件である，sp単語が最尤仮説である連続フレーム数は，
オプション "-spdur" で指定する．単位はフレーム数，デフォルトは 10．

検出対象である sp 単語は，上記で述べた通り「単一または複数の /sp/ のみ
からなる単語」とする．この sp に相当する音響モデル名は，オプション
"-spmodel" で変更できる．

制限事項：現在のショートポーズセグメンテーションはいったん(1)で音声区
間の切り出しと特徴量抽出を行わないといけないため，マイク入力に対して行
うことは可能である．また Julian では同機能はサポートされていない．


								以上．
