(57)【要約】【課題】有向グラフの探索中の処理を軽減する。【解決手段】実施形態のデコーダは、有向グラフを探索して、入力された信号列または信号の特徴量列に応じたラティスの一部または全部を生成する。デコーダは、トークン操作部と、ノード追加部と、接続検出部と、を備える。トークン操作部は、信号または特徴量を入力する毎に、探索中の経路の先頭の状態が割り当てられたオブジェクトである複数のトークンのそれぞれを、有向グラフに従って、空ではない入力記号が割り当てられている状態または遷移に達するまで移動させる。ノード追加部は、トークンを移動させる毎に、複数のトークンのそれぞれに割り当てられた状態に対応するノードをラティスに追加する。接続検出部は、ｉ回目（ｉは１以上の整数）にラティスに追加したノードに接続された、ｉ＋１回目にラティスに追加したノードを、有向グラフを参照して検出する。【選択図】図３
2015121709.tif 000002
【特許請求の範囲】
【請求項１】
有向グラフを探索して、入力された信号列または前記信号の特徴量列に応じたラティスの一部または全部を生成するデコーダであって、
前記有向グラフは、入力記号および出力記号が状態または遷移に割り当てられ、
前記入力記号は、前記信号または前記特徴量から信号スコアを算出するためのアルゴリズムまたはデータの少なくとも一方を示すスコア識別子であり、
前記デコーダは、
前記信号または前記特徴量を入力する毎に、探索中の経路の先頭の状態が割り当てられたオブジェクトである複数のトークンのそれぞれを、前記有向グラフに従って、空ではない入力記号が割り当てられている状態または遷移に達するまで移動させるトークン操作部と、
トークンを移動させる毎に、前記複数のトークンのそれぞれに割り当てられた状態に対応するノードを前記ラティスに追加するノード追加部と、
ｉ回目（ｉは１以上の整数）に前記ラティスに追加したノードに接続された、ｉ＋１回目に前記ラティスに追加したノードを、前記有向グラフを参照して検出する接続検出部と、
を備えるデコーダ。
【請求項２】
ｉ回目に前記ラティスに追加したノードから、ｉ＋１回目に前記ラティスに追加したノードへのアークを、前記ラティスに追加するアーク追加部をさらに備える
請求項１に記載のデコーダ。
【請求項３】
前記アーク追加部は、前記ノード追加部によるノードの追加が完了した後に、前記アークを前記ラティスに追加する
請求項２に記載のデコーダ。
【請求項４】
前記トークンを移動させる毎に、前記複数のトークンのそれぞれに対して、経路の先頭の状態または遷移に割り当てられた前記入力記号に応じた信号スコア、および、経路上の前記信号スコアを累積した累積スコアを算出するスコア算出部をさらに備える
請求項１に記載のデコーダ。
【請求項５】
前記ノード追加部は、追加する前記ノードのそれぞれに対して、
元となる前記トークンの前記信号スコアおよび前記累積スコア、
並びに、元となる前記トークンが表す経路の先頭の状態を関連付ける
請求項４に記載のデコーダ。
【請求項６】
前記接続検出部は、
ｉ回目に追加したノードを第１のノードとし、前記第１のノードに接続されたｉ＋１回目に追加したノードを第２のノードとした場合、
前記第２のノードに関連付けられた前記累積スコアが、前記第１のノードに関連付けられた前記累積スコアと前記第２のノードに関連付けられた前記信号スコアとを加算した値に一致する経路を検出する
請求項５に記載のデコーダ。
【請求項７】
前記有向グラフは、さらに、状態または遷移に重みが割り当てられており、
前記スコア算出部は、前記複数のトークンのそれぞれに対して、前記信号スコア、および、前記トークンが表す経路上の前記重みと前記信号スコアとを累積した累積スコアを算出する
請求項４に記載のデコーダ。
【請求項８】
前記ノード追加部は、追加する前記ノードのそれぞれに対して、
元となる前記トークンの前記信号スコアおよび前記累積スコア、
並びに、元となる前記トークンが表す経路の先頭の状態を関連付ける
請求項７に記載のデコーダ。
【請求項９】
前記接続検出部は、
ｉ回目に追加したノードを第１のノードとし、前記第１のノードに接続されたｉ＋１回目に追加したノードを第２のノードとした場合、
前記第２のノードに関連付けられた前記累積スコアが、前記第１のノードに関連付けられた前記累積スコアと前記第２のノードに関連付けられた前記信号スコアと前記第１のノードと前記第２のノードとを接続する経路上の重みとを加算した値に一致する経路を検出する
請求項８に記載のデコーダ。
【請求項１０】
予め定められた数の前記信号または前記特徴量が入力される毎に、前記ラティスから不要なノードを削除する削除部
をさらに備える請求項１に記載のデコーダ。
【請求項１１】
前記削除部は、前記有向グラフを参照して、ｉ回目に前記ラティスに追加したノードのうち、ｉ＋１回目に前記ラティスに追加したノードの何れにも到達できないノードを削除する
請求項１０に記載のデコーダ。
【請求項１２】
前記トークンを移動させる毎に、前記複数のトークンのそれぞれに対して、経路の先頭の状態または遷移に割り当てられた前記入力記号に応じた信号スコア、および、経路上の前記信号スコアを累積した累積スコアを算出するスコア算出部をさらに備え、
前記削除部は、
ｉ回目に追加したノードを第１のノードとし、前記第１のノードに接続されたｉ＋１回目に追加したノードを第２のノードとした場合、
前記第２のノードに関連付けられた前記累積スコアが、前記第１のノードに関連付けられた前記累積スコアと前記第２のノードに関連付けられた前記信号スコアとを加算した値に一致する経路を除く経路上のノードを削除する
請求項１１に記載のデコーダ。
【請求項１３】
前記有向グラフは、さらに、状態または遷移に重みが割り当てられており、
前記スコア算出部は、前記複数のトークンのそれぞれに対して、前記信号スコア、および、前記トークンが表す経路上の前記重みと前記信号スコアとを累積した累積スコアを算出し、
前記削除部は、
ｉ回目に追加したノードを第１のノードとし、前記第１のノードに接続されたｉ＋１回目に追加したノードを第２のノードとした場合、
前記第２のノードに関連付けられた前記累積スコアが、前記第１のノードに関連付けられた前記累積スコアと前記第２のノードに関連付けられた前記信号スコアと前記第１のノードと前記第２のノードとを接続する経路上の重みとを加算した値に一致する経路を除く経路上のノードを削除する
請求項１２に記載のデコーダ。
【請求項１４】
前記デコーダは、
互いに並行して処理を実行する複数の前記トークン操作部と、
互いに並行して処理を実行する複数の前記重複除去部と、
前記複数のトークンを前記複数のトークン操作部に対応した複数の小集合に分割して、前記複数のトークン操作部のそれぞれに、対応する小集合に含まれるトークンを分配する第１分割部と、
前記複数のトークン操作部により移動された複数のトークンを収集する第１収集部と、
前記第１収集部により収集された前記複数のトークンを前記複数の重複除去部に対応した複数の小集合に分割して、前記複数の重複除去部のそれぞれに、対応する小集合に含まれるトークンを分配する第２分割部と、
前記複数の重複除去部による除去の結果、残った複数のトークンを収集する第２収集部と、
をさらに備える
請求項１に記載のデコーダ。
【請求項１５】
前記第２分割部は、同一の状態に到達したトークンを同一の小集合に含める
請求項１４に記載のデコーダ。
【請求項１６】
前記トークンが移動される毎に、前記トークンが表す経路の先頭の状態または遷移に割り当てられた前記入力記号に応じた信号スコア、および、前記トークンが表す経路上の前記信号スコアを累積した累積スコアを、互いに並行して算出する複数のスコア算出部と、
前記複数のトークンを前記複数のスコア算出部に対応した複数の小集合に分割して、前記複数のスコア算出部のそれぞれに、対応する小集合に含まれるトークンを分配する第３分割部と、
前記複数のスコア算出部により前記信号スコアおよび前記累積スコアが算出された複数のトークンを収集する第３収集部と、
をさらに備える
請求項１に記載のデコーダ。
【請求項１７】
累積スコアが一定以上悪いトークンを、互いに並行して除去する複数の枝刈部と、
前記複数のトークンを前記複数の枝刈部に対応した複数の小集合に分割して、前記複数の枝刈部のそれぞれに、対応する小集合に含まれるトークンを分配する第４分割部と、
前記複数の枝刈部による除去の結果、残った複数のトークンを収集する第４収集部と、
をさらに備える請求項１に記載のデコーダ。
【請求項１８】
同一の状態に到達した複数のトークンのうち前記累積スコアが最良のトークンを残存させる重複除去部をさらに備える
請求項１６に記載のデコーダ。
【請求項１９】
コンピュータにより、有向グラフを探索して、入力された信号列または前記信号の特徴量列に応じたラティスの一部または全部を生成するデコード方法であって、
前記有向グラフは、入力記号および出力記号が状態または遷移に割り当てられ、
前記入力記号は、前記信号または前記特徴量から信号スコアを算出するためのアルゴリズムまたはデータの少なくとも一方を示すスコア識別子であり、
前記信号または前記特徴量を入力する毎に、探索中の経路の先頭の状態が割り当てられたオブジェクトである複数のトークンのそれぞれを、前記有向グラフに従って、空ではない入力記号が割り当てられている状態または遷移に達するまで移動させるトークン操作ステップと、
トークンを移動させる毎に、前記複数のトークンのそれぞれに割り当てられた状態に対応するノードを前記ラティスに追加するノード追加部と、
ｉ回目（ｉは１以上の整数）に前記ラティスに追加したノードに接続された、ｉ＋１回目に前記ラティスに追加したノードを、前記有向グラフを参照して検出する接続検出ステップと、
を含むデコード方法。
【請求項２０】
コンピュータを、有向グラフを探索して、入力された信号列または前記信号の特徴量列に応じたラティスの一部または全部を生成するデコーダとして機能させるためのプログラムであって、
前記有向グラフは、入力記号および出力記号が状態または遷移に割り当てられ、
前記入力記号は、前記信号または前記特徴量から信号スコアを算出するためのアルゴリズムまたはデータの少なくとも一方を示すスコア識別子であり、
前記コンピュータを、
前記信号または前記特徴量を入力する毎に、探索中の経路の先頭の状態が割り当てられたオブジェクトである複数のトークンのそれぞれを、前記有向グラフに従って、空ではない入力記号が割り当てられている状態または遷移に達するまで移動させるトークン操作部と、
トークンを移動させる毎に、前記複数のトークンのそれぞれに割り当てられた状態に対応するノードを前記ラティスに追加するノード追加部と、
ｉ回目（ｉは１以上の整数）に前記ラティスに追加したノードに接続された、ｉ＋１回目に前記ラティスに追加したノードを、前記有向グラフを参照して検出する接続検出部
として機能させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、デコーダ、デコード方法およびプログラムに関する。
【背景技術】
【０００２】
入力される信号のパターンを認識して、入力された信号列を対応する記号列へと変換する技術が知られている。例えば、音声信号を認識する技術、文字が記載された画像から文字を認識するＯＣＲ（Optical  Character  Recognition）技術、手書き文字を認識する技術、または、画像からジェスチャまたは手話等を認識する技術等が知られている。また、このような技術を実現する装置として、有限状態オートマトンに出力記号を付加した有向グラフ（例えば、重み付き有限状態トランスデューサ）を探索するデコーダが知られている。
【０００３】
ところで、重み付き有限状態トランスデューサ等の有向グラフを探索するデコーダは、探索中にラティスを生成することもできる。しかし、このようなデコーダでは、探索が進むに従って、ラティスに多くのノードおよびアークを追加しなければならなかった。さらに、このようなデコーダでは、探索が進むに従って、ノード間の接続を示すポインタまたはアークが増加するので、これらを適宜に破棄しなければならなかった。このため、探索中にラティスを生成するデコーダでは、探索中における処理量が膨大となってしまっていた。
【先行技術文献】
【非特許文献】
【０００４】
【非特許文献１】G.  Saon,  D.  Povey,  and  G.  Zweig,  “Anatomy  of  an  extremely  fast  LVCSR  decoder,”  in  Proceedings  of  INTERSPEECH,  2005,  pp.  549-552.
【非特許文献２】D.  Povey,  M.  Hannemann,  G.  Boulianne,  L.  Burget,  A.  Ghoshal,  M.  Janda,  M.  Karafiat,  S.  Kombrink,  P.  Motlicek,  Y.Qian,  K.  Riedhammer,  K.  Vesely,  and  N.  T.  Vu,  “Generating  exact  lattices  in  the  WFST  framework,”  in  Proceedings  of  the  International  Conference  on  Acoustics,  Speech,  and  Signal  Processing  (ICASSP  '12),  2012,  pp.  4213-4216.
【非特許文献３】S.J.  Young,  N.H.  Russell  and  J.H.S.  Thornton,“Token  passing:  A  simple  conceptual  model  for  connected  speech,  recognition  systems”,  Cambridge  University  Engineering  Department,  1989
【非特許文献４】S.  Phillips,  “Parallel  speech  recognition”,  International  Journal  of  Parallel  Programming,  Vol.  27,  No.  4,  1999,  pp.  257-288.
【発明の概要】
【発明が解決しようとする課題】
【０００５】
本発明が解決しようとする課題は、有向グラフの探索中の処理を軽減することにある。
【課題を解決するための手段】
【０００６】
実施形態のデコーダは、有向グラフを探索して、入力された信号列または前記信号の特徴量列に応じたラティスの一部または全部を生成する。前記有向グラフは、入力記号および出力記号が状態または遷移に割り当てられる。前記入力記号は、前記信号または前記特徴量から信号スコアを算出するためのアルゴリズムまたはデータの少なくとも一方を示すスコア識別子である。前記デコーダは、トークン操作部と、ノード追加部と、接続検出部と、を備える。前記トークン操作部は、前記信号または前記特徴量を入力する毎に、探索中の経路の先頭の状態が割り当てられたオブジェクトである複数のトークンのそれぞれを、前記有向グラフに従って、空ではない入力記号が割り当てられている状態または遷移に達するまで移動させる。前記ノード追加部は、トークンを移動させる毎に、前記複数のトークンのそれぞれに割り当てられた状態に対応するノードを前記ラティスに追加する。前記接続検出部は、ｉ回目（ｉは１以上の整数）に前記ラティスに追加したノードに接続された、ｉ＋１回目に前記ラティスに追加したノードを、前記有向グラフを参照して検出する。
【図面の簡単な説明】
【０００７】
【図１】第１実施形態に係るパターン認識装置のブロック図。
【図２】第１実施形態に係るデコーダのブロック図。
【図３】第１実施形態に係るパターン認識装置の処理順序を示すフロー図。
【図４】第１実施形態に係るデコーダの処理を表す擬似コードを示す図。
【図５】第１実施形態に係るデコーダの処理を示す遷移図。
【図６】第１実施形態に係るパターン認識装置のハードウェアブロック図。
【図７】第２実施形態に係るデコーダのブロック図。
【図８】第２実施形態に係るデコーダの処理を表す擬似コードを示す図。
【図９】第２実施形態に係るデコーダの処理を表す擬似コードの変形例を示す図。
【図１０】第３実施形態に係るデコーダのブロック図。
【図１１】第３実施形態に係るデコーダの処理を表す擬似コードを示す図。
【図１２】第４実施形態に係るデコーダのブロック図。
【図１３】第４実施形態に係るデコーダのスレッドのブロック図。
【図１４】メインスレッドが実行する処理を表す擬似コードを示す図。
【図１５】ワーカースレッドが実行する処理を表す擬似コードを示す図。
【発明を実施するための形態】
【０００８】
＜前提＞
まず、本実施形態の前提となる技術について説明する。
【０００９】
（ＷＦＳＴ）
本実施形態では、有向グラフの一例である重み付き有限状態トランスデューサ（ＷＦＳＴ）を探索する。なお、本実施形態では、有向グラフとしてＷＦＳＴを用いる例を説明するが、入力記号および出力記号および重みが、状態または遷移の何れかに割り当てられていれば、割り当てパターンが異なる他の有向グラフを探索してもよい。また、重みの付いていない有向グラフ（すなわち、重みが０の場合と同様）を探索してもよい。
【００１０】
ＷＦＳＴは、遷移に入力記号および出力記号が割り当てられ、遷移に重みが割り当てられる。ＷＦＳＴは、状態の集合Ｑ、遷移の集合Ｅ、入力記号の集合Σ、出力記号の集合Γ、重みの集合Ｋ、初期状態の集合Ｉ、終了状態の集合Ｆ、初期重み関数λ、および終了重み関数ρの９つの要素の組（Ｑ，Ｅ，Σ，Γ，Ｋ，Ｉ，Ｆ，λ，ρ）で構成される。遷移は、５つの要素の組（前状態，次状態，入力記号，出力記号，重み）で構成される。
【００１１】
重みの集合Ｋは、一例として、整数全体の集合、実数全体の集合、複素数全体の集合、行列、ブーリアン（０および１）の集合等である。重みの集合Ｋは、正でない実数の集合または負でない実数の集合等であってもよい。初期状態ｑｉ∈Ｉに対応する初期重みは、λ（ｑｉ）である。終了状態ｑｆ∈Ｆに対応する終了重みは、ρ（ｑｆ）である。また、入力記号の集合Σおよび出力記号の集合Γは、空記号εを含んでもよい。
【００１２】
（音響モデル、信号スコア）
例えば、ＷＦＳＴを用いて連続的に音声認識をする場合を考える。この場合、認識処理に先立って、まず、入力された音声信号の特徴量を音声を表す細かい単位（例えば音素）へと変換するための音響モデル、音声を表す細かい単位（例えば音素）を単語へと変換するためのレキシコン、および、単語の並びを制約するための言語モデルを準備する。続いて、これらのモデルのそれぞれをＷＦＳＴへと変換する。続いて、ＷＦＳＴで表されたこれらのモデルを統合する。なお、これらのモデルを１つに統合してもよいし、一部を統合せず、音声認識時に動的に統合してもよい。
【００１３】
ここで、音響モデルは、入力された音声信号が、特定の音素またはその一部にどれだけ類似しているかを表すスコア（音響スコア、出力確率）を算出するためのモデルである。文字認識またはジェスチャの認識をする場合も同様に、このようなモデルを用いて類似度を表すスコアを算出して、パターン認識をする。本実施形態では、音声認識の場合も含めて、このようなモデルにより算出される値、すなわち、入力された信号が出力される記号等にどれだけ類似しているかを表す値を、信号スコアと呼ぶ。
【００１４】
（ＨＭＭ、特徴量、スコア関数）
音声認識をする場合、音響モデルとして隠れマルコフモデル（ＨＭＭ）が用いられる場合が多い。ＨＭＭをＷＦＳＴに変換する方法は、大きく２つ存在する。第１の方法は、ＷＦＳＴの遷移の中にＨＭＭが含まれているとして取り扱う方法である。第２の方法は、信号スコアを算出するためアルゴリズム（関数、プログラム、テーブルまたは行列等を含む）、データ（パラメータ等を含む）、または、アルゴリズムおよびデータの両方を特定するためのスコア識別子を、遷移の入力記号に割り当てる方法である。
【００１５】
本実施形態においては、第２の方法で変換されたＷＦＳＴを用いて探索する場合について説明するが、第１の方法で変換されたＷＦＳＴを用いることも可能である。
【００１６】
音響モデルから信号スコアを算出するためには、スコア識別子だけでなく、入力された信号列または入力された信号の特徴量も必要である。特徴量は、複数の値から構成される場合もある。この場合、複数の特徴量の組は、特徴ベクトルと呼ばれる。本実施形態では、複数の値から構成される場合も含めて特徴量と呼ぶ。
【００１７】
本実施形態においては、信号スコアを算出するためのアルゴリズムまたはデータとしてスコア関数を用いる。スコア関数は、信号または信号の特徴量、および、スコア識別子を引数にとって信号スコアを出力する関数である。音声認識をする場合には、このようなスコア関数は、例えば音響スコア関数と呼ばれる。また、この音響スコア関数を特定するスコア識別子は、音響スコア関数識別子と呼ばれる。また、音響スコア関数識別子は、確率分布関数識別子と呼ばれる場合もある。
【００１８】
スコア関数が信号スコアを算出する方法は、どのような方法であってもよい。例えば、音声認識をする場合、信号スコアを算出する方法は、適用するＨＭＭの種類によって変わる。離散ＨＭＭであれば、スコア関数は、特徴量に対応する符号ベクトルとスコア識別子とに基づき、表または行列の形で記録されている信号スコアを取得する。また、連続ＨＭＭであれば、スコア関数は、スコア識別子から得られるガウス分布を表現するための複数のパラメータと、特徴量とに基づき、信号スコアを算出する。また、スコア関数は、ニューラルネットワークを用いるなど、ほかの方法を用いて信号スコアを算出してもよい。
【００１９】
なお、ここでは、信号スコアを算出するためのモデルとして、ＨＭＭを挙げて説明しているが、スコア識別子が状態または遷移に割り当てられている有向グラフであれば、ＨＭＭに限らず他のモデルであってもよい。例えば、ＨＭＭの代わりにテンプレートマッチングを用いることとし、テンプレートを有向グラフの形式で表現し、入力された特徴量とテンプレートとの距離を計算する関数をスコア関数としてもよい。
【００２０】
（探索）
ＷＦＳＴを探索する処理とは、入力された信号列または信号の特徴値列に応じた信号スコアおよび重みを累積した値が、最良となる状態と遷移との系列（経路）を算出する処理である。この累積した値を、累積スコアと呼ぶ。ＷＦＳＴに言語モデルも統合されている場合には、言語モデルから得られるスコアも累積スコアに含まれる。
【００２１】
累積スコアが最良となる経路は、一般に、ビタビアルゴリズムを用いて見つけ出される。また、最良の経路のみならず、最良からＮ番目までに良い経路を見つけ出す場合もある。
【００２２】
仮に、累積スコアを距離と考え、小さいほうが良いとする。この場合、累積スコアが最良となる経路を見つけ出す処理は、音声信号が入力される毎に、状態と遷移とが追加される非循環有向グラフ（directed  acyclic  graph）の最短経路を探索する処理と同様である。
【００２３】
（トークンパッシング）
ＨＭＭを変換したＷＦＳＴの経路を探索する処理では、トークンパッシングと呼ばれる技術を用いる場合が多い。この技術ではトークンと呼ばれるオブジェクトが用いられる。トークンには、探索中の経路の先頭の状態が割り当てられる。ＷＦＳＴを探索する処理は、複数の経路を並行して探索するので、同時に複数のトークンが管理される。また、トークンは、経路の累積スコアを保持する。
【００２４】
トークンは、信号または特徴量が入力される毎に移動される。すなわち、トークンは、信号または特徴量が入力される毎に、割り当てられる状態が、ＷＦＳＴの遷移に従って変更される。１つの状態から複数の出て行く遷移が存在する場合には、その１つの状態が割り当てられたトークンは、信号または特徴量が入力されると、出て行く遷移の数に複製される。また、１つの状態に複数のトークンが到達した場合には、原則的には、最良の累積スコアを保持する１つのトークンが残存し、残りは破棄される。
【００２５】
（ラティス）
本実施形態では、ＷＦＳＴの探索中にラティスを生成する。本実施形態において、ラティスは、ノードを有するグラフ、または、ノードおよびアークを有する非循環有向グラフである。なお、探索対象となる有向グラフ（例えばＷＦＳＴ）の状態および遷移と区別するために、ノードおよびアークと表現している。
【００２６】
また、ラティスのノードまたはアークには、ラベルが割り当てられていてもよい。また、ラティスのノードまたはアークには、スコアが割り当てられていてもよい。
【００２７】
＜第１実施形態＞
（全体構成）
図１は、第１実施形態に係るパターン認識装置１０の構成を示す図である。以下、第１実施形態に係るパターン認識装置１０を説明する。
【００２８】
パターン認識装置１０は、入力された信号のパターンを認識し、認識結果を出力する。パターン認識装置１０に入力される信号は、パターンを表す信号であればどのような信号であってもよい。入力される信号は、一例として、音声信号、筆跡を表す信号、文字を表す画像信号または手話等のジェスチャを表す動画像信号等である。
【００２９】
パターン認識装置１０は、特徴抽出部１２と、デコーダ２０と、記憶部２２とを備える。
【００３０】
特徴抽出部１２は、パターンを表す信号を入力して、一定時間毎に、信号の特徴量を取得する。そして、特徴抽出部１２は、取得した信号の特徴量をデコーダ２０に渡す。
【００３１】
特徴量は、デコーダ２０が、その信号の区間毎の特徴を表す情報であり、信号スコアを算出するために用いられる。音声信号を入力する場合、特徴抽出部１２は、一例として、１０ミリ秒単位（フレーム）毎に、特徴量を取得する。
【００３２】
なお、特徴量を算出するために用いる信号の時間長と、特徴量を出力する期間は一致していなくてもよい。また、デコーダ２０が信号そのものを用いて信号スコアを算出する場合には、特徴抽出部１２は、一定時間毎に分割した信号をデコーダ２０に渡してもよい。
【００３３】
デコーダ２０は、特徴抽出部１２から信号または信号の特徴量が入力される毎に、予め作成されたＷＦＳＴを探索する。デコーダ２０は、探索中に、入力された信号列または信号の特徴量列に応じたラティスを生成する。そして、デコーダ２０は、信号の入力が終了した後、探索中に生成したラティスおよびＷＦＳＴから、累積スコアが最良となる経路を検出し、その経路上の出力記号を接続した出力記号列を、認識結果として出力する。
【００３４】
デコーダ２０は、出力記号列として、例えば、単語列を出力してもよいし、音素列を出力してもよいし、音素よりさらに細かい単位の記号列を出力してもよい。また、デコーダ２０は、これらの組み合わせの記号列を出力してもよい。
【００３５】
なお、第１実施形態においては、デコーダ２０は、有向グラフの探索中にアークを含まないラティスを生成する。
【００３６】
記憶部２２は、予め作成されたＷＦＳＴを記憶している。デコーダ２０は、記憶部２２に予め記憶されているＷＦＳＴを常時参照して探索することができる。
【００３７】
記憶部２２は、信号スコアを算出するために参照されるアルゴリズムまたはデータ、或いは、アルゴリズムおよびデータの両方を記憶している。本実施形態において、記憶部２２は、スコア識別子と信号または特徴量とを引数として信号スコアを算出するためのスコア関数を記憶している。また、記憶部２２は、データとして、ＷＦＳＴの遷移に重みとして割り当てられなかったＨＭＭの状態遷移スコアを、スコア関数とともに記憶しておいてもよい。なお、記憶部２２は、ＷＦＳＴに記憶されていない他の情報を、データとして記憶していてもよい。
【００３８】
ここで、デコーダ２０は、トークンパッシングの手法で、ＷＦＳＴを探索する。そして、ＷＦＳＴの探索中において、デコーダ２０は、ＷＦＳＴから取得したスコア識別子と信号または信号の特徴量とを引数として、スコア関数を呼び出して、信号スコアを算出することができる。また、デコーダ２０は、ＷＦＳＴの重みを記憶部２２から取得することができる。さらに、記憶部２２にスコア関数とともに記憶されているＨＭＭの状態遷移スコアがあれば、これも取得することができる。これにより、デコーダ２０は、探索中の経路上の遷移の重みと信号スコアとを累積した累積スコアを算出することができる。ＨＭＭの状態遷移スコアがあれば、それについても累積スコアに累積することができる。
【００３９】
また、記憶部２２に記憶されたＷＦＳＴは、入力記号に信号スコアを算出するためのスコア識別子が割り当てられている。さらに、このＷＦＳＴは、１つの状態に入ってくる遷移に割り当てられた入力記号が１種類となるように予め変換がされている。
【００４０】
（構成）
図２は、第１実施形態に係るデコーダ２０のブロック図である。デコーダ２０は、トークン記憶部３１と、トークン操作部３２と、スコア算出部３３と、重複除去部３４と、枝刈部３５と、ラティス記憶部３６と、ノード追加部３７と、接続検出部３８とを有する。
【００４１】
トークン記憶部３１は、１または複数のトークンを記憶する。トークン記憶部３１は、信号または信号の特徴量が入力される前においては、初期状態が割り当てられたトークンを記憶する。
【００４２】
複数のトークンのそれぞれは、割り当てられた状態を示す情報を保持する。なお、複数のトークンのそれぞれは、割り当てられた状態に関連付けてトークン記憶部３１に記憶されていれば、割り当てられた状態とどのように関連付けられて記憶されていてもよい。
【００４３】
また、複数のトークンのそれぞれは、そのトークンが表す経路上のそれぞれの入力記号（スコア識別子）から算出された信号スコアと、経路上の遷移に割り当てられた重み（状態遷移スコア等）とを累積した累積スコアを保持する。なお、本実施形態では、トークンは入力記号を保持していない。後述するように、割り当てられた状態に入ってくる遷移を参照することで、入力記号を取得できるためである。
【００４４】
また、複数のトークンのそれぞれは、さらにコンテキスト情報を保持してもよい。コンテキスト情報には、一例として、２つのＷＦＳＴを動的に合成しながら探索する場合において、２つ目のＷＦＳＴの経路の先頭の状態を含む。また、コンテキスト情報は、一例として、通過した遷移に割り当てられた出力記号列が特徴量の一部として用いられる場合には、この出力記号列を含んでいてもよい。
【００４５】
ＷＦＳＴのそれぞれの状態は、原則的に１つのトークンに割り当てられる。しかし、コンテキスト情報を含む場合には、割り当てられた状態とコンテキスト情報との２つの要素の組が１つのトークンに割り当てられる。従って、この場合には、ＷＦＳＴのそれぞれの状態は、複数のトークンに割り当てられる可能性がある。
【００４６】
トークン操作部３２は、信号または特徴量を入力する毎に、トークン記憶部３１に記憶されている複数のトークンのそれぞれを、ＷＦＳＴに従って、空ではない入力記号が割り当てられている遷移を通過するまで移動させる。ここで、トークンを移動させるとは、そのトークンに割り当てられている状態を、次の状態に変更することをいう。なお、状態に入力記号が割り当てられている有向グラフを探索する場合には、トークン操作部３２は、空ではない入力記号が割り当てられている状態に達するまでトークンを移動させる。
【００４７】
この場合において、トークン操作部３２は、トークンが割り当てられている状態から出て行く遷移が複数存在する場合には、複数の遷移のそれぞれに対応させてトークンを作成し、作成したそれぞれのトークンを対応する遷移に従って次の状態に移動させる。
【００４８】
スコア算出部３３は、トークン操作部３２がトークンを入力記号が空でない遷移を通過するまで移動させる毎に、複数のトークンのそれぞれに対して、信号スコア、および、累積スコアを算出する。より詳しくは、スコア算出部３３は、複数のトークンのそれぞれに対して、直前の移動により通過した遷移に割り当てられた入力記号（スコア識別子）に対応するスコア関数を呼び出して、入力記号に基づく信号スコアを算出する。また、スコア算出部３３は、複数のトークンのそれぞれに対して、そのトークンが表す経路上の重みおよび信号スコアを累積した累積スコアを算出する。そして、スコア算出部３３は、算出した信号スコア、および、累積スコアを、トークン記憶部３１に記憶された対応するトークンに保持させる。なお、重みの付いていない有向グラフを探索する場合には、スコア算出部３３は、重みに関する処理を実行せずに、重みを０として累積スコアを算出する。
【００４９】
重複除去部３４は、トークン操作部３２がトークンを入力記号が空でない遷移を通過するまで移動させる毎に、トークンの重複を除去する。より詳しくは、重複除去部３４は、割り当てられた状態が同一である２以上のトークンの重複を除去する。重複除去部３４は、一例として、割り当てられた状態が同一である２以上のトークンのうち、累積スコアが良い１つのトークンを残存させ、残りのトークンを廃棄する。
【００５０】
なお、トークンがコンテキスト情報を保持する場合には、重複除去部３４は、割り当てられた状態が同一であり、且つ、コンテキスト情報が同一である２以上のトークンの重複を除去する。これにより、例えば、２つのＷＦＳＴを動的に合成しながら探索する場合において、重複除去部３４は、一方のＷＦＳＴに割り当てられた状態が同一であるが、他方のＷＦＳＴに割り当てられた状態が異なるトークンを残存させることができる。
【００５１】
枝刈部３５は、トークン操作部３２がトークンを入力記号が空でない遷移を通過するまで移動させる毎に、トークン記憶部３１に記憶されている複数のトークンのうち、累積スコアが一定以上悪いトークンを除去する。枝刈部３５は、一例として、複数のトークンのうちの最良の累積スコアから、一定値以上悪い累積スコアのトークンを除去する。
【００５２】
ラティス記憶部３６は、ラティスを記憶する。ラティス記憶部３６は、信号または信号の特徴量が入力される前においては、空のラティスを記憶する。そして、ラティス記憶部３６は、特徴量の入力が継続している期間においては、途中段階のラティスを記憶する。
【００５３】
ノード追加部３７は、トークン操作部３２がトークンを入力記号が空でない遷移を通過するまで移動させる毎に、トークン記憶部３１に記憶された複数のトークンのそれぞれに割り当てられた状態に対応するノードを、ラティス記憶部３６に記憶されたラティスに追加する。この場合において、ノード追加部３７は、ラティスへのトークンの追加回数（すなわち、信号または信号の特徴量が入力の入力回数）に対応させてノードを追加する。
【００５４】
また、ノード追加部３７は、追加するノードのそれぞれに対して、（１）元となるトークンの累積スコア、（２）元となるトークンの信号スコアおよび、（３）元となるトークンが表す経路の先頭の状態を関連付ける。ノード追加部３７は、それぞれのノードと、これらの情報とをどのような方法で関連付けてもよい。例えば、ノード追加部３７は、これらの情報をノードに保持させてもよいし、別個のテーブル等に対応付け保存させてもよい。
【００５５】
接続検出部３８は、ノードの追加が完了した後に（例えば、信号または信号の特徴量の入力が終了した後、または、一定数の信号または特徴量の入力が終了した後に）、ラティス記憶部３６に記憶されたラティスおよびＷＦＳＴを参照して、初期状態から終了状態まで接続された経路における、累積スコアが最良となる経路を検出する。そして、接続検出部３８は、最良の経路上における出力記号を連結した記号列を出力する。
【００５６】
より詳しくは、接続検出部３８は、ｉ回目（ｉは１以上の整数）にラティスに追加したノードに接続された、ｉ＋１回目にラティスに追加したノードを、ＷＦＳＴを参照して検出する。すなわち、接続検出部３８は、ＷＦＳＴを参照して、ｉ回目にラティスに追加したノードに対応するＷＦＳＴの状態から、ｉ＋１回目にラティスに追加した何れかのノードに対応するＷＦＳＴの状態へと向かう遷移が存在するか否かを判断する。ＷＦＳＴに、このような遷移が存在する場合には、接続検出部３８は、ｉ回目にラティスに追加したノードに接続された、ｉ＋１回目にラティスに追加したノードが存在すると検出する。
【００５７】
さらに、ｉ回目に追加したノードを第１のノードとし、第１のノードに接続されたｉ＋１回目に追加したノードを第２のノードとする。この場合、接続検出部３８は、第１のノードに関連付けられた累積スコアと第２のノードに関連付けられた信号スコアと第１のノードと第２のノードとを接続する経路上の重みとを加算した値が、第２のノードに関連付けられた累積スコアに一致する経路を検出する。なお、重みの付いていない有向グラフを探索する場合には、接続検出部３８は、重みを０として経路を算出する。
【００５８】
さらに、接続検出部３８は、最後に追加したノードのうち、累積スコアが最良のノードを検出する。このノードは、最良経路の終端のノードに対応する。これを第２のノードとして前記接続関係の検出処理を行い、最良経路上の第１のノードを検出する。次に、この第１のノードを第２のノードとして同様の処理を、１回目にラティスに追加したノードまで、順次に繰り下がりながら実行する。そして、接続検出部３８は、初期状態に対応するノードから終了状態に対応するノードまでの最良の経路を検出し、検出した最良の経路上における出力記号を連結して出力する。なお、検出した最良の経路上における入力記号を連結して出力するよう構成してもよい。また、その両方を出力するよう構成してもよい。
【００５９】
（処理フロー）
図３は、第１実施形態に係るデコーダ２０の処理順序を示すフローチャートである。まず、信号の入力が開始されると、特徴抽出部１２が信号から特徴量を抽出してデコーダ２０に供給する。そして、デコーダ２０は、ステップＳ１０１から処理を開始する。
【００６０】
まず、ステップＳ１０１において、デコーダ２０は、特徴抽出部１２から特徴量を取得する。続いて、ステップＳ１０２において、デコーダ２０は、特徴量の取得に成功したか否かを判断する。デコーダ２０は、特徴量の取得に成功した場合には（ステップＳ１０２のＹｅｓ）、処理を、ステップＳ１０３からステップＳ１０６までのループ処理に進める。なお、デコーダ２０は、ステップＳ１０１の前に、ステップＳ１０２を実行してもよい。この場合、ステップＳ１０２において、デコーダ２０は、次に特徴量を取得できるか否かを判断する。
【００６１】
ステップＳ１０３からステップＳ１０６のループ処理において、デコーダ２０は、全てのトークンのそれぞれに対してステップＳ１０４およびステップＳ１０５の処理を実行する。ステップＳ１０４において、デコーダ２０は、対応するトークンに割り当てられた状態を、ＷＦＳＴに示された遷移に従って次の状態に移動させる。この場合において、デコーダ２０は、入力記号が空でない遷移を通過するまでトークンを移動させる。続いて、ステップＳ１０５において、デコーダ２０は、トークンが通過した遷移に割り当てられた重みを取得して、取得した重みをトークンの累積スコアに加算する。
【００６２】
ステップＳ１０３からステップＳ１０６のループ処理が完了すると、デコーダ２０は、処理をステップＳ１０７に進める。ステップＳ１０７において、デコーダ２０は、割り当てられた状態が同一である２以上のトークンが存在するかを検出する。そして、デコーダ２０は、このような２以上のトークンが存在した場合には、最も累積スコアが良い１つのトークンを残して、残りのトークンを破棄する。
【００６３】
続いて、デコーダ２０は、ステップＳ１０８からステップＳ１１０までのループ処理に進める。ステップＳ１０８からステップＳ１１０のループ処理において、デコーダ２０は、全てのトークンのそれぞれに対してステップＳ１０９の処理を実行する。ステップＳ１０９において、デコーダ２０は、対応するトークンの信号スコアを算出する。そして、デコーダ２０は、対応するトークンに保持されている累積スコアに算出した信号スコアを加算することにより、累積スコアを更新する。
【００６４】
ステップＳ１０８からステップＳ１１０のループ処理が完了すると、デコーダ２０は、処理をステップＳ１１１に進める。ステップＳ１１１において、デコーダ２０は、累積スコアが一定以上悪いトークンを除去する。
【００６５】
ステップＳ１１１が完了すると、デコーダ２０は、処理をステップＳ１１２に進める。ステップＳ１１２において、デコーダ２０は、複数のトークンのそれぞれに割り当てられた状態に対応するノードを、ラティスに追加する。この場合において、デコーダ２０は、追加したそれぞれのノードと、トークンの信号スコアおよび累積スコア、並びに、トークンが表す経路の先頭の状態とを関連付ける。
【００６６】
ステップＳ１１２が完了すると、デコーダ２０は、処理をステップＳ１０１に戻す。そして、デコーダ２０は、特徴量が入力される毎に、ステップＳ１０３からステップＳ１１２までの処理を繰り返して実行する。
【００６７】
一方、特徴量の取得に成功しなかった場合、すなわち、信号の入力が終了した場合には（ステップＳ１０２のＮｏ）、デコーダ２０は、処理をステップＳ１１３に進める。
【００６８】
ステップＳ１１３において、デコーダ２０は、ラティス記憶部３６に記憶されたラティスおよびＷＦＳＴを参照して、初期状態から終了状態まで接続された経路における、累積スコアが最良となる経路を検出する。そして、ステップＳ１１３を終えると、続くステップＳ１１４において、デコーダ２０は、最良の経路上における出力記号を連結した記号列を認識結果として出力する。デコーダ２０は、ステップＳ１１４の処理を完了すると、本フローを終了する。
【００６９】
（擬似コード）
図４は、第１実施形態に係るデコーダ２０の処理内容を表す擬似コードを示す図である。つぎに、図４に示すデコーダ２０により実行される擬似コードを参照して、デコーダ２０の詳細な処理例を説明する。
【００７０】
ｔは、トークンを表す。Ｔは、トークンの集合を表す。Ｌは、ラティスを表す。ｆは、フレーム番号を表す。Ｌ［ｆ］は、フレーム番号ｆのフレームで追加されたノードの集合を表す。
【００７１】
ｓｔａｔｅ（ｔ）は、トークンｔに割り当てられている状態を表す。ｔａｃｃ＿ｓｃｏｒｅ（ｔ）は、トークンｔが保持している累積スコアを表す。ｔａｍ＿ｓｃｏｒｅ（ｔ）は、トークンｔが保持している信号スコアを表す。トークンｔに割り当てられている状態、累積スコアおよび信号スコアの３つの要素は、（状態，累積スコア，信号スコア）と表す。
【００７２】
なお、本擬似コードにおいては、スコアは大きい方が良いとして処理を実行する。もっとも、擬似コード中の関数ｍａｘを関数ｍｉｎに変更し、スコアを比較する場合に大小関係を反転する等の変形をすれば、スコアは小さい方が良いとして処理を実行することができる。
【００７３】
ｗｂｅａｍは、枝刈りのための基準となるスコア差を表す。
【００７４】
εは、記号列が空であることを表す。入力記号がεである場合、入力記号にスコア識別子が割り当てられていないことを表す。同様に、出力記号がεである場合、単語等の認識結果として出力される情報が出力記号に割り当てられていないことを表す。
【００７５】
入力記号がεである遷移を、本実施形態においてはε遷移または空遷移と呼ぶ。ｅは、遷移を表す。ｎ（ｅ）は、遷移ｅの次状態を表す。ｉｎｐｕｔ（ｅ）は、遷移ｅの入力記号を表す。ｏｕｔｐｕｔ（ｅ）は、遷移ｅの出力記号を表す。ｗ（ｅ）は、遷移ｅの重みを表す。
【００７６】
通常、ＷＦＳＴには初期重みがあるが、本実施形態では、ＷＦＳＴの初期重みは０である。初期状態１つに対して、遷移と状態を１つずつ追加し、初期重みを追加した遷移に割り当てるように、ＷＦＳＴを予め変形されていればよいためである。もっとも、初期重みを考慮した擬似コードとするには、１行目で作成するトークンの累積重みに、初期重みを追加すればよい。
【００７７】
以下、各行で行われる処理について説明する。デコーダ２０は、図４に示される擬似コードの各行に示された処理を、１行目から順次に実行する。
【００７８】
１行目では、デコーダ２０は、トークンの集合を初期化する。トークンの集合は、一例として、配列、単方向リストまたは二分木等で実現することができる。また、デコーダ２０は、９行目で重複要素が存在しなくなるので、１行目では、重複要素の削除を行ってもよいし、行わなくてもよい。また、デコーダ２０は、フレーム番号ｆを０に初期化する。
【００７９】
２行目では、デコーダ２０は、信号の入力が終了したか否かを判定する。終了していれば、デコーダ２０は、結果を出力するために１６行目に処理を移す。まだ、処理すべき信号がある場合は、デコーダ２０は、３行目から１５行目の処理を行う。
【００８０】
３行目では、デコーダ２０は、入力された信号の特徴量を特徴抽出部１２から受け取る。デコーダ２０は、受け取った特徴量をｖに代入する。なお、疑似コードでは、特徴量を、ｆｅａｔｕｒｅ  ｖｅｃｔｏｒと記載している。
【００８１】
４行目では、デコーダ２０は、Ｔを空集合で初期化する。
【００８２】
５行目は、Ｌ［ｆ］に含まれるそれぞれのトークンについて、６行目から８行目の処理を行うことを示す。
【００８３】
６行目は、トークンｔが割り当てられている状態から出ていく遷移について、７行目から８行目の処理を行うことを示す。
【００８４】
関数ｏｕｔｇｏｉｎｇは、ＷＦＳＴにε遷移が含まれていない場合、ｓｔａｔｅ（ｔ）から出ていく遷移の集合を返す。
【００８５】
関数ｏｕｔｇｏｉｎｇは、ＷＦＳＴにε遷移が含まれている場合、ｓｔａｔｅ（ｔ）から出ていくε遷移以外の遷移と、ｓｔａｔｅ（ｔ）からε遷移を辿ることで到達できる入力記号がεでない遷移とを含む集合Ｅｎを返す。ただし、関数ｏｕｔｇｏｉｎｇは、その遷移に至る経路が複数ある場合には、経路上の重みを累積した値が最も大きい経路のみを選択する。重みを累積した値が最も大きい経路の探索には例えばＤｉｊｋｓｔｒａのアルゴリズムやＢｅｌｌｍａｎ‐Ｆｏｒｄのアルゴリズムを用いればよい。
【００８６】
また、関数ｏｕｔｇｏｉｎｇは、集合Ｅｎに含まれるそれぞれの遷移ｅｎの重みを、ｓｔａｔｅ（ｔ）から遷移ｅｎまでに至る経路（遷移ｅｎを含む）上の重みを累積した値に変形する。また、関数ｏｕｔｇｏｉｎｇは、集合Ｅｎに含まれるそれぞれの遷移ｅｎの出力記号を、ｓｔａｔｅ（ｔ）から遷移ｅｎまでに至る経路（遷移ｅｎを含む）上の出力記号を繋ぎ合わせた記号列に変形する。
【００８７】
なお、遷移ｅｎに至る経路上の出力記号列が複数ある場合で、全ての出力記号列を残したい場合は、関数ｏｕｔｇｏｉｎｇは、次のようにすればよい。ある経路の出力記号列をｘｎとする。ｘｎと同じ出力記号列が割り当てられている経路上の重みのうち最も大きい重みと、遷移ｅｎの重みとを加算した値をｗｎとする。関数ｏｕｔｇｏｉｎｇは、処理結果として返す集合に、出力記号列がｘｎ、重みがｗｎ、それ以外の要素がｅｎと同じである遷移を追加する。
【００８８】
７行目では、デコーダ２０は、新しいトークンｔｎｅｗを作成する。トークンｔｎｅｗに割り当てられる状態は、ｅの次状態である。トークンｔｎｅｗの累積スコアは、ｔの累積スコアにｅの重みを加算した値である。トークンｔｎｅｗの信号スコアは、０である。
【００８９】
８行目では、デコーダ２０は、７行目で作成した新しいトークンｔｎｅｗをトークンの集合Ｔに追加する。
【００９０】
９行目では、デコーダ２０は、同じ状態が割り当てられているトークンが複数ある場合に、累積スコアが良い１つのトークンを残存させ、他を除去する。本例の場合には、累積スコアが最も良い１つのトークンを残存させる。９行目が完了すると、１つの状態が割り当てられているトークンは、最大でも１つとなる。
【００９１】
１０行目は、Ｔに含まれるそれぞれのトークンｔについて、１１行目および１２行目を処理することを示す。
【００９２】
１１行目では、デコーダ２０は、スコア関数ａｍ＿ｓｃｏｒｅにより信号スコアを算出する。スコア関数ａｍ＿ｓｃｏｒｅは、第１引数に特徴量、第２引数にスコア識別子をとり、信号スコアを返す。デコーダ２０は、スコア関数ａｍ＿ｓｃｏｒｅにより算出した値を、ｔの信号スコアｔａｍ＿ｓｃｏｒｅ（ｔ）に代入する。
【００９３】
関数ｉｎｃｏｍｉｎｇは、ｓｔａｔｅ（ｔ）に入ってくる遷移の集合を返す。なお、関数ｉｎｃｏｍｉｎｇで取得できる遷移は複数ある可能性があるが、本実施形態で使用しているＷＦＳＴでは、それらの遷移の入力記号は全て同じであるので、スコア関数には、１つの入力記号（スコア識別子）を渡す。なお、デコーダ２０は、入ってくる遷移の入力記号を事前にそれぞれの状態に対応付けておけば、その対応付けを参照することでｉｎｐｕｔ（ｉｎｃｏｍｉｎｇ（状態））の処理を行わずに同じ結果を得ることができる。
【００９４】
１２行目では、デコーダ２０は、ｔの累積スコアｔａｃｃ＿ｓｃｏｒｅ（ｔ）に、１１行目で算出した信号スコアｔａｍ＿ｓｃｏｒｅ（ｔ）を加算する。
【００９５】
１３行目および１５行目は、トークンの枝刈りと、枝刈り後に残ったトークンをノードとしてラティスに追加することを示す。
【００９６】
１３行目では、デコーダ２０は、Ｔに含まれるトークンの累積スコアのうち、最も良い累積スコアをｗｍａｘに代入する。
【００９７】
１４行目では、デコーダ２０は、フレーム番号ｆを１増加させる。
【００９８】
１５行目では、デコーダ２０は、ｗｍａｘからｗｂｅａｍを引いた値以下の累積スコアを保持しているトークンをＴから除去し、残ったトークンをノードとしてＬ［ｆ］に追加する。ｗｂｅａｍには、事前に与えられる固定値を用いてもよいし、トークンの数が一定値以内に収まるように算出される値を用いてもよい。なお、トークンの数で枝刈りする方法は、ヒストグラム枝刈りと呼ばれる。本実施形態では、トークンとノードは同じオブジェクトとして取り扱っているが、先に記載したトークンに含まれる累積スコア、信号スコア、割り当てられている状態の３つの情報をノードが保持することができれば、トークンとノードとを同じオブジェクトとして扱わなくてもよい。
【００９９】
１６行目から２５行目は、１位結果をラティスから取得することを示す。
【０１００】
１６行目では、デコーダ２０は、入力記号列を保存するための変数ｘｑを空列で初期化する。
【０１０１】
１７行目では、デコーダ２０は、Ｌ［ｆ］に含まれるそれぞれノードｔに対して次の処理を行い、その結果をΘに代入する。
【０１０２】
まず、デコーダ２０は、ｔが割り当てられている状態を引数として、関数ｅｐｓを呼び出す。関数ｅｐｓは、ｔが割り当てられている状態からε遷移のみを辿ることで到達できる状態ｑと、そこに至る経路のうち最も重みの大きい経路の重みｗと、その経路の出力記号列ｏを見つけ、それらを３つの要素の組（ｑ，ｗ，ｏ）として返す。関数ｅｐｓが返す３つの要素の組の中には、ｔが割り当てられている状態を含む３つの要素の組も含まれる。ｑがｔが割り当てられている状態である場合には、ｗは０、ｏはεである。デコーダ２０は、関数ｅｐｓから結果が返されると、ｑが終了状態である場合にのみ、３つの要素の組（ｔ，ｗ＋ρ（ｑ），ｏ）をΘに追加する。全てのノードｔについて処理を終えると、Θには、終了状態に到達するノードが３つの要素の組の一部として記録される。なお、関数ｅｐｓ内で終了状態か否かを判定し、関数ｅｐｓが返す状態ｑは全て終了状態となるよう構成してもよい。
【０１０３】
１８行目では、デコーダ２０は、Θが空集合か否かを判断する。Θが空集合である場合、終了状態に至る経路が無い。従って、この場合、１９行目で、デコーダ２０は、認識結果として空列を返し、本コードの処理を終了する。
【０１０４】
Θが空集合ではない場合、デコーダ２０は、処理を２０行目へ進める。２０行目では、デコーダ２０は、Θに記録されているノードのうち、ノードが割り当てられている状態から終了状態までの最良経路の重みと、ノードの累積スコアとを加算した値が最も大きいノードをｔｂｅｓｔに代入する。また、デコーダ２０は、そのノードと同じ３つの要素の組に記録されている出力記号列、つまり、ノードが割り当てられている状態から終了状態までの最良経路の出力記号列を連結した出力記号列をｘｗに代入する。
【０１０５】
２１行目は、ｆが０より大きい間は２２行目から２４行目までを繰り返して処理することを示す。
【０１０６】
２２行目では、デコーダ２０は、ｆの値を１減らす。
【０１０７】
２３行目では、デコーダ２０は、Ｌ［ｆ］に含まれるノードをｔとする場合、次の２つの条件を満たすノードｔと遷移ｅとを、ｔｂｅｓｔとｅｂｅｓｔとに代入する。
【０１０８】
１つ目の条件は、ｔが割り当てられている状態から関数ｏｕｔｇｏｉｎｇを使って得られる遷移の次状態が、ｔｂｅｓｔが割り当てられている状態に一致する。
【０１０９】
２つ目の条件は、関数ｏｕｔｇｏｉｎｇを使って得られる遷移の重みとｔの累積スコアとｔｂｅｓｔの信号スコアとを加算した値が、ｔｂｅｓｔの累積スコアと等しい。言い換えると、デコーダ２０は、７行目と１２行目の計算を再度実行して、ｔｂｅｓｔを再現できるｔとｅとを探す。デコーダ２０は、従来手法のようにバックポインタをそれぞれのノードが保持していないので、このような再計算処理が必要になる。以上の２つの条件を満たすノードと遷移とが複数存在する場合には、デコーダ２０は、複数の何れを選択してもよい。何れを選択しても、累積スコアが最も良くなるためである。
【０１１０】
２４行目では、デコーダ２０は、２３行目で得られたｅｂｅｓｔの入力記号をｘｑの前方に連結する。また、デコーダ２０は、２３行目で得られたｅｂｅｓｔの出力記号をｘｗの前方に連結する。なお、２４行目において、ドットを表す記号は、記号を前後に連結することを表す。
【０１１１】
そして、デコーダ２０は、ｆ＝０、つまり、最初のノードまで処理が終了した場合、処理を２５行目に進める。２５行目では、デコーダ２０は、得られた入力記号列ｘｑと出力記号列ｘｗとを音声認識の結果として返す。なお、入力記号がＨＭＭの状態であれば、ｘｑはＨＭＭの状態列となる。
【０１１２】
以上の擬似コードでは、フレーム番号ｆによってノードの集合をＬ［ｆ］で特定した。しかし、フレーム番号を用いず、ノードの集合を要素とする単方向リストまたは双方向リスト等で保持してもよい。２１行目から２４行目の処理は、ｆを１減らしながら処理しているだけであるので、デコーダ２０は、単方向リストまたは双方向リスト等を用いた場合、リストを１つ１つたどりながら処理すれば同様の処理ができる。
【０１１３】
（動作例）
図５は、第１実施形態に係るデコーダ２０の処理の一例を示す遷移図である。デコーダ２０が図４の擬似コードに従って動作した場合に、ラティスをどのように作成するのか、ラティスを用いてどのように最良な経路を見つけて、結果を出力するのかについて、具体的に説明する。
【０１１４】
図５の左側の破線で囲まれた部分は、デコーダ２０が探索するＷＦＳＴを表した図である。丸が状態を表し、丸の中の数字が状態番号を表す。太線の丸は、初期状態を表す。二重線の丸は、終了状態を表す。矢印は、遷移を表す。矢印の付近に記載されている文字列は、：と／とで区切られている。：の左側の文字列は入力記号を表し、：と／との間の文字列は出力記号を表し、／の右側の文字列は重みを表す。
【０１１５】
図５の右側の破線に囲まれていない部分は、特徴量を３回入力した結果として得られるラティスを表した図である。角が丸い長方形は、ノードを表す。それぞれのノードの左上には、ｎ１２等のラベルを記載している。ノードは、追加された順で左から右に描かれている。割り当てられている状態は、ノードの上下方向の位置で表されており、一番下から上に向けて順番に状態１から状態４までが対応している。
【０１１６】
それぞれのノードの中に記載されているｓｔａｃｃは、累積スコアを表す。それぞれのノードの中に記載されているｓｔａｍは、信号スコアを表す。ノードとしてラティスに追加される前のトークンをｔとすると、ｓｔａｃｃは、ｔａｃｃ＿ｓｃｏｒｅ（ｔ）に対応する。また、ｓｔａｍは、ｔａｍ＿ｓｃｏｒｅ（ｔ）に対応する。また、図５の例では、ｗｂｅａｍ＝５とする。
【０１１７】
図４の疑似コードの１行目では、デコーダ２０は、ノードｎ０１をＬ［０］に追加する。このとき、累積スコアおよび信号スコアは、いずれも０である。３行目では、デコーダ２０は、１回目の特徴量を受け取る。４行目では、デコーダ２０は、空集合をＴに追加する。従って、Ｔ＝｛｝となる。
【０１１８】
５行目から８行目では、デコーダ２０は、１回目に受け取った特徴量に応じて、トークンを移動させる。直前のトークンは、Ｌ［０］にノードとして格納されているので、ノードｎ０１に対応する。従って、５行目から８行目では、トークンは、ｎ０１が割り当てられているＷＦＳＴの状態１から出ていく遷移を通り、状態２と状態３とに移動される。また、累積スコアには通過した遷移の重みが加算される。従って、状態２に割り当てられるトークンの累積スコアは０となる。また、状態３に割り当てられるトークンの累積スコアは−３となる。
【０１１９】
９行目では、同じ状態に複数のトークンが割り当てられていないので、デコーダ２０は、何も実行しない。
【０１２０】
１０行目から１２行目では、デコーダ２０は、信号スコアおよび累積スコアを算出して、トークンに格納する。１回目に受け取った特徴量から算出した信号スコアが、ａｍ＿ｓｃｏｒｅ（ｖ，ｂ２）＝−３、ａｍ＿ｓｃｏｒｅ（ｖ，ｂ３）＝−２であるとする。この場合、状態２に割り当てられているトークンの累積スコアは、−３となる。状態３に割り当てられているトークンの累積スコアは、−５となる。また、状態２に割り当てられているトークンの信号スコアは、−３である。状態３に割り当てられているトークンの信号スコアは、−２である。
【０１２１】
１３行目と１５行目の一部では、デコーダ２０は、トークンの枝刈りをする。ｗｂｅａｍ＝５であるので、現時点では、枝刈りされるトークンは存在しない。
【０１２２】
１５行目では、デコーダ２０は、トークンをノードとしてＬに追加する。従って、Ｌ［１］＝｛（２，−３，−３），（３，−５，−２）｝となる。図５中では、Ｌ［１］に追加されたノードは、ｎ１２およびｎ１３である。
【０１２３】
続いて、３行目に戻り、デコーダ２０は、２回目の特徴量を受け取る。４行目から８行目では、デコーダ２０は、２回目の特徴量に応じて、トークンを移動させる。Ｌ［１］に格納されているノードは、ｎ１２とｎ１３であるので、これらがトークンとみなされる。トークンは、関数ｏｕｔｇｏｉｎｇの処理に従って移動される。これにより、Ｔ＝｛（２，−３，０），（３，−５，０），（４，−４，０），（４，−５，０）｝となる。
【０１２４】
９行目では、デコーダ２０は、同じ状態が割り当てられているトークンが複数ある場合には最も累積スコアが大きいトークン以外を除去する。従って、Ｔ＝｛（２，−３，０），（３，−５，０），（４，−４，０）｝となる。
【０１２５】
１０行目から１２行目では、デコーダ２０は、信号スコアおよび累積スコアを算出して、トークンに格納する。２回目に受け取った特徴量から算出した信号スコアが、ａｍ＿ｓｃｏｒｅ（ｖ，ｂ２）＝−２、ａｍ＿ｓｃｏｒｅ（ｖ，ｂ３）＝−５、ａｍ＿ｓｃｏｒｅ（ｖ，ｂ４）＝−１であるとする。この場合、Ｔ＝｛（２，−５，−２），（３，−１０，−５），（４，−５，−１）｝となる。
【０１２６】
１３行目では、デコーダ２０は、トークンの枝刈りのために最大の累積スコアを算出する。ここでは、最大の累積スコアｗｍａｘが−５であり、ｗｍａｘ−ｗｂｅａｍは−１０となる。従って、トークン（３，−１０，−５）は、１５行目の条件を満たさず枝刈りされる。残存したトークンは、（２，−５，−２）と（４，−５，−１）の２つである。デコーダ２０は、これら２つのトークンをノードとしてＬに追加する。従って、Ｌ［２］＝｛（２，−５，−２），（４，−５，−１）｝となる。図５では、Ｌ［２］に追加されたノードは、ｎ２２およびｎ２４である。
【０１２７】
続いて、３行目に戻り、デコーダ２０は、３回目の特徴量を受け取る。４行目から８行目では、デコーダ２０は、３回目の特徴量に応じて、トークンを移動させる。状態４から入力記号がεの遷移が出ている。しかし、状態５から出ていく遷移が１つもないので、関数ｏｕｔｇｏｉｎｇに状態４を渡したときに得られる遷移は、状態４の自己遷移のみである。従って、移動後のトークンは、Ｔ＝｛（２，−５，０），（４，−６，０），（４，−５，０）｝となる。
【０１２８】
９行目では、状態４にはトークンが２つあるので、デコーダ２０は、累積スコアが良い一方を残す。従って、Ｔ＝｛（２，−５，０），（４，−５，０）｝となる。
【０１２９】
１０行目から１２行目では、信号スコアおよび累積スコアを算出して、トークンに格納する。３回目に受け取った特徴量から算出した信号スコアが、ａｍ＿ｓｃｏｒｅ（ｖ，ｂ２）＝−５、ａｍ＿ｓｃｏｒｅ（ｖ，ｂ４）＝−３であるとする。この場合、Ｔ＝｛（２，−１０，−５），（４，−８，−３）｝となる。
【０１３０】
１３行目と１５行目では、何れのトークンも枝刈りがされない。従って、残存した２つのトークンがノードとしてＬに追加され、Ｌ［３］＝｛（２，−１０，−５），（４，−８，−３）｝となる。図５では、Ｌ［３］に追加されたノードは、ｎ３２とｎ３４である。
【０１３１】
以上の処理により、３回の特徴量の入力が完了したので、デコーダ２０は、次は認識結果を取得する。
【０１３２】
１７行目では、Θ＝｛（（４，−８，−３），−２，ｇｒｅｅｎ）｝となる。状態２は終了状態ではなく、ε遷移のみを通って終了状態に到達することもできない。従って、ノードｎ３２は、Θには含まれない。Θが空でないので、２０行目が処理される。しかし、Θが含んでいる要素は１つのみであるので、ｔｂｅｓｔ＝（４，−８，−３）、ｘｗ＝ｇｒｅｅｎとなる。
【０１３３】
今、ｆ＝３であるので、２２行目では、ｆ＝２となる。２３行目では、Ｌ［２］に含まれるノードからｔｂｅｓｔにつながる遷移を出ていく遷移として持つノードを見つける。該当するのは、ｎ２４と状態４の自己遷移である。ｎ（ｅ）＝状態４＝ｓｔａｔｅ（ｔｂｅｓｔ）であり、ｔａｃｃ＿ｓｃｏｒｅ（ｎ２４）＋ｗ（ｅ）＋ｔａｍ＿ｓｃｏｒｅ（ｔｂｅｓｔ）＝−５＋０−３＝−８＝ｔａｃｃ＿ｓｃｏｒｅ（ｔｂｅｓｔ）である。従って、ｔｂｅｓｔ＝ｎ２４、ｅｂｅｓｔ＝状態４の自己遷移となる。従って、２４行目では、ｘｑ＝ｂ４、ｘｗ＝ｇｒｅｅｎとなる。
【０１３４】
続いて、２２行目に戻り、ｆ＝１となる。２３行目では、ｔｂｅｓｔ＝ｎ１２、ｅｂｅｓｔ＝状態２から状態４への遷移となる。従って、２４行目では、ｘｑ＝ｂ４ｂ４、ｘｗ＝ｇｒｅｅｎとなる。
【０１３５】
続いて、２２行目に戻り、ｆ＝０となる。２３行目では、ｔｂｅｓｔ＝ｎ０１、ｅｂｅｓｔ＝状態１から状態２への遷移となる。従って、２４行目では、ｘｑ＝ｂ２ｂ４ｂ４、ｘｗ＝ｂｌｕｅ  ｇｒｅｅｎとなる。
【０１３６】
そして、２５行目でデコーダ２０は、最終的に得られたｘｑ＝ｂ２ｂ４ｂ４、ｘｗ＝ｂｌｕｅ  ｇｒｅｅｎを認識結果として返す。
【０１３７】
（ハードウェア構成）
図６は、第１実施形態に係るパターン認識装置１０のハードウェアブロック図である。パターン認識装置１０は、ＣＰＵ（Central  Processing  Unit）１０１と、操作部１０２と、表示部１０３、マイクロフォン１０４と、ＲＯＭ（Read  Only  Memory）１０５と、ＲＡＭ（Random  Access  Memory）１０６と、記憶部１０７と、通信装置１０８と、バス１０９とを備える。各部は、バス１０９により接続される。
【０１３８】
ＣＰＵ１０１は、ＲＡＭ１０６の所定領域を作業領域としてＲＯＭ１０５または記憶部１０７に予め記憶された各種プログラムとの協働により各種処理を実行し、パターン認識装置１０（特徴抽出部１２およびデコーダ２０）を構成する各部の動作を統括的に制御する。また、ＣＰＵ１０１は、ＲＯＭ１０５または記憶部１０７に予め記憶されたプログラムとの協働により、操作部１０２、表示部１０３、マイクロフォン１０４および通信装置１０８等を実現させる。
【０１３９】
操作部１０２は、マウスやキーボード等の入力デバイスであって、ユーザから操作入力された情報を指示信号として受け付け、その指示信号をＣＰＵ１０１に出力する。
【０１４０】
表示部１０３は、ＬＣＤ（Liquid  Crystal  Display）等の表示装置である。表示部１０３は、ＣＰＵ１０１からの表示信号に基づいて、各種情報を表示する。例えば、表示部１０３は、デコーダ２０が出力する認識結果を表示する。なお、通信装置１０８または記憶部１０７等に認識結果を出力する場合には、パターン認識装置１０は、表示部１０３を備えなくてもよい。
【０１４１】
マイクロフォン１０４は、音声信号を入力するデバイスである。予め記録された音声信号または通信装置１０８から入力される音声信号のパターン認識をする場合、または、音声以外の信号のパターン認識をする場合には、パターン認識装置１０は、マイクロフォン１０４を備えなくてもよい。
【０１４２】
ＲＯＭ１０５は、パターン認識装置１０の制御に用いられるプログラムおよび各種設定情報等を書き換え不可能に記憶する。ＲＡＭ１０６は、ＳＤＲＡＭ（Synchronous  Dynamic  Random  Access  Memory）等の揮発性の記憶媒体である。ＲＡＭ１０６は、ＣＰＵ１０１の作業領域として機能する。具体的には、パターン認識装置１０が用いる各種変数およびパラメータ等を一時記憶するバッファ等として機能する。
【０１４３】
記憶部１０７は、フラッシュメモリ等の半導体による記憶媒体、磁気的または光学的に記録可能な記憶媒体等の書き換え可能な記録装置である。記憶部１０７は、パターン認識装置１０の制御に用いられるプログラムおよび各種設定情報等を記憶する。また、記憶部１０７は、スコア関数のパラメータおよびＷＦＳＴに係る各種の情報等を予め記憶する。
【０１４４】
通信装置１０８は、外部の機器と通信して、音声信号の入力および認識結果の出力等に用いられる。予め記録された音声信号またはマイクロフォン１０４から入力した音声信号のパターン認識をする場合であり、認識結果を表示部１０３または記憶部１０７に出力する場合には、パターン認識装置１０は、通信装置１０８を備えなくてもよい。
【０１４５】
なお、手書き文字のパターン認識を行う場合には、パターン認識装置１０は、筆跡入力装置をさらに備える。また、ＯＣＲを行う場合には、パターン認識装置１０は、スキャナまたはカメラ等をさらに備える。また、ジェスチャ認識、手信号の認識または手話認識を行う場合には、パターン認識装置１０は、動画像信号を入力するビデオカメラをさらに備える。音声を利用しないこれらのパターン認識を行う場合には、パターン認識装置１０は、マイクロフォン１０４を備えなくてもよい。
【０１４６】
本実施形態のパターン認識装置１０で実行されるプログラムは、インストール可能な形式または実行可能な形式のファイルでＣＤ−ＲＯＭ、フレキシブルディスク（ＦＤ）、ＣＤ−Ｒ、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）等のコンピュータで読み取り可能な記録媒体に記録されて提供される。
【０１４７】
また、本実施形態のパターン認識装置１０で実行されるプログラムを、インターネット等のネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成してもよい。また、本実施形態のパターン認識装置１０で実行されるプログラムをインターネット等のネットワーク経由で提供または配布するように構成してもよい。また、本実施形態のパターン認識装置１０で実行されるプログラムを、ＲＯＭ等に予め組み込んで提供するように構成してもよい。
【０１４８】
本実施形態のパターン認識装置１０で実行されるプログラムは、上述した特徴抽出部１２およびデコーダ２０（トークン記憶部３１、トークン操作部３２、スコア算出部３３、重複除去部３４、枝刈部３５、ラティス記憶部３６、ノード追加部３７、接続検出部３８）を含むモジュール構成となっており、ＣＰＵ１０１（プロセッサ）が記憶媒体等からプログラムを読み出して実行することにより上記各部が主記憶装置上にロードされ、特徴抽出部１２およびデコーダ２０（トークン操作部３２、スコア算出部３３、重複除去部３４、枝刈部３５、ノード追加部３７、接続検出部３８）が主記憶装置上に生成されるようになっている。なお、特徴抽出部１２およびデコーダ２０の一部または全部がハードウェアにより構成されていてもよい。
【０１４９】
（効果）
以上のように、本実施形態に係るデコーダ２０によれば、有向グラフ（例えばＷＦＳＴ）の探索が終了した後に、ラティスから累積スコアが最も良い経路を有向グラフを参照しながら見つけ出して出力記号列を生成する。従って、デコーダ２０によれば、有向グラフの探索中に、ノード間の接続関係を示すバックポインタの生成および破棄をしなくてよいので、探索処理の計算コストを少なくし、バックポインタ等の管理のための記憶領域を削減することができる。
【０１５０】
＜第２実施形態＞
図７は、第２実施形態に係るデコーダ４０のブロック図である。なお、第２実施形態に係るデコーダ４０は、第１実施形態のデコーダ２０に代えて、パターン認識装置１０に備えられる。デコーダ４０を構成および実行するプログラムは、第１実施形態に係るデコーダ２０と略同一であるので、同一の機能および構成については図面中に同一の符号を付して詳細な説明を省略し、相違点について説明する。
【０１５１】
デコーダ４０は、削除部４１をさらに備える。デコーダ４０は、経路の探索の途中において、枝刈りによって、適宜、累積スコアが一定以上悪いトークンを削除する。従って、ラティス記憶部３６には、探索中において、対応するトークンが枝刈りにより既に削除されてしまったノードが残存する。すなわち、ラティス記憶部３６に記憶されたラティスは、最終フレームで追加されるノードへと繋がらない経路上のノードも保持している。このため、削除部４１は、予め定められた数の信号または特徴量が入力される毎に、ラティスから不要なノードを削除する。
【０１５２】
具体的には、削除部４１は、ＷＦＳＴを参照して、ｉ回目にラティスに追加したノードのうち、ｉ＋１回目にラティスに追加したノードの何れにも到達できないノードを削除する。なお、ｉは、１以上の整数である。これにより、削除部４１は、次のラティスに含まれるノードへと繋がらないノード（すなわち、途中で途絶えた経路上のノード）を、ラティスから削除することができる。
【０１５３】
また、ｉ回目に追加したノードを第１のノードとし、第１のノードに接続されたｉ＋１回目に追加したノードを第２のノードとする。この場合、削除部４１は、第２のノードに関連付けられた累積スコアが、第１のノードに関連付けられた累積スコアと第２のノードに関連付けられた信号スコアと第１のノードと第２のノードとを接続する経路上の重みとを加算した値に一致する経路を除く経路上のノードを削除してもよい。これにより、削除部４１は、次のラティスに含まれるノードへと繋がったとしても、最良の経路へとは繋がっていないノードを、ラティスから削除することができる。なお、重みの付いていない有向グラフを探索する場合には、削除部４１は、重みに関する処理を実行せずに、重みを０として累積スコアを算出する。
【０１５４】
また、削除部４１は、一例として、信号特徴量が入力される毎に毎回、不要なノードを削除してもよい。これに代えて、削除部４１は、予め定められた回数毎に不要なノードを削除してもよいし、記憶領域の空きが一定量以下となった場合に不要なノードを削除してもよい。
【０１５５】
図８は、第２実施形態に係るデコーダ４０における不要なノードの削除処理を表す関数ｐｒｕｎｅ（ｆｂｅｇｉｎ，ｆｅｎｄ）の擬似コードを示す図である。
【０１５６】
第２実施形態に係るデコーダ４０は、図４に示した擬似コードの３行目から１５行目の処理中であって、以下の条件を満たす場合に、関数ｐｒｕｎｅ（ｆｂｅｇｉｎ，ｆｅｎｄ）を実行する。条件は、図４の３行目から１５行目の処理を予め定められた回数繰り返したこと（１回のみも含む）、または、記憶領域の空きが一定量以下となったこと等である。
【０１５７】
ｆｂｅｇｉｎは、不要なフレームを削除するフレーム範囲における最初のフレーム番号を表す。ｆｅｎｄは、不要なフレームを削除する範囲における最後のフレーム番号を表す。例えば、５０フレーム分の特徴量を処理済みであり、３０フレーム目から５０フレーム目までの範囲における不要なノードを削除する場合には、デコーダ４０は、関数ｐｒｕｎｅ（３０，５０）を呼び出す。なお、図４の３行目から１５行目のどの時点で関数ｐｒｕｎｅを呼び出しても３行目から１５行目の処理に影響はない。
【０１５８】
１行目では、デコーダ４０は、ｉをｆｅｎｄ−１からｆｂｅｇｉｎまで順に１ずつ減らしていき、そのたびに２行目を処理することを表している。
【０１５９】
２行目では、デコーダ４０は、次の条件を満たすノードを含む集合でＬ［ｉ］を更新する。
【０１６０】
ｉ番目（１以上の整数）のフレームの信号の特徴量の入力に応じてラティスに追加されたノードをｔ（第１のノード）とし、ｉ＋１番目のフレームの信号の特徴量の入力に応じてラティスに追加されたノードをｔｎ（第２のノード）とする。この場合、条件を満たすノードは、ｔに割り当てられている状態から出ていく遷移ｅの次状態が、ｔｎに割り当てられている状態のいずれかに一致し、且つ、ｔの累積スコアとｅの重みとｔｎの信号スコアとを加算した値がｔｎの累積スコアと一致するノードである。
【０１６１】
図９は、第２実施形態に係るデコーダ４０における不要なノードの削除処理を表す関数ｐｒｕｎｅ（ｆｂｅｇｉｎ，ｆｅｎｄ）の２行目の変形例を示す図である。図８の疑似コードでは、デコーダ４０は、最良経路の結果のみを返す場合に、不要なノードを削除することができる。しかし、最良経路以外の結果もラティスに含めて返す場合には、２行目を図９に示すような擬似コードとすればよい。すなわち、デコーダ４０は、次の条件を満たすノードを含む集合でＬ［ｉ］を更新する。
【０１６２】
ｉ番目のフレームの信号の特徴量の入力に応じてラティスに追加されたノードをｔ（第１のノード）とし、ｉ＋１番目のフレームの信号の特徴量の入力に応じてラティスに追加されたノードをｔｎ（第２のノード）とする。この場合、条件を満たすノードは、ｔに割り当てられている状態から出ていく遷移ｅの次状態が、ｔｎに割り当てられている状態のいずれかに一致するノードである。
【０１６３】
以上のように、本実施形態に係るデコーダ４０は、有向グラフの探索中に、ラティスに追加された不要なノードを削除する。これにより、本実施形態に係るデコーダ４０によれば、有向グラフの探索中における記憶領域の使用量を削減することができる。
【０１６４】
＜第３実施形態＞
図１０は、第３実施形態に係るデコーダ５０のブロック図である。なお、第３実施形態に係るデコーダ５０は、第１実施形態のデコーダ２０に代えて、パターン認識装置１０に備えられる。デコーダ５０を構成および実行するプログラムは、第１実施形態に係るデコーダ２０と略同一であるので、同一の機能および構成については図面中に同一の符号を付して詳細な説明を省略し、相違点について説明する。
【０１６５】
デコーダ５０は、アーク追加部５１をさらに備える。アーク追加部５１は、ノード追加部３７によるノードの追加が完了した後に、アークをラティスに追加する。すなわち、アーク追加部５１は、ＷＦＳＴの探索が完了した後に、アークをラティスに追加する。この場合、アーク追加部５１は、ｉ回目（ｉは１以上の整数）にラティスに追加したノードから、ｉ＋１回目にラティスに追加したノードへのアークを、ラティスに追加する。
【０１６６】
アーク追加部５１は、アークが追加されたラティスを外部へと出力する。これにより、アーク追加部５１は、最良経路の取得以外にも利用が可能な認識結果を出力することができる。なお、デコーダ５０は、図７に示す削除部４１をさらに有する構成であってもよい。
【０１６７】
図１１は、第３実施形態に係るデコーダ５０の処理内容を表す擬似コードを示す図である。図１１の擬似コードは、図４の擬似コードの処理が実行された後に実行される。なお、デコーダ５０は、図４の１６行目から２５行目の処理に代えて、図１１の１行目から２１行目の処理を実行してもよい。
【０１６８】
Ｄは、アークを含むラティスのノードの集合を表す。Ｒは、アークの集合を表す。本実施形態では、ノードに累積スコアを割り当てる。また、アークに、１フレーム分を処理したときに通過したε遷移でない遷移の入力記号と、通過した遷移の出力記号を連結した出力記号列とを割り当てる。さらに、１フレーム分を処理したときに累積スコアに加えられた値、すなわち、通過した遷移の重みと信号スコアとを加えた値をアークに割り当てる。このスコアを差分スコアと呼ぶこととする。
【０１６９】
アークは、５つの要素の組（前状態，次状態，入力記号，出力記号，差分スコア）で構成される。本実施形態では、ラティスＬに含まれるノードを再利用する。Ｌのノードには、ＷＦＳＴの状態が割り当てられている。ＷＦＳＴの状態が必要なければ、ノードから、ＷＦＳＴの状態を除去した新たなノードを作成してもよい。
【０１７０】
図１１の擬似コードの１行目では、デコーダ５０は、図４の２行目から１５行目の処理が終わった時点でのｆの値で、ｆを初期化する。また、デコーダ５０は、新しいノードｔｆを作成する。ｔｆは、ラティスの終端を表す。つまり、ｔｆは、終了ノードを表す。
【０１７１】
２行目では、デコーダ５０は、ノードの集合Ｄを、空集合で初期化する。また、デコーダ５０は、アークの集合Ｒを空集合で初期化する。
【０１７２】
３行目では、デコーダ５０は、図４の１７行目と同一の処理を行う。
【０１７３】
４行目では、デコーダ５０は、Θが空集合でない場合には処理を６行目に進める。Θが空集合である場合には、デコーダ５０は、５行目で空のラティスを認識結果として返す。なお、終了状態に達しているノードが１つも存在しなくてもアークを追加したラティスを生成する場合には、デコーダ５０は、３行目の擬似コードに、Θを作成する条件であるｑ∈Ｆを含めなければよい。
【０１７４】
６行目では、デコーダ５０は、ｔｆに最良の累積スコアを割り当てる。本例では、最大の累積スコアが、最良の累積スコアである。
【０１７５】
７行目では、デコーダ５０は、ｔｆをＤに追加する。
【０１７６】
８行目は、Θのそれぞれ要素に対して９行目を処理することを示す。
【０１７７】
９行目では、デコーダ５０は、ノードｔからノードｔｆへのアークを作成する。そして、デコーダ５０は、作成したアークをＲに追加する。追加したアークは、入力記号が空列であり、出力記号列がｏであり、差分スコアがｗである。また、デコーダ５０は、ｔをＤに追加する。
【０１７８】
１０行目では、デコーダ５０は、Θに含まれるノードをＴに代入する。
【０１７９】
１１行目は、１２行目から２０行目までをｆが０になるまで繰り返すことを示す。
【０１８０】
１２行目では、デコーダ５０は、ｆを１減らす。
【０１８１】
１３行目では、デコーダ５０は、Ｌ［ｆ］に含まれるノードのうち、次の条件を満たすノードをＴｐに代入する。条件を満たすノードは、Ｌ［ｆ］に含まれるノードｔのうち、ｔが割り当てられている状態を引数とする関数ｏｕｔｇｏｉｎｇによって得られる遷移の次状態が、Ｔに含まれるノードが割り当てられている何れかの状態に一致するノードである。
【０１８２】
１４行目では、デコーダ５０は、ＤにＴｐを追加する。
【０１８３】
１５行目は、Ｔｐに含まれるそれぞれノードｔについて、１６行目から１９行目を処理することを示す。
【０１８４】
１６行目は、ｔが割り当てられている状態を引数に取る関数ｏｕｔｇｏｉｎｇによって得られるそれぞれの遷移ｅについて、１７行目から１９行目を処理することを示す。
【０１８５】
１７行目は、Ｔに含まれているノードが割り当てられている状態のいずれかにｅの次状態が一致するか否かを判定し、一致する状態があれば１８行目と１９行目を処理することを示す。
【０１８６】
１８行目では、デコーダ５０は、１７行目で一致した状態が割り当てられていたノードをｔｎに代入する。
【０１８７】
１９行目では、デコーダ５０は、ノードｔからノードｔｎへのアークをＲに追加する。追加したアークは、入力記号がｅの入力記号であり、出力記号列がｅの出力記号列であり、差分スコアがｅの重みとｔｎの信号スコアとを加算した値である。
【０１８８】
２０行目では、デコーダ５０は、ＴｐをＴに代入する。
【０１８９】
２１行目では、デコーダ５０は、ノードの集合とアークの集合とをアーク付きのラティスとして返し、処理を終了する。
【０１９０】
以上のように、本実施形態に係るデコーダ５０は、有向グラフの探索が終了した後に、アークを生成してラティスに追加する。これにより、デコーダ５０によれば、有向グラフの探索中においてアークの生成および破棄をする必要が無く、探索処理の計算コストを少なくすることができる。
【０１９１】
＜第４実施形態＞
図１２は、第４実施形態に係るデコーダ６０のブロック図である。なお、第４実施形態に係るデコーダ６０は、第１実施形態のデコーダ２０に代えて、パターン認識装置１０に備えられる。デコーダ６０を構成および実行するプログラムは、第１実施形態に係るデコーダ２０と略同一であるので、同一の機能および構成については図面中に同一の符号を付して詳細な説明を省略し、相違点について説明する。
【０１９２】
第４実施形態に係るデコーダ６０は、トークン記憶部３１と、複数のトークン操作部３２と、複数のスコア算出部３３と、複数の重複除去部３４と、複数の枝刈部３５と、ラティス記憶部３６と、ノード追加部３７と、接続検出部３８と、第１分割部６１と、第１収集部６２と、第２分割部６３と、第２収集部６４と、第３分割部６５と、第３収集部６６と、第４分割部６７と、第４収集部６８とを備える。
【０１９３】
第１分割部６１は、信号または信号の特徴量を入力する毎に、トークン記憶部３１に記憶された複数のトークンを複数のトークン操作部３２に対応した複数の小集合に分割する。そして、第１分割部６１は、複数のトークン操作部３２のそれぞれに、対応する小集合に含まれるトークンを分配する。複数のトークン操作部３２のそれぞれは、受け取った小集合に含まれるトークンのそれぞれを、次の状態に移動させる。この場合において、複数のトークン操作部３２は、互いに並行して処理を実行する。
【０１９４】
第１収集部６２は、複数のトークン操作部３２により移動された複数のトークンを収集する。そして、第１収集部６２は、収集した複数のトークンをトークン記憶部３１に記憶させる。
【０１９５】
第２分割部６３は、第１収集部６２により収集されトークン記憶部３１に記憶された複数のトークンを、複数の重複除去部３４に対応した複数の小集合に分割する。この場合において、第２分割部６３は、同一の状態に到達したトークンを同一の小集合に含めるように分割する。そして、第２分割部６３は、複数の重複除去部３４のそれぞれに、対応する小集合に含まれるトークンを分配する。複数の重複除去部３４のそれぞれは、受け取った小集合に含まれるトークンのそれぞれに関して、同一の状態に到達したトークンの重複を除去する。より具体的には、複数の重複除去部３４は、同一の状態に到達した複数のトークンのうち累積スコアが最良のトークンを残存させる。この場合において、複数の重複除去部３４は、互いに並行して処理を実行する。
【０１９６】
第２収集部６４は、複数の重複除去部３４の除去の結果、残った複数のトークンを収集する。そして、第２収集部６４は、収集した複数のトークンをトークン記憶部３１に記憶させる。
【０１９７】
第３分割部６５は、第２収集部６４により収集されトークン記憶部３１に記憶された複数のトークンを、複数のスコア算出部３３に対応した複数の小集合に分割する。そして、第３分割部６５は、複数のスコア算出部３３のそれぞれに、対応する小集合に含まれるトークンを分配する。複数のスコア算出部３３は、受け取った小集合に含まれる複数のトークンのそれぞれに対応する信号スコアおよび累積スコアを算出する。この場合において、複数のスコア算出部３３は、互いに並行して処理を実行する。
【０１９８】
第３収集部６６は、複数のスコア算出部３３によりスコアが算出された複数のトークンを収集する。そして、第３収集部６６は、収集した複数のトークンをトークン記憶部３１に記憶させる。
【０１９９】
第４分割部６７は、第３収集部６６により収集されトークン記憶部３１に記憶された複数のトークンを、複数の枝刈部３５に対応した複数の小集合に分割する。そして、第４分割部６７は、複数の枝刈部３５のそれぞれに、対応する小集合に含まれるトークンを分配する。複数の枝刈部３５は、累積スコアが一定以上悪いトークンを除去する。この場合において、複数の枝刈部３５は、互いに並行して処理を実行する。
【０２００】
第４収集部６８は、複数の枝刈部３５によりスコアが算出された複数のトークンを収集する。そして、第４収集部６８は、収集した複数のトークンをトークン記憶部３１に記憶させる。
【０２０１】
なお、第４実施形態に係るデコーダ６０は、図７に示す削除部４１および図１０に示すアーク追加部５１をさらに備える構成であってもよい。
【０２０２】
図１３は、第４実施形態に係るデコーダ６０のスレッドのブロック図である。第４実施形態に係るパターン認識装置１０のハードウェア構成は、図６で示した構成に、１以上のＣＰＵ１０１を追加した構成である。
【０２０３】
また、デコーダ６０は、複数のＣＰＵ１０１により実現される複数のスレッドにより、タスクを実行する。デコーダ６０は、一例として、メインスレッド７１と、タスクキュー７２と、結果キュー７３と、複数のワーカースレッド７４とを備える。
【０２０４】
メインスレッド７１は、タスクを生成してタスクキュー７２に格納する処理、および、結果キュー７３から結果を取得して結合する処理を実行する。ワーカースレッド７４は、タスクキュー７２からタスクを取得して実行する。デコーダ６０は、並列して実行するタスクの数分、ワーカースレッド７４を備える。デコーダ６０は、一例として、複数のＣＰＵ１０１の数分のワーカースレッド７４を備える。それぞれのワーカースレッド７４は、タスクを実行することにより得られた結果を、結果キュー７３に格納する。
【０２０５】
タスクキュー７２および結果キュー７３は、排他制御されており、複数のワーカースレッド７４およびメインスレッド７１から同時にアクセスがされない。なお、ＣＰＵ１０１が１つの場合には、デコーダ６０は、ワーカースレッド７４を備えずに、メインスレッド７１がタスクを実行する。これにより、ＣＰＵ１０１が１つの場合には、デコーダ６０は、排他制御を実行しなくてよくなり、処理コストを削減できる。
【０２０６】
図１４は、第４実施形態に係るデコーダ６０のメインスレッド７１が実行する処理内容を表す擬似コードを示す図である。図１５は、デコーダ６０のワーカースレッド７４が実行する処理内容を表す擬似コードを示す図である。
【０２０７】
なお、図１４の擬似コードの行番号と図１５の擬似コードの行番号とを区別するため、図１４の擬似コードの行番号を１行目から開始するコードとし、図１５の擬似コードの行番号を１０１行目から開始するコードとする。
【０２０８】
なお、Ｑｔａｓｋは、タスクキュー７２を表す。Ｑｒｅｓｕｌｔは、結果キュー７３を表す。
【０２０９】
デコーダ６０は、特徴量が入力される毎に、３行目から２５行目までを繰り返し処理する。概略として、第１フェーズ（４行目から８行目）で、デコーダ６０は、トークンを次の状態に移動させる。第２フェーズ（９行目から１３行目）で、デコーダ６０は、不要なトークンを取り除く。第３フェーズ（１４行目から１９行目）で、デコーダ６０は、信号スコアおよび累積スコアを算出する。第４フェーズ（２１行目から２５行目）で、デコーダ６０は、累積スコアが条件を満たさないトークンを枝刈りし、ラティスのノードとしてＬ［ｆ］に残ったトークンを追加する。２６行目以降は、第１実施形態で説明した図４の１６行目以降と同一の処理である。
【０２１０】
以下、各行において実行される処理を説明する。
【０２１１】
図１４の１行目では、メインスレッド７１は、処理中のタスクの数を表す変数ｎを０に初期化する。他の処理は、図４の１行目と同様である。
【０２１２】
２行目および３行目は、図４の２行目および３行目と同様である。
【０２１３】
４行目では、メインスレッド７１は、関数ｓｐｌｉｔによってＬ［ｆ］に記録されている複数のノードに対応する複数のトークンを分割し、１以上のトークンを含む小集合を要素とする集合を返す。その集合の要素をＴｓｕｂとする。そして、メインスレッド７１は、小集合毎に５行目の処理を実行する。
【０２１４】
ここで、関数ｓｐｌｉｔは、複数のトークンをどのように分割してもよい。関数ｓｐｌｉｔは、一例として、ワーカースレッド７４の数に複数のトークンを分割する。また、関数ｓｐｌｉｔは、Ｌ［ｆ]に含まれるノードの数で複数のトークンを分割してもよい。これにより、１タスクで１つのトークンに対する処理を実行させることができる。なお、細かく分割するほど並行度は上がるが、５行目や８行目のキューの操作の回数が増えるため、全体として処理速度が向上するとは限らない。
【０２１５】
５行目では、メインスレッド７１は、タスクをＱｔａｓｋに追加する。タスクの名前は、ｐｈａｓｅ１である。タスクに付随するデータは、Ｔｓｕｂである。メインスレッド７１は、タスクを１つ追加したので、ｎを１増やす。
【０２１６】
６行目では、メインスレッド７１は、Ｔを空集合にする。
【０２１７】
７行目は、全てのタスクが処理されるまで８行目を処理することを示す。８行目では、メインスレッド７１は、Ｑｒｅｓｕｌｔから結果を取得する。得られた値は、移動後のトークンの集合である。メインスレッド７１は、得られた値をＴに追加する。また、結果が得られたということは１つのタスクが終了したということなので、メインスレッド７１は、ｎを１減らす。Ｑｒｅｓｕｌｔに結果が１つも入っていない場合には、メインスレッド７１は、結果が得られるまで待つ。
【０２１８】
ワーカースレッド７４は、５行目で追加されたタスクを、図１５に示す疑似コードに従って処理する。図１５の１０１行目は、処理を完了するまでの間、１０２行目から１２２行目までを繰り返し実行することを示す。１０２行目では、ワーカースレッド７４は、Ｑｔａｓｋにタスクが追加されるまで待機し、Ｑｔａｓｋにタスクが追加されると、そのタスクを取り出す。取り出したタスクの名前をｕｎａｍｅ、データをｕｄａｔａとする。
【０２１９】
１０３行目は、追加されたタスクの名前がｐｈａｓｅ１である場合、１０４行目から１０９行目を処理することを示す。１０４行目では、ワーカースレッド７４は、ｕｄａｔａからデータを取り出し、取り出したデータをＴｔとする。また、ワーカースレッド７４は、Ｔｎｅｗを空集合で初期化する。１０５行目は、１０６行目から１０８行目までをＴｔに含まれるそれぞれのトークンについて処理することを示す。
【０２２０】
１０６行目から１０８行目では、ワーカースレッド７４は、トークンを追加する集合をＴｎｅｗへ変更して、図４の６行目から８行目と同様に処理する。１０９行目では、ワーカースレッド７４は、得られたトークンの集合ＴｎｅｗをＱｒｅｓｕｌｔへ追加して、このタスクの処理を終了する。
【０２２１】
図１４の９行目では、メインスレッド７１は、関数ｓｐｌｉｔによって、トークンの集合を分割し、１以上のトークンを含む小集合を要素とする集合Ｔｓｕｂを返す。そして、メインスレッド７１は、小集合毎に１０行目の処理を実行する。
【０２２２】
９行目の分割では、４行目の分割と異なり、メインスレッド７１は、同じ状態が割り当てられているトークンを同じトークンの集合に含める、という条件に従って分割をする。分割後のトークンの小集合としてＴ１とＴ２があり、これらに含まれているトークンの状態の集合をそれぞれｓｔａｔｅ（Ｔ１）とｓｔａｔｅ（Ｔ２）とする。この場合、ｓｔａｔｅ（Ｔ１）とｓｔａｔｅ（Ｔ２）との両方に同じ状態が含まれていてはならない。なお、デコーダ６０は、状態とコンテキスト情報とが同一の複数のトークンのうち、最も累積スコアが良いトークンを残存させてもよい。この場合、メインスレッド７１は、同一の状態に複数のトークンが割り当てられるので、９行目では、状態とコンテキスト情報とが同じトークンを同じトークンの集合に含める、という条件に従って分割をする。
【０２２３】
１０行目では、メインスレッド７１は、タスクをＱｔａｓｋに追加する。タスクの名前は、ｐｈａｓｅ２である。付随するデータは、Ｔｓｕｂである。メインスレッド７１は、タスクを１つ追加したので、ｎを１増やす。
【０２２４】
１１行目では、メインスレッド７１は、Ｔを空集合にする。
【０２２５】
１２行目は、全てのタスクが処理されるまで１３行目を処理することを示す。１３行目では、メインスレッド７１は、Ｑｒｅｓｕｌｔから結果を取得する。得られる値は、不要なトークンを除いたトークンの集合である。メインスレッド７１は、得られた値をＴに追加する。また、結果が得られたということは１つのタスクが終了したということなので、メインスレッド７１は、ｎを１減らす。Ｑｒｅｓｕｌｔに結果が１つも入っていない場合には、メインスレッド７１は、結果が得られるまで待つ。
【０２２６】
ワーカースレッド７４は、１０行目で追加されたタスクを、図１５に示す疑似コードに従って処理する。１１０行目は、追加されたタスクの名前がｐｈａｓｅ２である場合、１１１行目から１１２行目を処理することを示す。
【０２２７】
１１１行目では、ワーカースレッド７４は、ｕｄａｔａからデータを取り出し、取り出したデータをＴｔとする。１１２行目では、ワーカースレッド７４は、図４の９行目と同様に処理する。すなわち、ワーカースレッド７４は、Ｔｔに含まれるトークンのうち、割り当てられている状態が同じトークンが複数ある場合に累積スコアが最も大きいものを１つ残す。ワーカースレッド７４は、残存したトークンの集合をＱｒｅｓｕｌｔへ追加して、このタスクの処理を終了する。
【０２２８】
図１４の１４行目では、メインスレッド７１は、４行目と同様に、関数ｓｐｌｉｔによってトークンの集合を分割し、１以上のトークンを含む小集合を要素とする集合を返す。そして、メインスレッド７１は、小集合毎に１５行目の処理を実行する。
【０２２９】
１５行目では、メインスレッド７１は、タスクをＱｔａｓｋに追加する。タスクの名前は、ｐｈａｓｅ３である。付随するデータは、Ｔｓｕｂと特徴量ｖである。メインスレッド７１は、タスクを１つ追加したので、ｎを１増やす。
【０２３０】
１６行目では、メインスレッド７１は、Ｔを空集合にする。また、メインスレッド７１は、ｗｍａｘをマイナス無限大に初期化する。実際には、メインスレッド７１は、ｗｍａｘに設定できる最小値を設定する。
【０２３１】
１７行目は、全てのタスクが処理されるまで１８行目から１９行目を処理することを示す。１８行目では、メインスレッド７１は、Ｑｒｅｓｕｌｔから結果を取得する。メインスレッド７１は、得られた値をＴｒとｗｒとする。また、結果が得られたということは１つのタスクが終了したということなので、メインスレッド７１は、ｎを１減らす。Ｑｒｅｓｕｌｔに結果が１つも入っていない場合には、メインスレッド７１は、結果が得られるまで待つ。
【０２３２】
１９行目では、メインスレッド７１は、ＴｒをＴに追加する。また、ｗｒがｗｍａｘよりも大きい場合には、メインスレッド７１は、ｗｍａｘをｗｒに更新する。
【０２３３】
ワーカースレッド７４は、１５行目で追加されたタスクを、図１５に示す疑似コードに従って処理する。１１３行目は、追加されたタスクの名前がｐｈａｓｅ３である場合、１１４行目から１１９行目を処理することを示す。
【０２３４】
１１４行目では、ワーカースレッド７４は、ｕｄａｔａからデータを取り出し、取り出したトークンの集合をＴｔとし、特徴量をｖとする。１１５行目から１１８行目では、ワーカースレッド７４は、ＴをＴｔに変更して、図４の１０行目から１３行目と同様に処理する。１１９行目では、ワーカースレッド７４は、２つの要素の組（Ｔｔ，ｗｍａｘ）をＱｒｅｓｕｌｔへ追加して、このタスクの処理を終了する。
【０２３５】
図１４の２０行目では、メインスレッド７１は、図４の１４行目と同様に処理する。
【０２３６】
２１行目では、メインスレッド７１は、４行目と同様に、関数ｓｐｌｉｔによってトークンの集合を分割し、１以上のトークンを含む小集合を要素とする集合を返す。そして、メインスレッド７１は、小集合毎に２２行目の処理を実行する。
【０２３７】
２２行目では、メインスレッド７１は、タスクをＱｔａｓｋに追加する。タスクの名前は、ｐｈａｓｅ４である。付随するデータは、Ｔｓｕｂと累積スコアの最大値ｗｍａｘである。メインスレッド７１は、タスクを１つ追加したので、ｎを１増やす。
【０２３８】
２３行目では、メインスレッド７１は、Ｌ［ｆ］を空集合にする。
【０２３９】
２４行目は、全てのタスクが処理されるまで２５行目を処理することを示す。２５行目では、メインスレッド７１は、Ｑｒｅｓｕｌｔから結果を取得する。得られる値は、枝刈りされたトークンを除いたトークンの集合である。メインスレッド７１は、得られた結果をＬ［ｆ］に追加する。また、結果が得られたということは１つのタスクが終了したということなので、メインスレッド７１は、ｎを１減らす。Ｑｒｅｓｕｌｔに結果が１つも入っていない場合には、メインスレッド７１は、結果が得られるまで待つ。
【０２４０】
ワーカースレッド７４は、２２行目で追加されたタスクを、図１５に示す疑似コードに従って処理する。１２０行目は、追加されたタスクの名前がｐｈａｓｅ４である場合、１２１行目から１２２行目を処理することを示す。
【０２４１】
１２１行目では、ワーカースレッド７４は、ｕｄａｔａからデータを取り出し、トークンの集合をＴｔとし、累積スコアの最大値をｗｍａｘとする。１２２行目では、ワーカースレッド７４は、図４の１５行目と同様に処理する。すなわち、ワーカースレッド７４は、ｗｍａｘから一定値ｗｂｅａｍを引いた値より累積スコアが小さいトークンを除去する。ワーカースレッド７４は、残ったトークンの集合をＱｒｅｓｕｌｔへ追加して、このタスクの処理を終了する。
【０２４２】
そして、図１４の２６行目から３５行目では、メインスレッド７１は、図４の１６行目から２５行目と同様に処理する。
【０２４３】
以上で説明したように、デコーダ６０は、タスクキュー７２と結果キュー７３を用いて、メインスレッド７１とワーカースレッド７４との間でデータを受け渡す。このため、デコーダ６０では、タスクキュー７２と結果キュー７３が排他制御されていれば、他の部分の排他制御をしなくてもよい。
【０２４４】
なお、第２実施形態に係る関数ｐｒｕｎｅも、タスクの１つとしてワーカースレッド７４に処理させることができる。この場合、図１４の２行目から２５行目のどの時点でも、タスクをＱｔａｓｋに追加することができる。ただし、２５行目の処理中に追加中のノードを含む範囲を関数ｐｒｕｎｅに渡すことはできない。その範囲を含まなければ図１４の２行目から２５行目までの処理中にラティスが変更されることはないため、互いに独立に処理を進めることができる。
【０２４５】
また、メインスレッド７１は、３行目の特徴量の取得を１４行目の直前で実行してもよい。特徴量の取得を遅らせることにより、パターン認識装置１０は、特徴量を算出する処理とトークンを進める処理とを並行して行うことができる。
【０２４６】
以上のように、本実施形態に係るデコーダ６０は、複数のＣＰＵ１０１を用いて並行に処理を実行することができるので、処理時間を短くすることができる。
【０２４７】
＜有向グラフの変形例＞
以上の第１から第４実施形態では、探索する有向グラフとしてＷＦＳＴを用いた例を説明した。しかし、他の有向グラフを探索して同様にラティスを生成することもできる。他の有向グラフとは、入力記号、出力記号、および、重みの割り当て方が、ＷＦＳＴと異なる有向グラフである。すなわち、入力記号、出力記号および重みが状態または遷移の何れかに割り当てられた有向グラフであれば、どのような有向グラフを用いてもよい。
【０２４８】
このような有向グラフは、８種類存在する。これらの有向グラフは、互いに変換可能である。例えば、第１から第４実施形態では、入ってくる遷移の入力記号は全て同じであった。これは、入力記号が状態に割り当てられていることと同じである。すなわち、入ってくる遷移の入力記号を状態に割り当てなおしても、それぞれ経路上にある入力記号を繋げた入力記号列は、全て割り当てなおす前の入力記号列と同一である。
【０２４９】
また、言語モデルおよびＨＭＭの遷移確率等を用いない場合、有向グラフの重みは０となる。例えば、孤立単語認識を行う場合には、重みが０の有向グラフが用いられる。この場合、デコーダ２０等は、記憶領域に重みを保持しなくてよく、さらに、重みに関する処理を全て実行しなくてもよい。
【０２５０】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０２５１】
１０  パターン認識装置
１２  特徴抽出部
２０  デコーダ
２２  記憶部
３１  トークン記憶部
３２  トークン操作部
３３  スコア算出部
３４  重複除去部
３５  枝刈部
３６  ラティス記憶部
３７  ノード追加部
３８  接続検出部
４０  デコーダ
４１  削除部
５０  デコーダ
５１  アーク追加部
６０  デコーダ
６１  第１分割部
６２  第１収集部
６３  第２分割部
６４  第２収集部
６５  第３分割部
６６  第３収集部
６７  第４分割部
６８  第４収集部
７１  メインスレッド
７２  タスクキュー
７３  結果キュー
７４  ワーカースレッド
１０１  ＣＰＵ
１０２  操作部
１０３  表示部
１０４  マイクロフォン
１０５  ＲＯＭ
１０６  ＲＡＭ
１０７  記憶部
１０８  通信装置
１０９  バス
【図１】
2015121709.tif 000003
【図２】
2015121709.tif 000004
【図３】
2015121709.tif 000005
【図４】
2015121709.tif 000006
【図５】
2015121709.tif 000007
【図６】
2015121709.tif 000008
【図７】
2015121709.tif 000009
【図８】
2015121709.tif 000010
【図９】
2015121709.tif 000011
【図１０】
2015121709.tif 000012
【図１１】
2015121709.tif 000013
【図１２】
2015121709.tif 000014
【図１３】
2015121709.tif 000015
【図１４】
2015121709.tif 000016
【図１５】
2015121709.tif 000017