以下、本発明を実施するための形態について図面を参照しながら詳細に説明する。本実施形態は、音声の変形(音高・強度・継続長の変更)において、アクセント(強勢)位置に変形による音質劣化のリスクを含むことが多いであろうという仮説の下、選択素片の持つ情報に、「アクセント位置」を加え、この情報を加味して韻律評価をすることにより、アクセントの相対位置が優勢で、かつ、その他の評価指標も有意である音素片が選択されるため、目標韻律に近く、かつ、音質劣化の少ない合成音声を生成することを可能にするものである。
図1は、本発明による音声合成装置100の実施形態のブロック図であり、テキスト入力部101、形態素解析部102、韻律予測部103、韻律辞書104、波形選択部105、音声辞書106、および波形合成部107を備える。
テキスト入力部101は、入力テキストデータを入力する。
形態素解析部102は、テキスト入力部101が入力した入力テキストデータに対して形態素解析処理を実行することにより、入力テキストデータに対応する音素列を抽出する。入力テキストデータは、音素列中の音素ごとにセグメント分けされ、各音素を示す音素データが、そのセグメント分けにより得られる合成目標を構成するセグメントデータに登録される。
韻律予測部103は、形態素解析部102で得られる言語情報をもとに、実際の音声データに基づく韻律に関する統計的なモデルを記憶した韻律辞書104を参照することにより、合成目標の音素列中の音素ごとに、声帯の基本周波数であるピッチの高さ、持続時間長、および強度(振幅)によって表される韻律を予測する。この結果、韻律予測部103は、音素セグメント毎に、韻律情報である目標韻律データを生成し、合成目標を構成する上記セグメントデータに登録する。
すなわち、入力テキストデータから合成目標として生成されるセグメントデータ列において、各セグメントデータは、音素データと目標韻律データを有する。
波形選択部105は、目標韻律データと音素データを含むセグメントデータごとに、素片コストを評価することにより、素片候補データを音声辞書106中のデータベースからリストアップする。そして、波形選択部105は、セグメントデータごとに、接続コストおよび素片コストを評価することにより、最良の素片候補データを、リストアップした素片候補データから選択する。
波形合成部107は、波形選択部105がセグメントデータごとに音声辞書106から選択した素片データ列に基づいて、合成音声を生成し出力する。
図2は、図1の波形選択部105の詳細な構成を示すブロック図であり、波形選択部105は、図1の韻律予測部103から出力された目標韻律データ201、韻律入力部202、素片選定部207、および評価部208を備える。素片選定部207は、素片リストアップ部207aとそこから出力された素片候補データ209、および音素列選択部207bを備える。評価部208は、素片評価部208aおよび接続評価部208bを備える。
韻律入力部202は、図1の韻律予測部103が出力した目標韻律データ201を入力する。
素片選定部207において、素片リストアップ部207aは、図1の韻律予測部103から出力されるセグメントデータごとに(以下これを「処理対象セグメントデータ」と記載する)、その処理対象セグメントデータに含まれる音素と一致する音素を有する1つ以上の素片データ(音素片)を、音声辞書106中のデータベースから選択する(以下、この素片データを「処理対象素片データ」と記載する)。
図2の評価部208内の素片評価部208aは、処理対象セグメントデータの音素とその前後2セグメントずつの各セグメントデータの音素とから構成される音素列と、処理対象素片データの音素とその前後の2つずつの各素片データの音素とから構成される音素列とを比較することにより、音素列コストを取得(算出)する。この音素列コストは、音素列の不一致度を示す。隣接するセグメントデータ間の音素列と隣接する素片データ間の音素列の一致度が高いほど音素列コストが低くなるように、音素列コストが算出される。前後の音素列が一致する素片データを選択したほうが、自然な合成音声が得られるからである。
図3は、音素列コスト、韻律コスト、および接続コストの説明図である。図3に示されるctxt_distanceが、音素列コストを示している。図3において、segmentk-2, segmentk-1, segmentk, segmentk+1, segmentk+2は、入力テキストデータに対応する合成目標を構成するセグメントデータの離散時系列を示しており、segmentkが処理対象セグメントデータであるとする。unitu-2, unitu-1, unitu, unitu+1, unitu+2は、音声辞書106のデータベース中のある位置から切り出された素片データの離散時系列を示しており、unituが処理対象素片データであるとする。処理対象セグメントデータsegmentkにおける処理対象素片データunituに対する音素列コストctxt_distanceは、処理対象セグメントデータsegmentkと処理対象素片データunituのそれぞれを中心とする、前後2つずつと自身を含む計5つの連続する音素列同士(図3の「●」で示される)の不一致度として、算出される。
図2において、素片リストアップ部207aは、素片評価部208aに対して、処理対象素片データの韻律データ(以下「素片韻律データ」と記載する)と処理対象セグメントデータの目標韻律データ201との間の韻律コストを算出させ評価させる。具体的には、素片評価部208aは、処理対象セグメントデータの目標韻律データ201と処理対象素片データの素片韻律データとの差に基づいて、韻律コストを算出する。韻律コストは、目標韻律データ201と素片韻律データの距離を示す。図3に示されるpros_distanceが、韻律コストを示しており、処理対象セグメントデータsegmentkの目標韻律データ201と、処理対象素片データunitkの素片韻律データとの差に基づいて算出される。
ここで、本実施形態では、処理対象セグメントデータと処理対象素片データにそれぞれ、アクセント位置の情報が付加されている(後述する図6のセグメントデータのデータ構成例及び図10の素片データのデータ構成例を参照)。本実施形態では、処理対象セグメントデータと処理対象素片データとでアクセント位置が異なった相違数を、アクセント位置の相違に関するコストとして、上述のように算出された韻律コストに乗算して韻律コストを修正する(後述する図17のステップS1702参照)。このように、本実施形態では、アクセント(強勢)位置に変形による音質劣化のリスクを含むことが多いであろうという仮説の下、アクセント位置の相違を韻律コストに加えて、素片のリストアップにおける韻律評価を行う。これにより、本実施形態では、アクセントの相対位置が優勢で、かつ、その他の評価指標も有意である音素片が選択されるため、目標韻律に近く、かつ、音質劣化の少ない合成音声を生成することを可能にするものである。処理対象セグメントデータのアクセント位置は、例えば形態素解析部102や韻律予測部103で認識される文法ルールに基づいて決定される。処理対象素片データのアクセント位置は、例えば次のような手法で決定される。まず、言語ルールにより定義される情報を仮の状態として採用し、次に、基本周波数データを参照しながら、アクセント位置の修正を行う。各音素ラベル区間での基本周波数の平均値をとり、アクセントブロック(一息で言い切る範囲)での基本周波数が最大値を示す音素を、そのアクセント位置とする。
素片評価部208aは、音素列コストと韻律コストとの重み付け和のコスト値を、現在の切り出し区間に対応する素片コストとして算出する。このようにして得られる音素列コスト、韻律コスト、および素片コストの値は、素片候補データ209(後述する図8のcandidate[0]等)としてメモリに記録される。
素片リストアップ部207aは、素片評価部208aが評価した素片コストが低い順に、素片候補データ209を並び替えて、処理対象セグメントデータとリンクさせて出力する。
音素列選択部207bは、セグメントデータごとに(処理対象セグメントデータに対して)リストアップされている各素片候補データ209と、そのセグメントデータの1つ前のセグメントデータ(以下「前方セグメントデータ」と記載する)に対してリストアップされている各素片候補データ209(以下「前方素片候補データ209」と記載する)の2つの素片候補データ間の音響パラメータの不連続性を示す接続コスト(図3のcont_distance)を算出し、2つの素片候補データの素片コストを再度算出して評価し、最良の素片候補データを選択して素片データ列を生成し、波形合成部107へ出力する。
図4は、図1の音声合成装置100をソフトウェア処理として実現できるコンピュータのハードウェア構成例を示す図である。図4に示されるコンピュータは、CPU401、ROM(リードオンリーメモリ:読出し専用メモリ)402、RAM(ランダムアクセスメモリ)403、入力装置404、出力装置405、外部記憶装置406、可搬記録媒体410が挿入される可搬記録媒体駆動装置407、及び通信インタフェース408を有し、これらがバス409によって相互に接続された構成を有する。同図に示される構成は上記システムを実現できるコンピュータの一例であり、そのようなコンピュータはこの構成に限定されるものではない。
ROM402は、コンピュータを制御する音声合成プログラムを含む各プログラムを記憶するメモリである。RAM403は、各プログラムの実行時に、ROM402に記憶されているプログラム又はデータを一時的に格納するメモリである。
外部記憶装置406は、例えばSSD(ソリッドステートドライブ)記憶装置またはハードディスク記憶装置であり、入力テキストデータや合成音声データの保存に用いられる。
CPU401は、各プログラムを、ROM402からRAM403に読み出して実行することにより、当該コンピュータ全体の制御を行う。
入力装置404は、ユーザによるキーボードやマウス等による入力操作を検出し、その検出結果をCPU401に通知する。また、入力装置404は、図1のテキスト入力部101の機能を実行して入力テキストデータを外部から入力し、RAM403または外部記憶装置406に記憶させる。
出力装置405は、CPU401の制御によって送られてくるデータを表示装置や印刷装置に出力する。また、出力装置405は、図1の波形合成部107が外部記憶装置406またはRAM403に出力した合成音声データを、音声として放音する。
可搬記録媒体駆動装置407は、光ディスクやSDRAM、コンパクトフラッシュ等の可搬記録媒体410を収容するもので、外部記憶装置406の補助の役割を有する。
通信インターフェース408は、例えばLAN(ローカルエリアネットワーク)又はWAN(ワイドエリアネットワーク)の通信回線を接続するための装置である。
本実施形態によるシステムは、図1および図2の各処理部の機能を搭載した音声合成プログラムを、ROM402からRAM403に読み出してCPU401が実行することで実現される。そのプログラムは、例えば外部記憶装置406や可搬記録媒体410に記録して配布してもよく、或いはネットワーク接続装置408によりネットワークから取得できるようにしてもよい。
次に、図4のコンピュータが、図1および図2の機能を有する音声合成装置100として動作するために、RAM403または外部記憶装置406上に保持する各種データについて説明する。
図5は、RAM403に保持される制御変数WavSelのデータ構成例を示す図である。制御変数WavSelは、unitdb、seg_count、segmentの各変数データを保持する。unitdbは、外部記憶装置406上の音声辞書106に記憶される音声辞書データへのポインタを保持する。seg_countは、セグメントデータの総数を保持する。segmentは、最初のセグメントデータ(後述する図6のsegment[0]の先頭アドレス)へのポインタを保持する。
図6は、図5の制御変数WavSel内のsegmentポインタから参照されRAM403または外部記憶装置406に保持されるセグメントデータsegment[0]〜segment[seg_count]のデータ構成例を示す図である。各セグメントデータは、入力テキストデータを図1の形態素解析部102で形態素解析して得られる合計seg_count個(制御変数WavSelのseg_countに保持される個数)の音素ごとに、図1の韻律予測部103によって、segment[0],segment[1],・・・,segment[seg_count-1]として得られる。セグメントデータの記憶アドレスは、制御変数WavSelのsegmentによって示される。各セグメントデータsegment[i](i=0,・・・,seg_count-1)は、seg_id、phone_id、accent_pos、target_prosody、candidate、best_cand、prev、nextの各変数データを保持する。seg_idは、セグメントID(識別子)を保持する。phone_idは、音素IDを保持する。accent_posは、アクセント位置(音素)からの相対位置を保持し、値「0」はアクセント音素であることを示し、マイナス値は前方にアクセント位置があることを示し、プラス値は後方にアクセント位置があることを示す。target_prosodyは、RAM403または外部記憶装置406に保持される目標韻律データ201の先頭へのポインタを保持する。candidateは、最初の素片候補データ209(後述する図8のcandidate[0]の先頭アドレス)へのポインタを保持する。best_candは、図2の音素列選択部207bに対応する処理によって現在のセグメントデータに対応してする選択される最良の素片候補データ209(後述する図8のcandidate[0]〜candidate[N]、・・・のいずれかの先頭アドレス)へのポインタを保持する。prevは1つ手前のセグメントデータへのポインタ、nextは1つ後ろのセグメントデータへのポインタを保持する。現在のセグメントデータが例えばsegmen[1]であれば、prevはsegment[0]の先頭アドレスを保持し、nextはsegment[2]の先頭アドレスを保持する。また、現在のセグメントデータが例えば先頭データsegment[0]であれば、prevは未定義値であるNULL値を保持する。現在のセグメントデータが例えば末端データsegment[seg_count]であれば、nextはNULL値を保持する。
図7は、図6の各セグメントデータ内のtarget_prosodyポインタまたは後述する図10の各素片データ内のprosodyポインタから参照されRAM403または外部記憶装置406に記憶される韻律データprosody[0],prosody[1],・・・,prosody[N],・・・のデータ構成例を示す図である。各韻律データprosody[i](i=0,・・・,N,・・・)は、time,pitch,power,prev,nextの各変数データを保持する。timeは、韻律が発生する時刻を保持する。pitchは、韻律の音高(ピッチ周波数)を保持する。powerは、韻律の強度を保持する。prevは1つ手前の韻律データへのポインタ、nextは1つ後ろの韻律データへのポインタを保持する。現在の韻律データが、先頭データであればprevはNULL値を保持し、末端データであればnextはNULL値を保持する。
図8は、図6のセグメントデータ内のtarget_prosodyポインタから参照されRAM403または外部記憶装置406に記憶される図2の素片候補データ209である素片候補データcandidate[0],candidate[1],・・・,candidate[N],・・・のデータ構成例を示す図である。各素片候補データcandidate[i](i=0,・・・,N,・・・)は、図2のリストアップ部で生成され、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は、音声辞書106内の素片データを識別するための素片ID(図11参照)を保持し、図2の素片リストアップ部207aによりセットされる。ctxt_distanceは、前述した音素列コスト(音素列の不一致度)を保持し、図2の素片評価部208aによって算出されセットされる。pros_distanceは、前述した韻律コスト(目標韻律データ201と素片韻律データの距離)を保持し、図2の素片評価部208aによって算出されセットされる。unit_distanceは、音素列コストと韻律コストの重み付け和である前述した素片コストを保持し、図2の素片評価部208aによって算出されセットされる。cont_distanceは、前述した接続コスト(音素接続点での特徴量距離)を保持し、図2の接続評価部208bによって算出されセットされる。prev_total_costは、先頭のセグメントデータからこの素片候補データが属するセグメントデータの1つ前のセグメントデータ(前方セグメントデータ)までに確定している、コスト合計を保持する。total_costは、先頭のセグメントデータからこの素片候補データが属するセグメントデータまでに確定したトータルコストを保持し、前述したように図2の音素列選択部207bにより算出されセットされる。best_candは、この素片候補データと接続する最良の前方素片候補データへのポインタを保持し、前述した音素列選択部207bによって算出されセットされる。ここで、最良の前方素片候補データは、best_candが含まれる素片候補データ(処理対象素片候補データ)が属するセグメントデータ(処理対象セグメントデータ)の1つ手前のセグメントデータ(前方セグメントデータ)に属する素片候補データ(前方素片候補データ)であって、その前方素片候補データで確定しているトータルコストと、処理対象素片候補データとの間の接続コストとの、重み付き和のコスト値が、最も小さい(最良の)前方素片候補データである。prevは1つ手前の素片候補データへのポインタ、nextは1つ後ろの素片候補データへのポインタを保持する。現在の素片候補データが、先頭データであればprevはNULL値を保持し、末端データであればnextはNULL値を保持する。
図9は、図1の音声辞書106を構成するRAM403または外部記憶装置406に記憶される音声辞書データunitdbのデータ構成例を示す図であり、図5の制御変数WavSelのunitdbポインタから参照される。音声辞書データunitdbは、phone_count、phoneme、unit_count、unit、fval_countの各変数データを保持する。phone_countは、この音声辞書データunitdbで定義されている音素数を保持する。phonemeは、先頭の音素データ(図11のphoneme[0]の先頭アドレス)へのポインタを保持する。unit_countは、この音声辞書データunitdbが搭載する素片データの数を保持する。unitは、この音声辞書データunitdbが搭載する先頭の素片データ(図11のunit[0]の先頭アドレス)へのポインタを保持する。fval_countは、特徴量ベクトル数を保持する。
図10は、図1の音声辞書106を構成するRAM403または外部記憶装置406に記憶される素片データunit[0]〜unit[unit_count-1]のデータ構成例を示す図であり、図9の音声辞書データunitdbのunitポインタから参照される。音声辞書106への搭載素片数unit_countは、図9の音声辞書データunitdbのunit_countデータとして登録される。各素片データunit[i](i=0,・・・,unit_count-1)は、unit_id, phone_id,accent_pos,duration,prosody,prev,nextの各変数データと、featvalue[0]〜featvalue[fval_count-1]の各配列変数データを保持する。unit_idは、素片データを識別するための素片IDを保持する。phone_idは、この素片データに対応付けられる音素を図11で後述する音素データから特定するための音素IDを保持する。accent_posは、アクセント位置(音素)からの相対位置を保持し、値「0」はアクセント音素であることを示し、マイナス値は前方にアクセント位置があることを示し、プラス値は後方にアクセント位置があることを示す。durationはこの素片データがどれだけの時間長だけ継続しているかを示す継続長を保持する。prosodyは、図6のデータ構成例を有する、RAM403または外部記憶装置406に保持される素片韻律データの先頭へのポインタを保持する。featvalue[0]〜featvalue[fval_count-1]は、1番目からfval_count番目までの後述する図12に示されるデータ構成例を有する特徴量ベクトルデータの先頭データへのポインタを保持する。prevは1つ手前の素片データへのポインタ、nextは1つ後ろの素片データへのポインタを保持する。現在の素片データが、先頭データであればprevはNULL値を保持し、末端データであればnextはNULL値を保持する。
図11は、図9の音声辞書データunitdb内のphonemeポインタから参照されRAM403または外部記憶装置406に記憶される音素データphoneme[0]〜phoneme[phone_count-1]のデータ構成例を示す図である。音素データの数は、音声辞書データunitdbのphone_countデータにセットされている。各音素データphoneme[i] (i=0,・・・,phone_count-1)は、phone_id,phomene,prev,nextの各変数データを保持する。phone_idは、音素を識別するための音素IDを保持する。前述した図6のセグメントデータまたは前述した図10の素片データは、その中のphone_idデータによって、図5の制御変数WavSel内のunitdb→図9の音声辞書データunitdb内のphoneme→図11の音素データphoneme[0]〜phoneme[phone_count-1]のうち上記phone_idの値が格納されている音素データとたどって、その音素データ内の音素名phomeneと関連付けられる。phomeneは音素名を保持する。prevは1つ手前の音素データへのポインタ、nextは1つ後ろの音素データへのポインタを保持する。現在の音素データが、先頭データであればprevはNULL値を保持し、末端データであればnextはNULL値を保持する。
図12は、図11の各素片データ内のfeatvalue[i] (i=0,・・・,fval_count-1)ポインタから参照されRAM403または外部記憶装置406に記憶される特徴量ベクトルデータ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]は、1番目からdimension番目までの特徴量を保持する。prevは1つ手前の特徴量ベクトルデータへのポインタ、nextは1つ後ろの特徴量ベクトルデータへのポインタを保持する。現在の特徴量ベクトルデータが、先頭データであればprevはNULL値を保持し、末端データであればnextはNULL値を保持する。この特徴量ベクトルデータは、前述したように、図2の接続評価部208bが、処理対象素片候補データ209と前方素片候補データ209との間の音素接続点での各素片データの各スペクトル包絡の距離を算出するために使用される。
図13は、図2の素片選定部207に対応する機能を、図4のハードウェア構成例を有するコンピュータのCPU401が、ソフトウェアプログラムの処理により実現する場合の、波形選択処理の例を示すフローチャートである。以下に説明する処理はすべてCPU401が実行する処理である。図13に示されるように、波形選択処理では、韻律データの読込みの処理(ステップS1301)と、素片選定処理(ステップS1302)が実行される。
図14は、図13のステップS1302の素片選定処理の詳細例を示すフローチャートである。まず、RAM403上の変数データsegprevに、未定義値NULLが格納され、変数データsegに、前述した図5のデータ構成例を有する制御変数WavSel内のsegmentデータの値が格納される(ステップS1401)。この値は、図6のデータ構成例を有するセグメントデータの最初のセグメントデータsegmen[0]の先頭アドレスへのポインタである。変数データsegは処理対象セグメントデータを示し、変数データsegprevは前方セグメントデータを示す。
次に、seg変数の値が未定義値NULLでないか否か、すなわち図6の全てのセグメントデータsegment[0]〜segment[seg_count]が処理されたか否かが判定される(ステップS1402)。
全てのセグメントデータの処理が完了しておらずseg変数の値が未定義値NULLではなくてステップS1402の判定がYESとなる間は、ステップS1405でsegprev変数にseg変数の値が格納され、seg変数が示すセグメントデータ内のnextポインタ(図6参照)が示す次のセグメントデータへのポインタ値が新たにseg変数にセットされながら、ステップS1403の素片リストアップ処理と、ステップS1404の音素列選択処理が繰り返し実行される。
全てのセグメントデータの処理が完了してseg変数の値が未定義値NULLとなってステップS1402の判定がNOとなると、segprev変数が最後に示しているセグメントデータ全体の中の後方から先頭に向かって、決定されている最良候補をたどりながら、各セグメントデータの素片データの最終選択候補を指定してゆき、素片データ列として出力される(ステップS1406)。
図15は、図14のフローチャートによって実現される最良の素片候補データの選択動作の説明図である。この図において、・・・,segmentk-2, segmentk-1, segmentk, segmentk+1, segmentk+2,・・・は、入力テキストデータに対応する合成目標を構成するセグメントデータの離散時系列を示しており、segmentkが処理対象セグメントデータであるとする。図6のセグメントデータの形式で表せば、・・・,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に対してリストアップされる素片候補データ209を示している。同様に、例えばsegment k-1に実線で接続されているcandidatek-1,0, candidatek-1,1, candidatek-1,2, candidatek-1,3, candidatek-1,4,・・・は、セグメントデータsegment k-1に対してリストアップされる素片候補データ209を示している。同様に、例えばsegment kに実線で接続されているcandidatek,0, candidatek,1, candidatek,2, candidatek,3, candidatek,4,・・・は、セグメントデータsegment kに対してリストアップされる素片候補データ209を示している。
上述の各素片候補データ209は、図14のステップS1403の素片リストアップ処理によって生成される。この素片リストアップ処理は、図2の素片リストアップ部207aの機能を実現している。このとき、素片リストアップ部207aの説明において前述したように、例えば素片候補データcandidatek,0, candidatek,1, candidatek,2, candidatek,3, candidatek,4,・・・がリストアップされるときに、それに対応するセグメントデータsegment kとの間で素片コストが算出され、その算出された素片コストに基づいて、上記素片候補データの並び順が決定される。
次に、セグメントデータsegment k-2内の濃い色の素片候補データcandidatek-2,4は、その次のセグメントデータsegmentk-1内の濃い色の素片候補データcandidatek-1,1が処理対象素片候補データ209として実行されるときに検出される最良の素片候補データ209を示している。同様に、セグメントデータsegment k-1内の濃い色の素片候補データcandidatek-2,1は、その次のセグメントデータsegment k内の濃い色の素片候補データcandidatek,2が処理対象素片候補データ209として実行されるときに検出される最良の素片候補データ209を示している。いま、処理対象セグメントデータをsegment kとし、処理対象素片候補データ209をcandidatek,2とすれば、前方セグメントデータsegment k-1内の各素片候補データ(前方素片候補データ)candidatek-1,0, candidatek-1,1, candidatek-1,2, candidatek-1,3, candidatek-1,4,・・・との間で、接続コストが計算される。そして、そのように計算された接続コストと2つの素片コストと、前方素片候補データ209に対して確定しているさらにその1つ前方の最良の素片候補データ209までのトータルコストの重み付け和が計算され、その結果値が処理対象素片候補データcandidatek,2に対するトータルコストとされる。この計算が、処理対象素片候補データcandidatek,2において、すべての前方素片候補データcandidatek-1,0, candidatek-1,1, candidatek-1,2, candidatek-1,3, candidatek-1,4に対して実行され、トータルコストが最も小さい前方素片候補データ209が、処理対象素片候補データcandidatek,2に対する最良の前方素片候補データ209として決定される。例えば、前方セグメントデータsegment k-1内の濃い色の前方素片候補データcandidatek-1,1が、処理対象素片候補データcandidatek,2に対する最良の前方素片候補データ209として決定される。また、処理対象素片候補データcandidatek,2と最良の前方素片候補データcandidatek-1,1間の接続コスト1502kが計算される。そして、各素片コスト1501kと1501k-1と接続コスト1502kの重み付け和と、最良の前方素片候補データcandidatek-1,1に対して確定しているトータルコストの和が、処理対象素片候補データcandidatek,2に対するトータルコストとして計算される。
以上のように、本実施形態では、処理対象セグメントデータと前方セグメントデータの組が、セグメントデータの先頭から末尾に向かって順次進められながら、処理対象セグメントデータ内でリストアップされた素片候補データ209(処理対象素片候補データ209)ごとに、先頭から現在の処理対象セグメントデータ内の現在の処理対象素片候補データ209に至るセグメントデータごとの最良の素片候補データ209の経路が探索される(ステップS1402からS1405の繰返し処理)。また、現在の処理対象セグメントデータ内でそのように探索された素片候補データ209ごとのトータルコストが比較され、処理対象セグメントデータ内での最良の素片候補データ209が決定される。そして、末尾のセグメントデータまで処理が完了すると(ステップS1402の判定がNO)、末尾のセグメントデータから先頭のセグメントデータに向かって最良の前方素片候補データ209を順次たどる探索処理が実行され、各素片データが決定されてゆく。最後に探索処理が先頭のセグメントデータに到達すると、全てのセグメントデータに対応する素片データが決定されるので、それらが素片データ列として図2の波形合成部107に出力される。このようにして、本実施形態では、いわゆるビタビアルゴリズムにより、最適な素片データ列を出力することができる。
図16は、図15のステップS1403の素片リストアップ処理の詳細例を示すフローチャートであり、図2の素片リストアップ部207aの機能を実現している。
まず、RAM403上の変数uに、音声辞書106内のデータベースから先頭の素片データへのポインタが格納される(ステップS1601)。このポインタ値は、図9の音声辞書データunitdbのunitポインタ値として得ることができる。
次に、ステップS1602で末尾の素片データの検索が終わっていないと判定される間(判定がYESの間)、ステップS1607で次の素片データへのポインタが変数uに格納されながら、各素片データごとに、以下のステップS1603からS1620までの一連の処理が実行される。ここで、次の素片データへのポインタは、変数uが示す図10の素片データ内のnextポインタとして得られる。また、ステップS1602の判定は、ステップS1607でセットされたnextポインタの値がNULLであるか否かを判定することにより実現できる。
変数uによって参照される素片データとその前後2つずつの素片データの音素ラベル列と、変数segによって参照されるセグメントデータとその前後2つずつのセグメントデータの音素ラベル列とが比較され、音素列コストが算出され、RAM403上の変数contextに格納される(ステップS1603)。この算出方法については、図3の説明で前述した通りである。なお、変数uによって参照される素片データの音素ラベルは、変数uによって参照される図8の素片データ中の音素IDデータphone_idから図11の音素データ中の音素名データphomeneを参照することにより得られる。また、その前後2つずつの素片データの音素ラベル列は、変数uによって参照される図8の素片データ中のprevポインタおよびnextポインタを順次2つずつたどった先の素片データから、上記と同様にして得られる。変数segによって参照されるセグメントデータの音素ラベルは、変数segによって参照される図6のセグメントデータ中の音素IDデータphone_idから図11の音素データ中の音素名データphomeneを参照することにより得られる。また、その前後2つずつのセグメントデータの音素ラベル列は、変数segによって参照される図6のセグメントデータ中のprevポインタおよびnextポインタを順次2つずつたどった先のセグメントデータから、上記と同様にして得られる。
次に、RAM403上の図8の素片候補データ209の末尾に新規選択候補のエントリcandidate[i](iは末尾の次に追加されるエントリの番号)が生成され、そのエントリに素片ID unit_id が新規に付与され、ステップS1603でセットされたRAM403上の変数contextの値が音素列コストctxt_distanceとして代入される(ステップS1604)。
次に、ステップS1603〜S1605で生成された素片候補データ209のエントリに対して、さらに韻律コストおよび素片コストが計算され、図14のステップS1405でRAM403上の変数segに格納されている処理対象セグメントのエントリに登録される(ステップS1605)。この処理の詳細については、図17のフローチャートを用いて後述する。
その後、次の素片データへのポインタが変数uに格納されて(ステップS1606)、ステップS1602の処理に戻る。
図17は、図16のステップS1605で実行される素片コスト計算&候補追加処理の詳細を示すフローチャートである。
まず、処理対象素片データ(音素片)と処理対象セグメントデータの目標韻律データ201の韻律遷移が比較され、韻律コストが算出される(ステップS1701)。具体的な処理については、図2の素片リストアップ部207aの説明で前述した。
次に、処理対象セグメントデータに付加されているアクセント位置の相対位置accent_pos(図6参照)と処理対象素片データに付加されているアクセント位置の相対位置accent_pos(図10参照)が比較されることにより、アクセント位置の相違数が算出される。そして、この相違数の値が、アクセント位置の相違に関するコストとして、ステップS1701で算出された韻律コストに乗算され、韻律コストの値が修正される。そして、この韻律コストの値が、ステップS1604でRAM403上に生成された図8の素片候補データ209のエントリの韻律コストpros_distanceとして登録される。このように、本実施形態では、アクセント(強勢)位置に変形による音質劣化のリスクを含むことが多いであろうという仮説の下、アクセント位置の相違を韻律コストに加えて、素片のリストアップにおける韻律評価が行われる。これにより、本実施形態では、アクセントの相対位置が優勢で、かつ、その他の評価指標も有意である音素片が選択されるため、目標韻律に近く、かつ、音質劣化の少ない合成音声を生成することを可能にするものである。
次に、ステップS1603で算出された音素列コストとステップS1701及びS1702で算出された韻律コストとを重み付け加算して得られるコスト値が、素片コストとして算出される。そして、その素片コストの値が、ステップS1604でRAM403上に生成された図8の素片候補データ209のエントリの素片コストunit_distanceとして登録される(ステップS1703)。
最後に、図14のステップS1405でRAM403上の変数segに格納されている処理対象セグメントのエントリに、ステップS1604でRAM403上に生成された図8の素片候補データ209のエントリがリンクされて登録される(ステップS1704)。このリンクは、図6のセグメントデータのエントリのcandidateポインタから、図8の素片候補データ209のエントリのunit_idがリンクされ、さらにその素片候補データ209のエントリのnextポインタによって、次の素片候補データ209のエントリのunit_idがリンクされる。このとき、ステップS1605で算出された素片コストの低い順にリンクが張られる。なおこのとき、候補数や素片コスト値などで、追加の可否に制限をかけてもよい。
図16において、変数uの値が更新されていった結果、末尾の音素片の検索が終了しステップS1602の判定がNOになると、図16のフローチャートの処理が終了して図14のステップS1403の1回の素片リストアップ処理が終了する。
図18は、図14のステップS1404の音素列選択処理の詳細例を示すフローチャートであり、図2の音素列選択部207bの機能を実現している。
まず、変数segが参照する図6のセグメントデータ中の最良の素片候補データ209へのポインタseg.best_candが初期化(クリア)される(ステップS1801)。
次に、RAM403上の変数ctに、変数segが示す現在のセグメントデータ(処理対象セグメントデータ)に対してリストアップされている素片候補データ209の先頭データのアドレスがセットされる(ステップS1802)。具体的には、このアドレスは、変数segが参照する図6のセグメントデータ中の最初の素片候補データへのポインタcandidateの値として得られる。
次に、ステップS1803で素片候補データ209の検索が終わっていないと判定される間(判定がYESの間)、ステップS1815で次の素片候補データ209へのポインタが変数ctに格納されながら、各素片候補データ209(処理対象素片候補データ209)ごとに、以下のステップS1804からS1814までの一連の処理が実行される。ここで、次の処理対象素片候補データ209へのポインタは、変数ctが示す図8の素片候補データ209内のnextポインタとして得られる。また、ステップS1803の判定は、ステップS1815でセットされたnextポインタの値がNULLであるか否かを判定することにより実現できる。
まず、RAM403上の変数cpに、処理対象セグメントデータの前方セグメントデータに対してリストアップされている素片候補データ209(前方素片候補データ209)の先頭データのアドレスがセットされる(ステップS1804)。具体的には、このアドレスは、変数segが参照する図6のセグメントデータ中のprevポインタによって参照される図6のセグメントデータ中の最初の素片候補データへのポインタcandidateの値として得られる。
続いて、変数ctによって参照される構造体データ中のbest_candポインタ(図8の処理対象素片候補データ209を参照)が初期化(クリア)される(ステップS1805)。best_candは、処理対象素片候補データ209と接続する最良の前方素片候補データ209を参照するポインタである。
その後、ステップS1806で前方素片候補データ209の検索が終わっていないと判定される間(判定がYESの間)、ステップS1811で次の前方素片候補データ209へのポインタが変数cpに格納されながら、各前方素片候補データ209ごとに、以下のステップS1807からS1810までの一連の処理が実行される。ここで、次の前方素片候補データ209へのポインタは、変数cpが示す図8の素片候補データ209内のnextポインタとして得られる。また、ステップS1806の判定は、ステップS1811でセットされたnextポインタの値がNULLであるか否かを判定することにより実現できる。
まず、変数ctが示す処理対象素片候補データ209と変数cpが示す前方素片候補データ209の接続コストが算出される(ステップS1807)。具体的には、上記各素片候補データ209に対応する特徴量ベクトルデータが、図8のunit_idデータ→図10のfeatvalue[0]〜featvalue[fval_count-1]とたどられて参照され、切り出し先頭位置および切り出し終了位置に対応する特徴量ベクトルデータが抽出される。切り出し先頭位置および切り出し終了位置は、図8のエントリのtop_shiftおよびtail_shiftのデータとして得られる。そして、これらの特徴量ベクトルデータの組によって算出される各素片データの各スペクトル包絡の距離(例えばメルケプストラムのユークリッド距離)が接続コストとして算出される。
次に、図8に示される前方素片候補データ209中の確定している前方までのコスト合計cp.total_costと、ステップS1807で算出された接続コストに重み付け係数を乗じた結果の和が算出される。そして、その加算結果が、RAM403上の変数ctが示す処理対象素片候補データ209の構造体内のtotal_cost値(ct.total_cost)として保存される(以上、ステップS1808)。
続いて、上述のct.total_cost値が、変数ctが示す元のRAM403上の処理対象素片候補データ209内の図8に示されるtotal_cost値よりも小さいか否か、すなわち今回のct.total_cost値が最良であるか否かが判定される(ステップS1809)。ステップS1809の判定がYESの場合には、変数ctが示す元の処理対象素片候補データ209内の図8に示される全てのメンバー変数値が、変数ctが示す構造体の全てのメンバー変数値で置き換えられる(ステップS1810)。ステップS1809の判定がNOの場合には、ステップS1810の置換えは実行されない。
その後、次の前方素片候補データ209へのポインタnextが変数cpに格納され、ステップS1806の処理に戻り、ステップS1806での判定の後、上述したステップS1807からS1810までの一連の処理が繰り返し実行される。
変数cpの値が更新されていった結果、末尾の前方素片候補データ209の検索が終了しステップS1806の判定がNOになると、まず、変数ctが示す前方最良情報が、ステップS1810でセットされている最良情報保存用変数のデータに書き換えられる(ステップS1812)。
その後、変数ctが示す処理対象素片候補データ209に新たにセットされたtotal_cost値が、変数segが示す図6のセグメントデータ中のbest_candポインタが示す図8の素片候補データ209中のtotal_cost値よりも小さいか否かが判定される(ステップS1813)。ステップS1813の判定がYESならば、変数segが示す図6のセグメントデータ中のbest_candポインタに、変数ctの値がセットされる(ステップS1814)。ステップS1813の判定がNOならばステップS1724は実行されない。
その後、次の処理対象素片候補データ209へのポインタが変数ctに格納されて(ステップS1815)、ステップS1803の処理に戻る。
変数ctの値が更新されていった結果、末尾の処理対象素片候補データ209の検索が終了しステップS1803の判定がNOになると、図18のフローチャートの処理が終了し、図14のステップS1404の1回の音素列選択処理が終了する。
以上一連の処理により、全てのセグメントデータの処理が完了してseg変数の値が未定義値NULLとなって図14のステップS1402の判定がNOとなると、segprev変数が最後に示しているセグメントデータ中の図6のbest_candポインタが参照されることにより図8のデータが参照され、unit_idデータによって1つの素片データが決定される。その後、図8のbest_candポインタを末尾のセグメントデータから先頭のセグメントデータに向かって順次たどる探索処理が実行され、各前方セグメントデータごとに最良の前方素片候補データ中のunit_idデータが参照されて、各素片データが決定されてゆく。最後に探索処理が先頭のセグメントデータに到達すると、全てのセグメントデータに対応する素片データが決定されるので、それらが素片データ列として図2の波形合成部107に出力される。
以上の実施形態により、指定された韻律遷移に忠実であり、かつ素片同士の接続部が滑らかに連続する素片を、データベースから選択することが可能となる。
以上の実施形態に関して、更に以下の付記を開示する。
(付記1)
テキストデータから音素が対応付けられたセグメントデータの列を抽出する抽出処理と、
前記抽出されたセグメントデータの列を含むセグメントデータごとに、データベースから取得した複数個の音素片夫々のアクセント位置と前記抽出されたセグメントデータのアクセント位置との相違を含む不一致度を表す素片コストを取得する素片コスト取得処理と、
前記取得された各素片コストに基づき、前記セグメントデータの列を構成するセグメントデータごとに、前記複数個の音素片の中から生成用音素片を選択する音素片選択処理と、
前記選択された生成用音素片に基づいて合成音を生成する音生成処理と、
を実行する処理部を有する音合成装置。
(付記2)
前記処理部は、前記音素片選択処理において、前記取得された各素片コストに基づき前記取得した複数個の音素片夫々から前記セグメントデータの列を構成するセグメントデータごとにセグメントデータに対する音素片候補データとなる音素片をリストアップする処理を実行する、付記1に記載の音合成装置。
(付記3)
前記処理部は、前記音素片選択処理において、前記抽出されたセグメントデータの列を構成する前記セグメントデータごとに、前記セグメントデータに対応する前記音素片候補データと、前記セグメントデータに隣接するセグメントデータに対応する前記音素片候補データとの間の不連続性を示す接続コストを取得し、前記取得された接続コスト及び前記隣接する音素片候補データ夫々の素片コストに基づいて、前記音素片候補データとしてリストアップされた音素片のいずれかを選択して前記音素片データ列を生成する処理を実行する、付記2に記載の音合成装置。
(付記4)
前記セグメントデータおよび前記音素片は音素データと韻律データとアクセント位置に関するデータを含み、
前記処理部は、前記素片コスト取得処理において、処理対象の前記セグメントデータの音素と前記セグメントデータの前後所定数セグメントずつの各セグメントデータの音素とから構成される音素列と、処理対象の前記音素片候補データの音素と前記音素片候補データの前後の前記所定数ずつの各音素片データの音素とから構成される音素列とを比較することにより取得される音素列コストと、処理対象の前記セグメントデータの韻律データと処理対象の前記音素片候補データの韻律データの差及びアクセント位置の相違に基づいて取得される韻律コストとの、重み付け和を前記音素片コストとして取得する処理を実行する、付記2に記載の音合成装置。
(付記5)
前記処理部は、前記音素列選択処理において、処理対象の前記セグメントデータに対応する処理対象の前記音素片候補データと当該セグメントデータの1つ前の前記セグメントデータに対応する前記音素片候補データとの間の音素接続点での各特徴量ベクトルデータ間の距離として前記接続コストを取得する処理を実行する、付記3に記載の音合成装置。
(付記6)
音素片を記憶するデータベースを有する音合成装置で音を合成するための方法であって、前記音合成装置は、
入力テキストデータから音素が対応付けられたセグメントデータの列を抽出し、
前記抽出されたセグメントデータの列を構成するセグメントデータごとに、データベースから取得した複数個の音素片夫々と前記セグメントデータとについて、前記複数個の音素片夫々のアクセント位置と前記セグメントデータのアクセント位置との相違を含む不一致度を表す素片コストを取得し、
前記取得された各素片コストに基づき、前記セグメントデータの列を構成するセグメントデータごとに、前記セグメントデータに対応する音素片を選択し、
前記選択された音素片に基づいて合成音を生成する、音合成方法。
(付記7)
音素片を記憶するデータベースを有する音合成装置として用いられるコンピュータに、
入力テキストデータから音素が対応付けられたセグメントデータの列を抽出するステップと、
前記抽出されたセグメントデータの列を構成するセグメントデータごとに、データベースから取得した複数個の音素片夫々と前記セグメントデータとについて、前記複数個の音素片夫々のアクセント位置と前記セグメントデータのアクセント位置との相違を含む不一致度を表す素片コストを取得する素片コスト取得ステップと、
前記取得された各素片コストに基づき、前記セグメントデータの列を構成するセグメントデータごとに、前記セグメントデータに対応する音素片を選択する音素片選択ステップと、
前記選択された音素片に基づいて合成音を生成する音生成ステップと、
を実行させるプログラム。