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