(57)【特許請求の範囲】
【請求項１】
入力テキストデータから音素及び目標韻律が対応付けられたセグメントデータの列を抽出する抽出部と、
前記抽出部により抽出されたセグメントデータごとに、音声コーパスから取得した音声素片が当該セグメントデータの目標韻律よりも長い継続長を有する場合に、当該取得した音声素片から前記目標韻律の継続長より長い箇所を削除した新たな音声素片を生成する生成部と、
前記取得した音声素片及び前記新たな音声素片夫々と前記セグメントデータとの不一致度を示す素片コストを算出し、当該算出された各素片コストに基づき前記取得した音声素片及び前記新たな音声素片夫々から前記セグメントデータに対する音声素片候補データとなる音声素片をリストアップする素片リストアップ部と、
前記抽出されたセグメントデータの列を構成する前記セグメントデータごとに、当該セグメントデータに対応する前記音声素片候補データと、当該セグメントデータに隣接するセグメントデータに対応する前記音声素片候補データとの間の不連続性を示す接続コストを算出し、当該算出された接続コスト及び前記隣接する音声素片候補データ夫々の素片コストに基づいて、前記音声素片候補データとしてリストアップされた音声素片のいずれかを選択して前記音声素片データ列を生成する音素列選択部と、
前記生成された音声素片データ列に基づいて合成音声を生成する音声生成部と、
を備える音声合成装置。
【請求項２】
前記生成部は、前記取得した音声素片から前記目標韻律の継続長より長い箇所を削除した新たな音声素片として、前記取得した音声素片の先頭箇所を削除した新たな音声素片、前記取得した音声素片の末尾箇所を削除した新たな音声素片、及び前記取得した音声素片の先頭箇所及び末尾箇所を均等に削除した新たな音声素片を生成する、請求項１に記載の音声合成装置。
【請求項３】
前記セグメントデータおよび前記音声素片は音素データと韻律データを含み、
前記素片コストは、処理対象の前記セグメントデータの音素と当該セグメントデータの前後所定数セグメントずつの各セグメントデータの音素とから構成される音素列と、処理対象の前記音声素片候補データの音素と当該音声素片候補データの前後の前記所定数ずつの各音声素片データの音素とから構成される音素列とを比較することにより算出される音素列コストと、処理対象の前記セグメントデータの韻律データと処理対象の前記音声素片候補データの韻律データとの差に基づいて算出される韻律コストとの、重み付け和として算出する、請求項１または２に記載の音声合成装置。
【請求項４】
前記接続コストは、処理対象の前記セグメントデータに対応する処理対象の前記音声素片候補データと当該セグメントデータの１つ前の前記セグメントデータに対応する前記音声素片候補データとの間の音素接続点での各特徴量ベクトルデータ間の距離として算出する、請求項１ないし３のいずれかに記載の音声合成装置。
【請求項５】
音声素片を記憶する音声コーパスを有する音声合成装置で音声を合成するための方法であって、前記音声合成装置は、
入力テキストデータから音素及び目標韻律が対応付けられたセグメントデータの列を抽出し、
前記抽出されたセグメントデータごとに、前記音声コーパスから取得した音声素片が当該セグメントデータの目標韻律よりも長い継続長を有する場合に、当該取得した音声素片から前記目標韻律の継続長より長い箇所を削除した新たな音声素片を生成し、
前記取得した音声素片及び前記新たな音声素片夫々と前記セグメントデータとの不一致度を示す素片コストを算出し、
前記算出された各素片コストに基づき前記取得した音声素片及び前記新たな音声素片夫々から前記セグメントデータに対する音声素片候補データとなる音声素片をリストアップし、
前記抽出されたセグメントデータの列を構成する前記セグメントデータごとに、当該セグメントデータに対応する前記音声素片候補データと、当該セグメントデータに隣接するセグメントデータに対応する前記音声素片候補データとの間の不連続性を示す接続コストを算出し、
前記算出された接続コスト及び前記隣接する音声素片候補データ夫々の素片コストに基づいて、前記音声素片候補データとしてリストアップされた音声素片のいずれかを選択して前記音声素片データ列を生成し、
前記生成された音声素片データ列に基づいて合成音声を生成する、音声合成方法。
【請求項６】
音声素片を記憶する音声コーパスを有する音声合成装置として用いられるコンピュータに、
入力テキストデータから音素及び目標韻律が対応付けられたセグメントデータの列を抽出するステップと、
前記抽出されたセグメントデータごとに、前記音声コーパスから取得した音声素片が当該セグメントデータの目標韻律よりも長い継続長を有する場合に、当該取得した音声素片から前記目標韻律の継続長より長い箇所を削除した新たな音声素片を生成するステップと、
前記取得した音声素片及び前記新たな音声素片夫々と前記セグメントデータとの不一致度を示す素片コストを算出するステップと、
前記算出された各素片コストに基づき前記取得した音声素片及び前記新たな音声素片夫々から前記セグメントデータに対する音声素片候補データとなる音声素片をリストアップするステップと、
前記抽出されたセグメントデータの列を構成する前記セグメントデータごとに、当該セグメントデータに対応する前記音声素片候補データと、当該セグメントデータに隣接するセグメントデータに対応する前記音声素片候補データとの間の不連続性を示す接続コストを算出するステップと、
前記算出された接続コスト及び前記隣接する音声素片候補データ夫々の素片コストに基づいて、前記音声素片候補データとしてリストアップされた音声素片のいずれかを選択して前記音声素片データ列を生成するステップと、
前記生成された音声素片データ列に基づいて合成音声を生成するステップと、
を実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、音声コーパスからの音声素片の選択によって音声合成を行う技術に関する。
【背景技術】
【０００２】
入力テキストデータから生成される合成目標に対して、電子化された大規模な言語・音声データである音声コーパスを参照することにより音声素片を選択し、当該音声素片を接続することにより合成音声を出力する音声合成技術が知られている（例えば非特許文献１に記載の技術）。
【０００３】
このような音声合成技術において、音声コーパスから合成目標に最も適合する音声素片列を選択するための手法として従来、次のような技術が知られている（例えば非特許文献１に記載の技術）。まず、入力テキストデータから抽出される音素セグメントごとに、その音素と同じ音素を有する音声素片のデータ（以下、「素片データ」と記載する）が、素片候補データとして音声コーパスから抽出される。次に、ＤＰ（Ｄｙｎａｍｉｃ  Ｐｒｏｇｒａｍｍｉｎｇ：動的計画法）アルゴリズムによって、入力テキストデータ全体に渡ってコストが最小となる最良の素片候補データの組（最良の素片データ列）が決定される。コストとしては、入力テキストデータと音声コーパス内の各素片データ間の音素列および韻律の差異、素片候補データである隣接する素片データ間のスペクトラム包絡などの音響パラメータ（特徴量ベクトルデータ）の不連続性などが用いられる。
【０００４】
上述のような素片接続型の音声合成において、より自然な聴感を得られるためには、指定された韻律遷移に忠実であること、素片同士の接続部が滑らかに連続していることなどが必須である。
【０００５】
これらを同時に実現するためには、なるべく連続する区間を採用できるような、元音声情報を大量に搭載する辞書、あるいは、音素の切れ目が正確に定義されている辞書が必要となる。一般に、辞書制作のための音素片分割には、自動分割の精度が低く、人間が実際に録音音声を聞いたうえで切り出しを行うなど、高いコストを要求される。
【０００６】
音声の連続性を考慮した素片接続型の従来の音声合成技術として、次のような技術が知られている（例えば特許文献１に記載の技術）。音声素片同士を接続する際の最適接続点を探索する接続点探索において、先行する音声素片の末尾から所定の範囲内、又は接続する音声素片の先頭から所定の範囲内を、最適接続点の探索範囲とする技術である。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００８−１９１３３４号公報
【非特許文献】
【０００８】
【非特許文献１】河井  恒、“知識ベース  3-4 コーパスベース音声合成”、［online］、ver.1/2011.1.7、電子情報通信学会、［平成２５年１２月２５日検索］、インターネット＜ＵＲＬ：http://27.34.144.197/files/02/02gun_07hen_03.pdf#page=6＞
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかし、上述の従来技術では、音声素片同士の接続において接続部分の所定範囲を最適接続点の探索範囲としているだけであり、音声コーパスから音声素片を選択する際の韻律情報の評価においては音声素片の切り出し範囲は考慮されていない。また、素片選択時の音声素片の適合度と音声素片同士の接続点の適合度とを所定の重み付き関数で評価する際に、最適接続点の探索範囲が変更されたときに音声素片の適合度も変化するが、上述の従来技術ではその変化分は考慮されていない。これらの点から、上述の従来技術は、本来目標とする韻律情報に適合した最適な素片を選択することができないという課題を有していた。
【００１０】
さらに、指定韻律に合う音声にするため、合成部などで、波形の変形を行うことが考えられるが、この際の波形変形による音質劣化のリスクも課題である。
【００１１】
本発明は、音声コーパスから最適な音声素片を正しく選択可能とすることを目的とする。
【課題を解決するための手段】
【００１２】
態様の一例では、入力テキストデータから音素及び目標韻律が対応付けられたセグメントデータの列を抽出する抽出部と、抽出部により抽出されたセグメントデータごとに、音声コーパスから取得した音声素片がそのセグメントデータの目標韻律よりも長い継続長を有する場合に、その取得した音声素片から目標韻律の継続長より長い箇所を削除した新たな音声素片を生成する生成部と、取得した音声素片及び新たな音声素片夫々とセグメントデータとの不一致度を示す素片コストを算出し、その算出された各素片コストに基づき取得した音声素片及び新たな音声素片夫々からセグメントデータに対する音声素片候補データとなる音声素片をリストアップする素片リストアップ部と、抽出されたセグメントデータの列を構成するセグメントデータごとに、そのセグメントデータに対応する音声素片候補データと、そのセグメントデータに隣接するセグメントデータに対応する音声素片候補データとの間の不連続性を示す接続コストを算出し、その算出された接続コスト及び隣接する音声素片候補データ夫々の素片コストに基づいて、音声素片候補データとしてリストアップされた音声素片のいずれかを選択して音声素片データ列を生成する音素列選択部と、生成された音声素片データ列に基づいて合成音声を生成する音声生成部と、を備える。
【発明の効果】
【００１３】
本発明によれば、音声コーパスから最適な音声素片を正しく選択可能とすることが可能となる。
【図面の簡単な説明】
【００１４】
【図１】本発明による音声合成装置の実施形態のブロック図である。
【図２】波形選択部のブロック図である。
【図３】音素列コスト、韻律コスト、および接続コストの説明図である。
【図４】本実施形態の説明図である。
【図５】音声合成装置をソフトウェア処理として実現できるコンピュータのハードウェア構成例を示す図である。
【図６】制御変数のデータ構成例を示す図である。
【図７】セグメントデータのデータ構成例を示す図である。
【図８】韻律データのデータ構成例を示す図である。
【図９】素片候補データのデータ構成例を示す図である。
【図１０】音声辞書データのデータ構成例を示す図である。
【図１１】素片データのデータ構成例を示す図である。
【図１２】音素データのデータ構成例を示す図である。
【図１３】特徴量ベクトルデータのデータ構成例を示す図である。
【図１４】素片選定処理の例を示すフローチャートである。
【図１５】最良の素片候補データの選択動作の説明図である。
【図１６】素片リストアップ処理の例を示すフローチャート（その１）である。
【図１７】素片リストアップ処理の例を示すフローチャート（その２）である。
【図１８】素片コスト計算＆候補追加処理の例を示すフローチャートである。
【図１９】音素列選択処理の例を示すフローチャートである。
【発明を実施するための形態】
【００１５】
以下、本発明を実施するための形態について図面を参照しながら詳細に説明する。
【００１６】
図１は、本発明による音声合成装置１００の実施形態のブロック図であり、テキスト入力部１０１、形態素解析部１０２、韻律予測部１０３、韻律辞書１０４、波形選択部１０５、音声辞書１０６、および波形合成部１０７を備える。
【００１７】
テキスト入力部１０１は、入力テキストデータを入力する。
【００１８】
形態素解析部１０２は、テキスト入力部１０１が入力した入力テキストデータに対して形態素解析処理を実行することにより、入力テキストデータに対応する音素列を抽出する。入力テキストデータは、音素列中の音素ごとにセグメント分けされ、各音素を示す音素データが、そのセグメント分けにより得られる合成目標を構成するセグメントデータに登録される。
【００１９】
韻律予測部１０３は、形態素解析部１０２で得られる言語情報をもとに、実際の音声データに基づく韻律に関する統計的なモデルを記憶した韻律辞書１０４を参照することにより、合成目標の音素列中の音素ごとに、声帯の基本周波数であるピッチの高さ、持続時間長、および強度（振幅）によって表される韻律を予測する。この結果、韻律予測部１０３は、音素セグメント毎に、韻律情報である目標韻律データを生成し、合成目標を構成する上記セグメントデータに登録する。
【００２０】
すなわち、入力テキストデータから合成目標として生成されるセグメントデータ列において、各セグメントデータは、音素データと目標韻律データを有する。
【００２１】
波形選択部１０５は、目標韻律データと音素データを含むセグメントデータごとに、素片コストを評価することにより、素片候補データを音声辞書１０６中の音声コーパスからリストアップする。そして、波形選択部１０５は、セグメントデータごとに、接続コストおよび素片コストを評価することにより、最良の素片候補データをリストアップした素片候補データから選択する。
【００２２】
波形合成部１０７は、波形選択部１０５がセグメントデータごとに音声辞書１０６から選択した素片データ列に基づいて、合成音声を生成し出力する。
【００２３】
図２は、図１の波形選択部１０５の詳細な構成を示すブロック図であり、波形選択部１０５は、図１の韻律予測部１０３から出力された目標韻律データ２０１、韻律入力部２０２、素片選定部２０７、および評価部２０８を備える。素片選定部２０７は、素片リストアップ部２０７ａとそこから出力された素片候補データ２０９、および音素列選択部２０７ｂを備える。評価部２０８は、素片評価部２０８ａおよび接続評価部２０８ｂを備える。
【００２４】
韻律入力部２０２は、図１の韻律予測部１０３が出力した目標韻律データ２０１を入力する。
【００２５】
素片選定部２０７において、素片リストアップ部２０７ａは、図１の韻律予測部１０３から出力されるセグメントデータごとに（以下これを「処理対象セグメントデータ」と記載する）、その処理対象セグメントデータに含まれる音素と一致する音素を有する１つ以上の素片データ（音声素片）を、音声辞書１０６中の音声コーパスから選択する（以下、この素片データを「処理対象素片データ」と記載する）。
【００２６】
図２の評価部２０８内の素片評価部２０８ａは、処理対象セグメントデータの音素とその前後２セグメントずつの各セグメントデータの音素とから構成される音素列と、処理対象素片データの音素とその前後の２つずつの各素片データの音素とから構成される音素列とを比較することにより、音素列コストを算出する。この音素列コストは、音素列の不一致度を示す。隣接するセグメントデータ間の音素列と隣接する素片データ間の音素列の一致度が高いほど音素列コストが低くなるように、音素列コストが算出される。前後の音素列が一致する素片データを選択したほうが、自然な合成音声が得られるからである。
【００２７】
図３に示されるctxt_distanceが、音素列コストを示している。図３において、segmentk-2, segmentk-1, segmentk, segmentk+1, segmentk+2は、入力テキストデータに対応する合成目標を構成するセグメントデータの離散時系列を示しており、segmentkが処理対象セグメントデータであるとする。unitu-2, unitu-1, unitu, unitu+1, unitu+2は、音声辞書１０６の音声コーパス中のある位置から切り出された素片データの離散時系列を示しており、unituが処理対象素片データであるとする。処理対象セグメントデータsegmentkにおける処理対象素片データunituに対する音素列コストctxt_distanceは、処理対象セグメントデータsegmentkと処理対象素片データunituのそれぞれを中心とする、前後２つずつと自身を含む計５つの連続する音素列同士（図３の「●」で示される）の不一致度として、算出される。
【００２８】
図２において、素片リストアップ部２０７ａは、素片評価部２０８ａに対して、処理対象素片データの韻律データ（以下「素片韻律データ」と記載する）と処理対象セグメントデータの目標韻律データ２０１との間の韻律コストを算出させ評価させる。具体的には、素片評価部２０８ａは、処理対象セグメントデータの目標韻律データ２０１と処理対象素片データの素片韻律データとの差に基づいて、韻律コストを算出する。韻律コストは、目標韻律データ２０１と素片韻律データの距離を示す。図３に示されるpros_distanceが、韻律コストを示しており、処理対象セグメントデータsegmentkの目標韻律データ２０１と、処理対象素片データunituの素片韻律データとの差に基づいて算出される。
【００２９】
ここで、素片リストアップ部２０７ａは、処理対象セグメントデータごとに、音声コーパスから取得した処理対象素片データが処理対象セグメントデータの目標韻律データ２０１よりも長い継続長を有する場合に、その取得した処理対象素片データから目標韻律データ２０１の継続長よりも長い箇所を削除した新たな素片データを生成し、取得した処理対象素片データおよび新たな素片データ夫々と処理対象セグメントデータとの不一致度を示す素片コストを算出し、その算出された各素片コストに基づいて、取得した処理対象素片データおよび新たな素片データ夫々を処理対象セグメントデータに対する処理対象素片候補データとしてリストアップする。具体的には、第１のパターンとして、図４（ａ）に示されるように、取得した処理対象素片データunituから目標韻律データsegmentkの継続長よりも長い先頭箇所４０１を削除して切り出した新たな音声素片が生成されて、リストアップされる。第２のパターンとして、図４（ｂ）に示されるように、取得した処理対象素片データunituから目標韻律データsegmentkの継続長よりも長い末尾箇所４０２を削除して切り出した新たな音声素片が生成されてリストアップされる。第３のパターンとして、図４（ｃ）に示されるように、取得した処理対象素片データunituから目標韻律データsegmentkの継続長よりも長い先頭箇所４０３および末尾箇所４０４を均等に削除して切り出した新たな音声素片が生成されてリストアップされる。上記３つのパターンに加えて、音声コーパスから取得された元の処理対象素片データもリストアップされる。
【００３０】
素片評価部２０８ａは、音素列コストと韻律コストとの重み付け和のコスト値を、現在の切り出し区間および上述の３つのパターンの切り出し区間の各素片データに対応する素片コストとして算出する。このようにして得られる音素列コスト、韻律コスト、および素片コストの値は、各素片データの切り出し先頭位置２０２ｓ（後述する図９のtop_shift）と切り出し終了位置２０２ｅ（後述する図９のtail_shift）の情報とともに、素片候補データ２０９（後述する図９のcandidate[0]等）としてメモリに記録される。
【００３１】
このとき、音声コーパスから取得した処理対象素片データが処理対象セグメントデータの目標韻律データ２０１よりも長い継続長を有する場合には、素片リストアップ部２０７ａが音声コーパスから取得した１つの処理対象素片データあたり、その元の処理対象素片候補データ２０９と、図４（ａ）、（ｂ）、および（ｃ）で示される３つのパターンの新たに生成された素片候補データ２０９の、合計４つの素片候補データ２０９が出力されることになる。
【００３２】
素片リストアップ部２０７ａは、素片評価部２０８ａが評価した素片コストが低い順に、素片候補データ２０９を並び替えて、処理対象セグメントデータとリンクさせて出力する。
【００３３】
音素列選択部２０７ｂは、セグメントデータごとに（処理対象セグメントデータに対して）リストアップされている各素片候補データ２０９と、そのセグメントデータの１つ前のセグメントデータ（以下「前方セグメントデータ」と記載する）に対してリストアップされている各素片候補データ２０９（以下「前方素片候補データ２０９」と記載する）の２つの素片候補データ間の音響パラメータの不連続性を示す接続コスト（図３のcont_distance）を算出し、２つの素片候補データの素片コストを再度算出して評価し、最良の素片候補データを選択して素片データ列を生成し、波形合成部１０７へ出力する。
【００３４】
図５は、図１の音声合成装置１００をソフトウェア処理として実現できるコンピュータのハードウェア構成例を示す図である。図５に示されるコンピュータは、ＣＰＵ５０１、ＲＯＭ（リードオンリーメモリ：読出し専用メモリ）５０２、ＲＡＭ（ランダムアクセスメモリ）５０３、入力装置５０４、出力装置５０５、外部記憶装置５０６、可搬記録媒体５１０が挿入される可搬記録媒体駆動装置５０７、及び通信インタフェース５０８を有し、これらがバス５０９によって相互に接続された構成を有する。同図に示される構成は上記システムを実現できるコンピュータの一例であり、そのようなコンピュータはこの構成に限定されるものではない。
【００３５】
ＲＯＭ５０２は、コンピュータを制御する音声合成プログラムを含む各プログラムを記憶するメモリである。ＲＡＭ５０３は、各プログラムの実行時に、ＲＯＭ５０２に記憶されているプログラム又はデータを一時的に格納するメモリである。
【００３６】
外部記憶装置５０６は、例えばＳＳＤ（ソリッドステートドライブ）記憶装置またはハードディスク記憶装置であり、入力テキストデータや合成音声データの保存に用いられる。
【００３７】
ＣＰＵ５０１は、各プログラムを、ＲＯＭ５０２からＲＡＭ５０３に読み出して実行することにより、当該コンピュータ全体の制御を行う。
【００３８】
入力装置５０４は、ユーザによるキーボードやマウス等による入力操作を検出し、その検出結果をＣＰＵ５０１に通知する。また、入力装置５０４は、図１のテキスト入力部１０１の機能を実行して入力テキストデータを外部から入力し、ＲＡＭ５０３または外部記憶装置５０６に記憶させる。
【００３９】
出力装置５０５は、ＣＰＵ５０１の制御によって送られてくるデータを表示装置や印刷装置に出力する。また、出力装置５０５は、図１の波形合成部１０７が外部記憶装置５０６またはＲＡＭ５０３に出力した合成音声データを、音声として放音する。
【００４０】
可搬記録媒体駆動装置５０７は、光ディスクやＳＤＲＡＭ、コンパクトフラッシュ等の可搬記録媒体５１０を収容するもので、外部記憶装置５０６の補助の役割を有する。
【００４１】
通信インターフェース５０８は、例えばＬＡＮ（ローカルエリアネットワーク）又はＷＡＮ（ワイドエリアネットワーク）の通信回線を接続するための装置である。
【００４２】
本実施形態によるシステムは、図１および図２の各処理部の機能を搭載した音声合成プログラムを、ＲＯＭ５０２からＲＡＭ５０３に読み出してＣＰＵ５０１が実行することで実現される。そのプログラムは、例えば外部記憶装置５０６や可搬記録媒体５１０に記録して配布してもよく、或いは通信インタフェース５０８によりネットワークから取得できるようにしてもよい。
【００４３】
次に、図５のコンピュータが、図１および図２の機能を有する音声合成装置１００として動作するために、ＲＡＭ５０３または外部記憶装置５０６上に保持する各種データについて説明する。
【００４４】
図６は、ＲＡＭ５０３に保持される制御変数WavSelのデータ構成例を示す図である。制御変数WavSelは、unitdb、seg_count、segmentの各変数データを保持する。unitdbは、外部記憶装置５０６上の音声辞書１０６に記憶される音声辞書データへのポインタを保持する。seg_countは、セグメントデータの総数を保持する。segmentは、最初のセグメントデータ（後述する図７のsegment[0]の先頭アドレス）へのポインタを保持する。
【００４５】
図７は、図６の制御変数WavSel内のsegmentポインタから参照されＲＡＭ５０３または外部記憶装置５０６に保持されるセグメントデータsegment[0]〜segment[seg_count]のデータ構成例を示す図である。各セグメントデータは、入力テキストデータを図１の形態素解析部１０２で形態素解析して得られる合計seg_count個（制御変数WavSelのseg_countに保持される個数）の音素ごとに、図１の韻律予測部１０３によって、segment[0],segment[1],・・・,segment[seg_count-1]として得られる。セグメントデータの記憶アドレスは、制御変数WavSelのsegmentによって示される。各セグメントデータsegment[i]（i=0,・・・,seg_count-1）は、seg_id、phone_id、target_prosody、candidate、best_cand、prev、nextの各変数データを保持する。seg_idは、セグメントＩＤ（識別子）を保持する。phone_idは、音素ＩＤを保持する。target_prosodyは、ＲＡＭ５０３または外部記憶装置５０６に保持される目標韻律データ２０１の先頭へのポインタを保持する。candidateは、最初の素片候補データ２０９（後述する図９のcandidate[0]の先頭アドレス）へのポインタを保持する。best_candは、図２の音素列選択部２０７ｂに対応する処理によって現在のセグメントデータに対応してする選択される最良の素片候補データ２０９（後述する図９のcandidate[0]〜candidate[N]、・・・のいずれかの先頭アドレス）へのポインタを保持する。prevは１つ手前のセグメントデータへのポインタ、nextは１つ後ろのセグメントデータへのポインタを保持する。現在のセグメントデータが例えばsegmen[1]であれば、prevはsegment[0]の先頭アドレスを保持し、nextはsegment[2]の先頭アドレスを保持する。また、現在のセグメントデータが例えば先頭データsegment[0]であれば、prevは未定義値であるNULL値を保持する。現在のセグメントデータが例えば末端データsegment[seg_count]であれば、nextはNULL値を保持する。
【００４６】
図８は、図７の各セグメントデータ内のtarget_prosodyポインタまたは後述する図１１の各素片データ内のprosodyポインタから参照されＲＡＭ５０３または外部記憶装置５０６に記憶される韻律データprosody[0],prosody[1],・・・,prosody[N],・・・のデータ構成例を示す図である。各韻律データprosody[i]（i=0,・・・,N,・・・）は、time,pitch,power,prev,nextの各変数データを保持する。timeは、韻律が発生する時刻を保持する。pitchは、韻律の音高（ピッチ周波数）を保持する。powerは、韻律の強度を保持する。prevは１つ手前の韻律データへのポインタ、nextは１つ後ろの韻律データへのポインタを保持する。現在の韻律データが、先頭データであればprevはNULL値を保持し、末端データであればnextはNULL値を保持する。
【００４７】
図９は、図７のセグメントデータ内のtarget_prosodyポインタから参照されＲＡＭ５０３または外部記憶装置５０６に記憶される図２の素片候補データ２０９である素片候補データcandidate[0],candidate[1],・・・,candidate[N],・・・のデータ構成例を示す図である。各素片候補データcandidate[i]（i=0,・・・,N,・・・）は、図２のリストアップ部で生成され、unit_id,ctxt_distance,pros_distance,unit_distance,cont_distance,prev_total_cost,total_cost,best_cand,top_shift,tail_shift,prev,nextの各変数データを保持する。unit_idは、音声辞書１０６内の素片データを識別するための素片ＩＤ（図１２参照）を保持し、図２の素片リストアップ部２０７ａによりセットされる。ctxt_distanceは、前述した音素列コスト(音素列の不一致度)を保持し、図２の素片評価部２０８ａによって算出されセットされる。pros_distanceは、前述した韻律コスト(目標韻律データ２０１と素片韻律データの距離)を保持し、図２の素片評価部２０８ａによって算出されセットされる。unit_distanceは、音素列コストと韻律コストの重み付け和である前述した素片コストを保持し、図２の素片評価部２０８ａによって算出されセットされる。cont_distanceは、前述した接続コスト(音素接続点での特徴量距離)を保持し、図２の接続評価部２０８ｂによって算出されセットされる。prev_total_costは、先頭のセグメントデータからこの素片候補データが属するセグメントデータの１つ前のセグメントデータ（前方セグメントデータ）までに確定している、コスト合計を保持する。total_costは、先頭のセグメントデータからこの素片候補データが属するセグメントデータまでに確定したトータルコストを保持し、前述したように図２の音素列選択部２０７ｂにより算出されセットされる。best_candは、この素片候補データと接続する最良の前方素片候補データへのポインタを保持し、前述した音素列選択部２０７ｂによって算出されセットされる。ここで、最良の前方素片候補データは、best_candが含まれる素片候補データ（処理対象素片候補データ）が属するセグメントデータ（処理対象セグメントデータ）の１つ手前のセグメントデータ（前方セグメントデータ）に属する素片候補データ（前方素片候補データ）であって、その前方素片候補データで確定しているトータルコストと、処理対象素片候補データとの間の接続コストとの、重み付き和のコスト値が、最も小さい（最良の）前方素片候補データである。top_shiftは、この素片候補データ２０９が選択されるときの切り出し先頭位置の移動時間であり、後述する素片リストアップ処理（図１７）によりセットされる。この移動時間の起点は、unit_idが示す図１１の素片データ中の開始時刻startである。tail_shiftは、この素片候補データ２０９が選択されるときの切り出し終了位置の移動時間１であり、後述する素片リストアップ処理（図１７）によりセットされる。この移動時間の起点は、unit_idが示す図１１の素片データ中の（開始時刻start＋継続時間duration）である。prevは１つ手前の素片候補データへのポインタ、nextは１つ後ろの素片候補データへのポインタを保持する。現在の素片候補データが、先頭データであればprevはNULL値を保持し、末端データであればnextはNULL値を保持する。
【００４８】
図１０は、図１の音声辞書１０６を構成するＲＡＭ５０３または外部記憶装置５０６に記憶される音声辞書データunitdbのデータ構成例を示す図であり、図６の制御変数WavSelのunitdbポインタから参照される。音声辞書データunitdbは、phone_count、phoneme、unit_count、unit、fval_countの各変数データを保持する。phone_countは、この音声辞書データunitdbで定義されている音素数を保持する。phonemeは、先頭の音素データ（図１２のphoneme[0]の先頭アドレス）へのポインタを保持する。unit_countは、この音声辞書データunitdbが搭載する素片データの数を保持する。unitは、この音声辞書データunitdbが搭載する先頭の素片データ（図１２のunit[0]の先頭アドレス）へのポインタを保持する。fval_countは、特徴量ベクトル数を保持する。
【００４９】
図１１は、図１の音声辞書１０６を構成するＲＡＭ５０３または外部記憶装置５０６に記憶される素片データunit[0]〜unit[unit_count-1]のデータ構成例を示す図であり、図１０の音声辞書データunitdbのunitポインタから参照される。音声辞書１０６への搭載素片数unit_countは、図１０の音声辞書データunitdbのunit_countデータとして登録される。各素片データunit[i]（i=0,・・・,unit_count-1）は、unit_id, phone_id,start,duration,prosody,prev,nextの各変数データと、featvalue[0]〜featvalue[fval_count-1]の各配列変数データを保持する。unit_idは、素片データを識別するための素片ＩＤを保持する。phone_idは、この素片データに対応付けられる音素を図１２で後述する音素データから特定するための音素ＩＤを保持する。startはこの素片データの開始時刻を保持する。durationはこの素片データがどれだけの時間長だけ継続しているかを示す継続長を保持する。prosodyは、図７のデータ構成例を有する、ＲＡＭ５０３または外部記憶装置５０６に保持される素片韻律データの先頭へのポインタを保持する。featvalue[0]〜featvalue[fval_count-1]は、１番目からfval_count番目までの後述する図１３に示されるデータ構成例を有する特徴量ベクトルデータの先頭データへのポインタを保持する。prevは１つ手前の素片データへのポインタ、nextは１つ後ろの素片データへのポインタを保持する。現在の素片データが、先頭データであればprevはNULL値を保持し、末端データであればnextはNULL値を保持する。
【００５０】
図１２は、図１０の音声辞書データunitdb内のphonemeポインタから参照されＲＡＭ５０３または外部記憶装置５０６に記憶される音素データphoneme[0]〜phoneme[phone_count-1]のデータ構成例を示す図である。音素データの数は、音声辞書データunitdbのphone_countデータにセットされている。各音素データphoneme[i] （i=0,・・・,phone_count-1）は、phone_id,phomene,prev,nextの各変数データを保持する。phone_idは、音素を識別するための音素ＩＤを保持する。前述した図７のセグメントデータまたは前述した図１１の素片データは、その中のphone_idデータによって、図６の制御変数WavSel内のunitdb→図１０の音声辞書データunitdb内のphoneme→図１２の音素データphoneme[0]〜phoneme[phone_count-1]のうち上記phone_idの値が格納されている音素データとたどって、その音素データ内の音素名phomeneと関連付けられる。phomeneは音素名を保持する。prevは１つ手前の音素データへのポインタ、nextは１つ後ろの音素データへのポインタを保持する。現在の音素データが、先頭データであればprevはNULL値を保持し、末端データであればnextはNULL値を保持する。
【００５１】
図１３は、図１２の各素片データ内のfeatvalue[i] （i=0,・・・,fval_count-1）ポインタから参照されＲＡＭ５０３または外部記憶装置５０６に記憶される特徴量ベクトルデータfeatvalue[0],featvalue[1],・・・,featvalue[N],・・・のデータ構成例を示す図である。各特徴量ベクトルデータfeatvalue[i](i=0,・・・,N,・・・)は、time,dimension,prev,nextの各変数データと、value[0]〜value[dimension-1]の各配列変数データを保持する。timeは、その特徴量ベクトルデータに対応する時刻を保持する。dimensionは、この特徴量ベクトルデータの次元数を保持する。value[0]〜value[dimension-1]は、１番目からdimension番目までの特徴量を保持する。prevは１つ手前の特徴量ベクトルデータへのポインタ、nextは１つ後ろの特徴量ベクトルデータへのポインタを保持する。現在の特徴量ベクトルデータが、先頭データであればprevはNULL値を保持し、末端データであればnextはNULL値を保持する。この特徴量ベクトルデータは、前述したように、図２の接続評価部２０８ｂが、処理対象素片候補データ２０９と前方素片候補データ２０９との間の音素接続点での各素片データの各スペクトル包絡の距離を算出するために使用される。
【００５２】
図１４は、図２の素片選定部２０７に対応する機能を、図５のハードウェア構成例を有するコンピュータのＣＰＵ５０１が、ソフトウェアプログラムの処理により実現する場合の、素片選定処理の例を示すフローチャートである。以下に説明する処理はすべてＣＰＵ５０１が実行する処理である。
【００５３】
まず、ＲＡＭ５０３上の変数データsegprevに、未定義値NULLが格納され、変数データsegに、前述した図６のデータ構成例を有する制御変数WavSel内のsegmentデータの値が格納される（ステップＳ１４０１）。この値は、図７のデータ構成例を有するセグメントデータの最初のセグメントデータsegmen[0]の先頭アドレスへのポインタである。変数データsegは処理対象セグメントデータを示し、変数データsegprevは前方セグメントデータを示す。
【００５４】
次に、seg変数の値が未定義値NULLでないか否か、すなわち図７の全てのセグメントデータsegment[0]〜segment[seg_count]が処理されたか否かが判定される（ステップＳ１４０２）。
【００５５】
全てのセグメントデータの処理が完了しておらずseg変数の値が未定義値NULLではなくてステップＳ１４０２の判定がＹＥＳとなる間は、ステップＳ１４０５でsegprev変数にseg変数の値が格納され、seg変数が示すセグメントデータ内のnextポインタ（図７参照）が示す次のセグメントデータへのポインタ値が新たにseg変数にセットされながら、ステップＳ１４０３の素片リストアップ処理と、ステップＳ１４０４の音素列選択処理が繰り返し実行される。
【００５６】
全てのセグメントデータの処理が完了してseg変数の値が未定義値NULLとなってステップＳ１４０２の判定がＮＯとなると、segprev変数が最後に示しているセグメントデータ全体の中の後方から先頭に向かって、決定されている最良候補をたどりながら、各セグメントデータの素片データの最終選択候補を指定してゆき、素片データ列として出力される（ステップＳ１４０６）。
【００５７】
図１５は、図１４のフローチャートによって実現される最良の素片候補データの選択動作の説明図である。この図において、・・・,segmentk-2, segmentk-1, segmentk, segmentk+1, segmentk+2,・・・は、入力テキストデータに対応する合成目標を構成するセグメントデータの離散時系列を示しており、segmentkが処理対象セグメントデータであるとする。図７のセグメントデータの形式で表せば、・・・,segment[k-2],segment[k-1],segment[k],segment[k+1],segment[k+2],・・・となる。また、例えばsegment k-2に実線で接続されている・・・,candidatek-2,0, candidatek-2,1, candidatek-2,2, candidatek-2,3, candidatek-2,4,・・・は、セグメントデータsegment k-2に対してリストアップされる素片候補データ２０９を示している。同様に、例えばsegment k-1に実線で接続されているcandidatek-1,0, candidatek-1,1, candidatek-1,2, candidatek-1,3, candidatek-1,4,・・・は、セグメントデータsegment k-1に対してリストアップされる素片候補データ２０９を示している。同様に、例えばsegment kに実線で接続されているcandidatek,0, candidatek,1, candidatek,2, candidatek,3, candidatek,4,・・・は、セグメントデータsegment kに対してリストアップされる素片候補データ２０９を示している。
【００５８】
上述の各素片候補データ２０９は、図１４のステップＳ１４０３の素片リストアップ処理によって生成される。この素片リストアップ処理は、図２の素片リストアップ部２０７ａの機能を実現している。このとき、素片リストアップ部２０７ａの説明において前述したように、例えば素片候補データcandidatek,0, candidatek,1, candidatek,2, candidatek,3, candidatek,4,・・・がリストアップされるときに、それに対応するセグメントデータsegment kとの間で素片コストが算出され、その算出された素片コストに基づいて、上記素片候補データの並び順が決定される。
【００５９】
次に、セグメントデータsegment k-2内の濃い色の素片候補データcandidatek-2,4は、その次のセグメントデータsegmentk-1内の濃い色の素片候補データcandidatek-1,1が処理対象素片候補データ２０９として実行されるときに検出される最良の素片候補データ２０９を示している。同様に、セグメントデータsegment k-1内の濃い色の素片候補データcandidatek-2,1は、その次のセグメントデータsegment k内の濃い色の素片候補データcandidatek,2が処理対象素片候補データ２０９として実行されるときに検出される最良の素片候補データ２０９を示している。いま、処理対象セグメントデータをsegment kとし、処理対象素片候補データ２０９をcandidatek,2とすれば、前方セグメントデータsegment k-1内の各素片候補データ（前方素片候補データ）candidatek-1,0, candidatek-1,1, candidatek-1,2, candidatek-1,3, candidatek-1,4,・・・との間で、接続コストが計算される。そして、そのように計算された接続コストと２つの素片コストと、前方素片候補データ２０９に対して確定しているさらにその１つ前方の最良の素片候補データ２０９までのトータルコストの重み付け和が計算され、その結果値が処理対象素片候補データcandidatek,2に対するトータルコストとされる。この計算が、処理対象素片候補データcandidatek,2において、すべての前方素片候補データcandidatek-1,0, candidatek-1,1, candidatek-1,2, candidatek-1,3, candidatek-1,4に対して実行され、トータルコストが最も小さい前方素片候補データ２０９が、処理対象素片候補データcandidatek,2に対する最良の前方素片候補データ２０９として決定される。例えば、前方セグメントデータsegment k-1内の濃い色の前方素片候補データcandidatek-1,1が、処理対象素片候補データcandidatek,2に対する最良の前方素片候補データ２０９として決定される。また、処理対象素片候補データcandidatek,2と最良の前方素片候補データcandidatek-1,1間の接続コスト１５０２kが計算される。そして、各素片コスト１５０１kと１５０１k-1と接続コスト１５０２kの重み付け和と、最良の前方素片候補データcandidatek-1,1に対して確定しているトータルコストの和が、処理対象素片候補データcandidatek,2に対するトータルコストとして計算される。
【００６０】
以上のように、本実施形態では、処理対象セグメントデータと前方セグメントデータの組が、セグメントデータの先頭から末尾に向かって順次進められながら、処理対象セグメントデータ内でリストアップされた素片候補データ２０９（処理対象素片候補データ２０９）ごとに、先頭から現在の処理対象セグメントデータ内の現在の処理対象素片候補データ２０９に至るセグメントデータごとの最良の素片候補データ２０９の経路が探索される（ステップＳ１４０２からＳ１４０５の繰返し処理）。また、現在の処理対象セグメントデータ内でそのように探索された素片候補データ２０９ごとのトータルコストが比較され、処理対象セグメントデータ内での最良の素片候補データ２０９が決定される。そして、末尾のセグメントデータまで処理が完了すると（ステップＳ１４０２の判定がＮＯ）、末尾のセグメントデータから先頭のセグメントデータに向かって最良の前方素片候補データ２０９を順次たどる探索処理が実行され、各素片データが決定されてゆく。最後に探索処理が先頭のセグメントデータに到達すると、全てのセグメントデータに対応する素片データが決定されるので、それらが素片データ列として図２の波形合成部１０７に出力される。このようにして、本実施形態では、いわゆるビタビアルゴリズムにより、最適な素片データ列を出力することができる。
【００６１】
図１６および図１７は、図１５のステップＳ１４０３の素片リストアップ処理の詳細例を示すフローチャートであり、図２の素片リストアップ部２０７ａの機能を実現している。
【００６２】
まず、ＲＡＭ５０３上の変数uに、音声辞書１０６内の音声コーパスから先頭の素片データへのポインタが格納される（ステップＳ１６０１）。このポインタ値は、図１０の音声辞書データunitdbのunitポインタ値として得ることができる。
【００６３】
次に、ステップＳ１６０２で末尾の素片データの検索が終わっていないと判定される間（判定がＹＥＳの間）、ステップＳ１６０８で次の素片データへのポインタが変数uに格納されながら、各素片データごとに、以下のステップＳ１６０３からＳ１６２０までの一連の処理が実行される。ここで、次の素片データへのポインタは、変数uが示す図１１の素片データ内のnextポインタとして得られる。また、ステップＳ１６０２の判定は、ステップＳ１６０８でセットされたnextポインタの値がNULLであるか否かを判定することにより実現できる。
【００６４】
変数uによって参照される素片データとその前後２つずつの素片データの音素ラベル列と、変数segによって参照されるセグメントデータとその前後２つずつのセグメントデータの音素ラベル列とが比較され、音素列コストが算出され、ＲＡＭ５０３上の変数contextに格納される（ステップＳ１６０３）。この算出方法については、図３の説明で前述した通りである。なお、変数uによって参照される素片データの音素ラベルは、変数uによって参照される図９の素片データ中の音素ＩＤデータphone_idから図１２の音素データ中の音素名データphomeneを参照することにより得られる。また、その前後２つずつの素片データの音素ラベル列は、変数uによって参照される図９の素片データ中のprevポインタおよびnextポインタを順次２つずつたどった先の素片データから、上記と同様にして得られる。変数segによって参照されるセグメントデータの音素ラベルは、変数segによって参照される図７のセグメントデータ中の音素ＩＤデータphone_idから図１２の音素データ中の音素名データphomeneを参照することにより得られる。また、その前後２つずつのセグメントデータの音素ラベル列は、変数segによって参照される図７のセグメントデータ中のprevポインタおよびnextポインタを順次２つずつたどった先のセグメントデータから、上記と同様にして得られる。
【００６５】
次に、ＲＡＭ５０３上の図９の素片候補データ２０９の末尾に新規選択候補のエントリcandidate[i]（iは末尾の次に追加されるエントリの番号）が生成され、そのエントリに素片ID unit_id が新規に付与され、ステップＳ１６０３でセットされたＲＡＭ５０３上の変数contextの値が音素列コストctxt_distanceとして代入される（ステップＳ１６０４）。
【００６６】
次に、ステップＳ１６０４でＲＡＭ５０３上に生成された図９の素片候補データ２０９のエントリの切り出し先頭位置top_shiftおよび切り出し終了位置tail_shiftに、それぞれ値０が代入される（ステップＳ１６０５）。切り出し先頭位置および切り出し終了位置は、図４に示される３つのパターンの素片データが登録されるときの切り出し区間の先頭位置と終了位置を示すものであるが、ステップＳ１６０３からステップＳ１６０６で処理しているのは音声コーパスから取得された素片データそのものの登録処理であり、切り出しは行われないため、それぞれの値は０とされる。
【００６７】
次に、ステップＳ１６０３〜Ｓ１６０５で生成された素片候補データ２０９のエントリに対して、さらに韻律コストおよび素片コストが計算され、図１４のステップＳ１４０５でＲＡＭ５０３上の変数segに格納されている処理対象セグメントのエントリに登録される（ステップＳ１６０６）。この処理の詳細については、図１８のフローチャートを用いて後述する。
【００６８】
次に、音声コーパスから取得されている現在の処理対象素片データが、図１４のステップＳ１４０５でＲＡＭ５０３上の変数segに格納されている処理対象セグメントデータの目標韻律データ２０１よりも長い継続長を有するか否かが判定される（ステップＳ１６０７）。処理対象素片データの韻律データ長は、図１１の該当する素片データエントリ内のprosodyポインタから参照される韻律データの長さとして取得できる。処理対象セグメントデータの目標韻律データ２０１の長さは、図７の該当するセグメントデータエントリ内のtarget_prosodyポインタから参照される韻律データの長さとして取得できる。
【００６９】
ステップＳ１６０７の判定がＮＯならば、次の素片データへのポインタが変数uに格納されて（ステップＳ１６０８）、ステップＳ１６０２の処理に戻る。
【００７０】
ステップＳ１６０７の判定がＹＥＳならば、図１７のフローチャートの処理に進み、前述した図４の（ａ）の第１のパターンの素片データのリストアップ処理（ステップＳ１６０９〜Ｓ１６１１）、図４の（ｂ）の第２のパターンの素片データのリストアップ処理（ステップＳ１６１２〜Ｓ１６１４）、および図４の（ｃ）の第３のパターンの素片データのリストアップ処理（ステップＳ１６１５〜Ｓ１６２０）が実行される。
【００７１】
まず、第１のパターン（図４（ａ））の素片データの登録として、図１６のステップＳ１６０４と同様に、ＲＡＭ５０３上の図９の素片候補データ２０９の末尾に新規選択候補のエントリcandidate[i]が生成され、そのエントリに素片ID unit_id が新規に付与され、ステップＳ１６０３でセットされたＲＡＭ５０３上の変数contextの値が音素列コストctxt_distanceとして代入される（ステップＳ１６０９）。
【００７２】
次に、ステップＳ１６０９でＲＡＭ５０３上に生成された図９の素片候補データ２０９のエントリの切り出し先頭位置top_shiftに、図１６のステップＳ１６０７で計算された処理対象素片データの韻律データ長から処理対象セグメントデータの韻律データ長を減算して得られる継続長の差の値（図４（ａ）の４０１に対応する値）が代入される（ステップＳ１６１０）。なお、切り出し終了位置tail_shiftには０が代入される。
【００７３】
次に、ステップＳ１６０９とＳ１６１０で生成された素片候補データ２０９のエントリに対して、さらに韻律コストおよび素片コストが計算され、図１４のステップＳ１４０５でＲＡＭ５０３上の変数segに格納されている処理対象セグメントのエントリに登録される（ステップＳ１６１１）。この処理の詳細については、図１８のフローチャートを用いて後述する。
【００７４】
続いて、第２のパターン（図４（ｂ））の素片データの登録として、図１６のステップＳ１６０４と同様に、ＲＡＭ５０３上の図９の素片候補データ２０９の末尾に新規選択候補のエントリcandidate[i]が生成され、そのエントリに素片ID unit_id が新規に付与され、ステップＳ１６０３でセットされたＲＡＭ５０３上の変数contextの値が音素列コストctxt_distanceとして代入される（ステップＳ１６１２）。
【００７５】
次に、ステップＳ１６１２でＲＡＭ５０３上に生成された図９の素片候補データ２０９のエントリの切り出し終了位置tail_shiftに、図１６のステップＳ１６０７で計算された処理対象素片データの韻律データ長から処理対象セグメントデータの韻律データ長を減算して得られる継続長の差の値（図４（ｂ）の４０２に対応する値）が代入される（ステップＳ１６１３）。なお、切り出し先頭位置top_shiftには０が代入される。
【００７６】
次に、ステップＳ１６１２とＳ１６１３で生成された素片候補データ２０９のエントリに対して、さらに韻律コストおよび素片コストが計算され、図１４のステップＳ１４０５でＲＡＭ５０３上の変数segに格納されている処理対象セグメントのエントリに登録される（ステップＳ１６１４）。この処理の詳細については、図１８のフローチャートを用いて後述する。
【００７７】
最後に、第３のパターン（図４（ｃ））の素片データの登録として、図１６のステップＳ１６０４と同様に、ＲＡＭ５０３上の図９の素片候補データ２０９の末尾に新規選択候補のエントリcandidate[i]が生成され、そのエントリに素片ID unit_id が新規に付与され、ステップＳ１６０３でセットされたＲＡＭ５０３上の変数contextの値が音素列コストctxt_distanceとして代入される（ステップＳ１６１５）。
【００７８】
次に、図１６のステップＳ１６０７で計算された処理対象素片データの韻律データ長から処理対象セグメントデータの韻律データ長を減算して得られる継続長の差の値を２で割って得られる値（図４（ｃ）の４０３に対応する値）が、ＲＡＭ５０３上の変数shiftに登録される（ステップＳ１６１６）。
【００７９】
次に、ステップＳ１６１５でＲＡＭ５０３上に生成された図９の素片候補データ２０９のエントリの切り出し先頭位置top_shiftに、ステップＳ１６１６で変数shiftに得られた値が代入される（ステップＳ１６１７）。
【００８０】
さらに、図１６のステップＳ１６０７で計算された処理対象素片データの韻律データ長から処理対象セグメントデータの韻律データ長を減算して得られる継続長の差の値から、さらにステップＳ１６１６で変数shiftに得られた値を減算して得られる値が、変数shiftに上書きされる（ステップＳ１６１８）。ここで、ステップＳ１６１６で得られる変数shiftの値をそのまま使わないのは、残りのわずかな誤差を吸収するためである。
【００８１】
そして、ステップＳ１６１５でＲＡＭ５０３上に生成された図９の素片候補データ２０９のエントリの切り出し終了位置tail_shiftに、ステップＳ１６１８で変数shiftに得られた値が代入される（ステップＳ１６１９）。
【００８２】
最後に、ステップＳ１６１５からＳ１６１９で生成された素片候補データ２０９のエントリに対して、さらに韻律コストおよび素片コストが計算され、図１４のステップＳ１４０５でＲＡＭ５０３上の変数segに格納されている処理対象セグメントのエントリに登録される（ステップＳ１６２０）。この処理の詳細については、図１８のフローチャートを用いて後述する。
【００８３】
以上の図１７のフローチャートで例示される処理の後、図１６のステップＳ１６０８の処理に移行し、次の素片データへのポインタが変数uに格納されて（ステップＳ１６０８）、ステップＳ１６０２の処理に戻る。
【００８４】
図１８は、図１６のステップＳ１６０６、図１７のステップＳ１６１１、Ｓ１６１４、またはＳ１６２０のそれぞれで実行される素片コスト計算＆候補追加処理の詳細を示すフローチャートである。
【００８５】
まず、処理対象素片データ（音素片）と処理対象セグメントデータの目標韻律データ２０１の韻律遷移が比較され、韻律コストが算出される（ステップＳ１８０１）。具体的な処理については、図２の素片リストアップ部２０７ａの説明で前述した。そして、この韻律コストの値が、ステップＳ１６０４、Ｓ１６０９、Ｓ１６１２、またはＳ１６１５でＲＡＭ５０３上に生成された図９の素片候補データ２０９のエントリの韻律コストpros_distanceとして登録される。
【００８６】
次に、ステップＳ１６０３で算出された音素列コストとステップＳ１８０１で算出された韻律コストとの重み付け加算して得られるコスト値が、素片コストとして算出される。そして、その素片コストの値が、ステップＳ１６０４、Ｓ１６０９、Ｓ１６１２、またはＳ１６１５でＲＡＭ５０３上に生成された図９の素片候補データ２０９のエントリの素片コストunit_distanceとして登録される（ステップＳ１８０２）。
【００８７】
最後に、図１４のステップＳ１４０５でＲＡＭ５０３上の変数segに格納されている処理対象セグメントのエントリに、ステップＳ１６０４、Ｓ１６０９、Ｓ１６１２、またはＳ１６１５でＲＡＭ５０３上に生成された図９の素片候補データ２０９のエントリがリンクされて登録される（ステップＳ１８０３）。このリンクは、図７のセグメントデータのエントリのcandidateポインタから、図９の素片候補データ２０９のエントリのunit_idがリンクされ、さらにその素片候補データ２０９のエントリのnextポインタによって、次の素片候補データ２０９のエントリのunit_idがリンクされる。このとき、ステップＳ１８０２で算出された素片コストの低い順にリンクが張られる。なおこのとき、候補数や素片コスト値などで、追加の可否に制限をかけてもよい。
【００８８】
図１６および図１７において、変数uの値が更新されていった結果、末尾の音声素片の検索が終了しステップＳ１６０２の判定がＮＯになると、図１６および図１７のフローチャートの処理が終了して図１４のステップＳ１４０３の１回の素片リストアップ処理が終了する。
【００８９】
図１９は、図１４のステップＳ１４０４の音素列選択処理の詳細例を示すフローチャートであり、図２の音素列選択部２０７ｂの機能を実現している。
【００９０】
まず、変数segが参照する図７のセグメントデータ中の最良の素片候補データ２０９へのポインタseg.best_candが初期化（クリア）される（ステップＳ１９０１）。
【００９１】
次に、ＲＡＭ５０３上の変数ctに、変数segが示す現在のセグメントデータ（処理対象セグメントデータ）に対してリストアップされている素片候補データ２０９の先頭データのアドレスがセットされる（ステップＳ１９０２）。具体的には、このアドレスは、変数segが参照する図７のセグメントデータ中の最初の素片候補データへのポインタcandidateの値として得られる。
【００９２】
次に、ステップＳ１９０３で素片候補データ２０９の検索が終わっていないと判定される間（判定がＹＥＳの間）、ステップＳ１９１５で次の素片候補データ２０９へのポインタが変数ctに格納されながら、各素片候補データ２０９（処理対象素片候補データ２０９）ごとに、以下のステップＳ１９０４からＳ１９１４までの一連の処理が実行される。ここで、次の処理対象素片候補データ２０９へのポインタは、変数ctが示す図９の素片候補データ２０９内のnextポインタとして得られる。また、ステップＳ１９０３の判定は、ステップＳ１９１５でセットされたnextポインタの値がNULLであるか否かを判定することにより実現できる。
【００９３】
まず、ＲＡＭ５０３上の変数cpに、処理対象セグメントデータの前方セグメントデータに対してリストアップされている素片候補データ２０９（前方素片候補データ２０９）の先頭データのアドレスがセットされる（ステップＳ１９０４）。具体的には、このアドレスは、変数segが参照する図７のセグメントデータ中のprevポインタによって参照される図７のセグメントデータ中の最初の素片候補データへのポインタcandidateの値として得られる。
【００９４】
続いて、変数ctによって参照される構造体データ中のbest_candポインタ（図９の処理対象素片候補データ２０９を参照）が初期化（クリア）される（ステップＳ１９０５）。best_candは、処理対象素片候補データ２０９と接続する最良の前方素片候補データ２０９を参照するポインタである。
【００９５】
その後、ステップＳ１９０６で前方素片候補データ２０９の検索が終わっていないと判定される間（判定がＹＥＳの間）、ステップＳ１９１１で次の前方素片候補データ２０９へのポインタが変数cpに格納されながら、各前方素片候補データ２０９ごとに、以下のステップＳ１９０７からＳ１９１０までの一連の処理が実行される。ここで、次の前方素片候補データ２０９へのポインタは、変数cpが示す図９の素片候補データ２０９内のnextポインタとして得られる。また、ステップＳ１９０６の判定は、ステップＳ１９１１でセットされたnextポインタの値がNULLであるか否かを判定することにより実現できる。
【００９６】
まず、変数ctが示す処理対象素片候補データ２０９と変数cpが示す前方素片候補データ２０９の接続コストが算出される（ステップＳ１９０７）。具体的には、上記各素片候補データ２０９に対応する特徴量ベクトルデータが、図９のunit_idデータ→図１１のfeatvalue[0]〜featvalue[fval_count-1]とたどられて参照され、切り出し先頭位置および切り出し終了位置に対応する特徴量ベクトルデータが抽出される。切り出し先頭位置および切り出し終了位置は、図９のエントリのtop_shiftおよびtail_shiftのデータとして得られる。そして、これらの特徴量ベクトルデータの組によって算出される各素片データの各スペクトル包絡の距離（例えばメルケプストラムのユークリッド距離）が接続コストとして算出される。
【００９７】
次に、図９に示される前方素片候補データ２０９中の確定している前方までのコスト合計cp.total_costと、ステップＳ１９０７で算出された接続コストに重み付け係数を乗じた結果の和が算出される。そして、その加算結果が、ＲＡＭ５０３上の変数ctが示す処理対象素片候補データ２０９の構造体内のtotal_cost値（ct.total_cost）として保存される（以上、ステップＳ１９０８）。
【００９８】
続いて、上述のct.total_cost値が、変数ctが示す元のＲＡＭ５０３上の処理対象素片候補データ２０９内の図９に示されるtotal_cost値よりも小さいか否か、すなわち今回のct.total_cost値が最良であるか否かが判定される（ステップＳ１９０９）。ステップＳ１９０９の判定がＹＥＳの場合には、変数ctが示す元の処理対象素片候補データ２０９内の図９に示される全てのメンバー変数値が、変数ctが示す構造体の全てのメンバー変数値で置き換えられる（ステップＳ１９１０）。ステップＳ１９０９の判定がＮＯの場合には、ステップＳ１９１０の置換えは実行されない。
【００９９】
その後、次の前方素片候補データ２０９へのポインタnextが変数cpに格納され、ステップＳ１９０６の処理に戻り、ステップＳ１９０６での判定の後、上述したステップＳ１９０７からＳ１９１０までの一連の処理が繰り返し実行される。
【０１００】
変数cpの値が更新されていった結果、末尾の前方素片候補データ２０９の検索が終了しステップＳ１９０６の判定がＮＯになると、まず、変数ctが示す前方最良情報が、ステップＳ１９１０でセットされている最良情報保存用変数のデータに書き換えられる（ステップＳ１９１２）。
【０１０１】
その後、変数ctが示す処理対象素片候補データ２０９に新たにセットされたtotal_cost値が、変数segが示す図７のセグメントデータ中のbest_candポインタが示す図９の素片候補データ２０９中のtotal_cost値よりも小さいか否かが判定される（ステップＳ１９１３）。ステップＳ１９１３の判定がＹＥＳならば、変数segが示す図７のセグメントデータ中のbest_candポインタに、変数ctの値がセットされる（ステップＳ１９１４）。ステップＳ１９１３の判定がＮＯならばステップＳ１７２４は実行されない。
【０１０２】
その後、次の処理対象素片候補データ２０９へのポインタが変数ctに格納されて（ステップＳ１９１５）、ステップＳ１９０３の処理に戻る。
【０１０３】
変数ctの値が更新されていった結果、末尾の処理対象素片候補データ２０９の検索が終了しステップＳ１９０３の判定がＮＯになると、図１９のフローチャートの処理が終了し、図１４のステップＳ１４０４の１回の音素列選択処理が終了する。
【０１０４】
以上一連の処理により、全てのセグメントデータの処理が完了してseg変数の値が未定義値NULLとなって図１４のステップＳ１４０２の判定がＮＯとなると、segprev変数が最後に示しているセグメントデータ中の図７のbest_candポインタが参照されることにより図９のデータが参照され、unit_idデータによって１つの素片データが決定される。その後、図９のbest_candポインタを末尾のセグメントデータから先頭のセグメントデータに向かって順次たどる探索処理が実行され、各前方セグメントデータごとに最良の前方素片候補データ中のunit_idデータが参照されて、各素片データが決定されてゆく。最後に探索処理が先頭のセグメントデータに到達すると、全てのセグメントデータに対応する素片データが決定されるので、それらが素片データ列として図２の波形合成部１０７に出力される。
【０１０５】
以上の実施形態により、指定された韻律遷移に忠実であり、かつ素片同士の接続部が滑らかに連続する素片を、音声コーパスから選択することが可能となる。
【０１０６】
以上の実施形態に関して、更に以下の付記を開示する。
（付記１）
入力テキストデータから音素及び目標韻律が対応付けられたセグメントデータの列を抽出する抽出部と、
前記抽出部により抽出されたセグメントデータごとに、音声コーパスから取得した音声素片が当該セグメントデータの目標韻律よりも長い継続長を有する場合に、当該取得した音声素片から前記目標韻律の継続長より長い箇所を削除した新たな音声素片を生成する生成部と、
前記取得した音声素片及び前記新たな音声素片夫々と前記セグメントデータとの不一致度を示す素片コストを算出し、当該算出された各素片コストに基づき前記取得した音声素片及び前記新たな音声素片夫々から前記セグメントデータに対する音声素片候補データとなる音声素片をリストアップする素片リストアップ部と、
前記抽出されたセグメントデータの列を構成する前記セグメントデータごとに、当該セグメントデータに対応する前記音声素片候補データと、当該セグメントデータに隣接するセグメントデータに対応する前記音声素片候補データとの間の不連続性を示す接続コストを算出し、当該算出された接続コスト及び前記隣接する音声素片候補データ夫々の素片コストに基づいて、前記音声素片候補データとしてリストアップされた音声素片のいずれかを選択して前記音声素片データ列を生成する音素列選択部と、
前記生成された音声素片データ列に基づいて合成音声を生成する音声生成部と、
を備える音声合成装置。
（付記２）
前記生成部は、前記取得した音声素片から前記目標韻律の継続長より長い箇所を削除した新たな音声素片として、前記取得した音声素片の先頭箇所を削除した新たな音声素片、前記取得した音声素片の末尾箇所を削除した新たな音声素片、及び前記取得した音声素片の先頭箇所及び末尾箇所を均等に削除した新たな音声素片を生成する、付記１に記載の音声合成装置。
（付記３）
前記セグメントデータおよび前記音声素片は音素データと韻律データを含み、
前記素片コストは、処理対象の前記セグメントデータの音素と当該セグメントデータの前後所定数セグメントずつの各セグメントデータの音素とから構成される音素列と、処理対象の前記音声素片候補データの音素と当該音声素片候補データの前後の前記所定数ずつの各音声素片データの音素とから構成される音素列とを比較することにより算出される音素列コストと、処理対象の前記セグメントデータの韻律データと処理対象の前記音声素片候補データの韻律データとの差に基づいて算出される韻律コストとの、重み付け和として算出する、付記１または２に記載の音声合成装置。
（付記４）
前記接続コストは、処理対象の前記セグメントデータに対応する処理対象の前記音声素片候補データと当該セグメントデータの１つ前の前記セグメントデータに対応する前記音声素片候補データとの間の音素接続点での各特徴量ベクトルデータ間の距離として算出する、付記１ないし３のいずれかに記載の音声合成装置。
（付記５）
音声素片を記憶する音声コーパスを有する音声合成装置で音声を合成するための方法であって、前記音声合成装置は、
入力テキストデータから音素及び目標韻律が対応付けられたセグメントデータの列を抽出し、
前記抽出されたセグメントデータごとに、前記音声コーパスから取得した音声素片が当該セグメントデータの目標韻律よりも長い継続長を有する場合に、当該取得した音声素片から前記目標韻律の継続長より長い箇所を削除した新たな音声素片を生成し、
前記取得した音声素片及び前記新たな音声素片夫々と前記セグメントデータとの不一致度を示す素片コストを算出し、
前記算出された各素片コストに基づき前記取得した音声素片及び前記新たな音声素片夫々から前記セグメントデータに対する音声素片候補データとなる音声素片をリストアップし、
前記抽出されたセグメントデータの列を構成する前記セグメントデータごとに、当該セグメントデータに対応する前記音声素片候補データと、当該セグメントデータに隣接するセグメントデータに対応する前記音声素片候補データとの間の不連続性を示す接続コストを算出し、
前記算出された接続コスト及び前記隣接する音声素片候補データ夫々の素片コストに基づいて、前記音声素片候補データとしてリストアップされた音声素片のいずれかを選択して前記音声素片データ列を生成し、
前記生成された音声素片データ列に基づいて合成音声を生成する、音声合成方法。
（付記６）
音声素片を記憶する音声コーパスを有する音声合成装置として用いられるコンピュータに、
入力テキストデータから音素及び目標韻律が対応付けられたセグメントデータの列を抽出するステップと、
前記抽出されたセグメントデータごとに、前記音声コーパスから取得した音声素片が当該セグメントデータの目標韻律よりも長い継続長を有する場合に、当該取得した音声素片から前記目標韻律の継続長より長い箇所を削除した新たな音声素片を生成するステップと、
前記取得した音声素片及び前記新たな音声素片夫々と前記セグメントデータとの不一致度を示す素片コストを算出するステップと、
前記算出された各素片コストに基づき前記取得した音声素片及び前記新たな音声素片夫々から前記セグメントデータに対する音声素片候補データとなる音声素片をリストアップするステップと、
前記抽出されたセグメントデータの列を構成する前記セグメントデータごとに、当該セグメントデータに対応する前記音声素片候補データと、当該セグメントデータに隣接するセグメントデータに対応する前記音声素片候補データとの間の不連続性を示す接続コストを算出するステップと、
前記算出された接続コスト及び前記隣接する音声素片候補データ夫々の素片コストに基づいて、前記音声素片候補データとしてリストアップされた音声素片のいずれかを選択して前記音声素片データ列を生成するステップと、
前記生成された音声素片データ列に基づいて合成音声を生成するするステップと、
を実行させるプログラム。
【符号の説明】
【０１０７】
１００  音声合成装置
１０１  テキスト入力部
１０２  形態素解析部
１０３  韻律予測部
１０４  韻律辞書
１０５  波形選択部
１０６  音声辞書
１０７  波形合成部
２０１  目標韻律データ
２０２  韻律入力部
２０７  素片選定部
２０７ａ  素片リストアップ部
２０７ｂ  音素列選択部
２０８  評価部
２０８ａ  素片評価部
２０８ｂ  接続評価部
２０９  素片候補データ
２１０  合成部
５０１  ＣＰＵ
５０２  ＲＯＭ（リードオンリーメモリ）
５０３  ＲＡＭ（ランダムアクセスメモリ）
５０４  入力装置
５０５  出力装置
５０６  外部記憶装置
５０７  可搬記録媒体駆動装置
５０８  通信インタフェース
５０９  バス
５１０  可搬記録媒体
【図１】
0006398523.tif 000002
【図２】
0006398523.tif 000003
【図３】
0006398523.tif 000004
【図４】
0006398523.tif 000005
【図５】
0006398523.tif 000006
【図６】
0006398523.tif 000007
【図７】
0006398523.tif 000008
【図８】
0006398523.tif 000009
【図９】
0006398523.tif 000010
【図１０】
0006398523.tif 000011
【図１１】
0006398523.tif 000012
【図１２】
0006398523.tif 000013
【図１３】
0006398523.tif 000014
【図１４】
0006398523.tif 000015
【図１５】
0006398523.tif 000016
【図１６】
0006398523.tif 000017
【図１７】
0006398523.tif 000018
【図１８】
0006398523.tif 000019
【図１９】
0006398523.tif 000020