以下、本発明を実施するための形態について図面を参照しながら詳細に説明する。
図1は、本発明による音声合成装置100の実施形態のブロック図であり、テキスト入力部101、形態素解析部102、韻律予測部103、韻律辞書104、波形選択部105、音声辞書106、および波形合成部107を備える。
テキスト入力部101は、入力テキストデータを入力する。
形態素解析部102は、テキスト入力部101が入力した入力テキストデータに対して形態素解析処理を実行することにより、入力テキストデータに対応する音素列を抽出する。入力テキストデータは、音素列中の音素ごとにセグメント分けされ、各音素を示す音素データが、そのセグメント分けにより得られる合成目標を構成するセグメントデータに、音素データが登録される。
韻律予測部103は、形態素解析部102で得られる言語情報をもとに、実際の音声データに基づく韻律に関する統計的なモデルを記憶した韻律辞書104を参照することにより、合成目標の音素列中の音素ごとに、声帯の基本周波数であるピッチの高さ、持続時間長、および強度(振幅)によって表される韻律を予測する。この結果、韻律予測部103は、音素セグメント毎に、韻律情報である目標韻律データを生成し、合成目標を構成する上記セグメントデータに登録する。
すなわち、入力テキストデータから合成目標として生成されるセグメントデータ列において、各セグメントデータは、音素データと目標韻律データを有する。
波形選択部105は、まず、韻律予測部103から入力する目標韻律データを、音声辞書106中の音声コーパスを構成する各素片データの素片韻律データに合うように補正する。次に、波形選択部105は、補正された目標韻律データと音素データを含むセグメントデータごとに、素片評価のコスト条件を満たす素片候補データを音声辞書106中の音声コーパスからリストアップする。そして、波形選択部105は、セグメントデータごとに、接続評価のコスト条件を満たす最良の素片候補データを、リストアップした素片候補データから選択する。
波形合成部107は、波形選択部105がセグメントデータごとに音声辞書106から選択した最良の素片候補データを接続して、合成音声を生成し出力する。
図2は、図1の波形選択部105の詳細な構成を示すブロック図であり、波形選択部105は、図1の韻律予測部103から出力された目標韻律データ201、韻律入力部202、目標韻律ピッチ特徴点抽出部203、素片韻律ピッチ特徴点抽出部204、韻律補正部205、補正後目標韻律データ206を備える。また、波形選択部105は、素片選定部207および評価部208を備える。素片選定部207は、素片リストアップ部207aとそこから出力された素片候補データ209、および音素列選択部207bを備える。評価部208は、素片評価部208aおよび接続評価部208bを備える。
目標韻律ピッチ特徴点抽出部203は、入力テキストデータ全体にわたる目標韻律データ201から、所定数、例えば4点のピッチ特徴点を抽出する。より具体的には、目標韻律ピッチ特徴点抽出部203は、入力テキストデータ全体にわたる目標韻律データ201を構成するピッチ周波数のヒストグラムを算出する。そして、目標韻律ピッチ特徴点抽出部203は、そのヒストグラムから頻度値が極大を示す1つ以上の周波数と頻度値が概略ゼロに収束する1つ以上の周波数をそれぞれ、ピッチ特徴点として抽出する。図3(a)の301は、目標韻律データ201から算出されるピッチ周波数のヒストグラムの例を示している。横軸はピッチ周波数[Hz:ヘルツ]を示し、縦軸は正規化された頻度値を示している。この目標韻律のピッチ周波数のヒストグラム301から、頻度値が極大を示す特徴点2のピッチ周波数(175Hz)と特徴点3のピッチ周波数(410Hz)、および頻度値が概略ゼロに収束する特徴点1のピッチ周波数(120Hz)と特徴点4のピッチ周波数(495Hz)が、それぞれ抽出される。
素片韻律ピッチ特徴点抽出部204は、目標韻律の場合と同様に、音声辞書106に登録されている音声コーパス全体にわたる各素片データの素片韻律データから、上記所定数、例えば4点のピッチ特徴点を抽出する。より具体的には、素片韻律ピッチ特徴点抽出部204は、音声辞書106内の音声コーパス全体にわたる素片韻律データを構成するピッチ周波数のヒストグラムを算出する。そして、素片韻律ピッチ特徴点抽出部204は、そのヒストグラムから頻度値が極大を示す1つ以上の周波数と頻度値が概略ゼロに収束する1つ以上の周波数をそれぞれ、ピッチ特徴点として抽出する。図3(b)の302は、素片韻律データから算出されるピッチ周波数のヒストグラムの例を示している。横軸はピッチ周波数[Hz]を示し、縦軸は正規化された頻度値を示している。この素片韻律のピッチ周波数のヒストグラム302から、頻度値が極大を示す特徴点2のピッチ周波数(160Hz)と特徴点3のピッチ周波数(260Hz)、および頻度値が概略ゼロに収束する特徴点1のピッチ周波数(85Hz)と特徴点4のピッチ周波数(400Hz)が、それぞれ抽出される。
図2で、韻律入力部202は、図1の韻律予測部103が出力した目標韻律データ201を入力する。
韻律補正部205は、目標韻律ピッチ特徴点抽出部203が抽出した例えば前述した4つのピッチ特徴点(特徴点1〜4)と、素片韻律ピッチ特徴点抽出部204が抽出した例えば前述した4つのピッチ特徴点(特徴点1から4)との対応関係に基づいて、目標韻律データ201を補正して補正後目標韻律データ206を出力する。より具体的には、韻律補正部205は、目標韻律データ201中のピッチ周波数が目標韻律ピッチ特徴点抽出部203で抽出された相互に隣接するいずれか2つのピッチ特徴点の周波数の間に任意の内分比で位置する場合に、これら2つのピッチ特徴点にそれぞれ対応する素片韻律ピッチ特徴点抽出部204で抽出された2つのピッチ特徴点の周波数を上述の内分比と同じ内分比で内分して得られる周波数になるように、目標韻律データ201中のピッチ周波数を補正し、補正後目標韻律データ206として出力する。
例えば図3において、補正前の目標韻律データ201のピッチ周波数が図3(a)の目標韻律のピッチ周波数のヒストグラム301上の特徴点2のピッチ周波数と特徴点3のピッチ周波数をa:bで内分する周波数であった場合、補正後目標韻律データ206のピッチ周波数は次のようにして算出される。まず、図3(a)の目標韻律のピッチ周波数のヒストグラム301上の各特徴点1〜4のぞれぞれと、図3(b)の素片韻律のピッチ周波数のヒストグラム302の各特徴点1〜4のそれぞれについて、図3の305の4本の矢印線として示されるように対応関係が取られる。その上で、図3(a)の目標韻律のピッチ周波数のヒストグラム301上の特徴点2および3にそれぞれ対応する図3(b)の素片韻律のピッチ周波数のヒストグラム302上の特徴点2のピッチ周波数と特徴点3のピッチ周波数をa:bに内分する周波数が算出される。そして、この周波数が、補正後目標韻律データ206のピッチ周波数として出力される。
目標韻律データ201のピッチ周波数が、特徴点2と3の間だけでなく、特徴点1と2の間または特徴点3と4の間に位置する場合も、上記と同様の考え方によって、2つの特徴点間の内分比が同じになるように、補正後目標韻律データ206のピッチ周波数を算出することができる。
いま、下記のように変数を仮定する。
目標韻律の下側のピッチ特徴点周波数:targ_pitch_feat[pf-1]
目標韻律の上側のピッチ特徴点周波数:targ_pitch_feat[pf]
素片韻律の下側のピッチ特徴点周波数:unitdb.pitch_feat[pf-1]
素片韻律の上側のピッチ特徴点周波数:unitdb.pitch_feat[pf]
補正前の目標韻律のピッチ周波数:pitch
補正後の目標韻律のピッチ周波数:modpit
上述した内分関係より、目標韻律の上側と下側のピッチ特徴点の周波数差と素片韻律の上側と下側のピッチ特徴点の周波数差の比は、補正前のピッチ周波数と目標韻律の下側のピッチ特徴点の周波数差と補正後のピッチ周波数と素片韻律の下側のピッチ特徴点の周波数差は、等しくなる。これより、次式が成立する。
(targ_pitch_feat[pf]-targ_pitch_feat[pf-1])
÷(unitdb.pitch_feat[pf]-unitdb.pitch_feat[pf-1])
=(pitch-targ_pitch_feat[pf-1])
÷(modpit-unitdb.pitch_feat[pf-1])
・・・(1)
ここで、次式のように変数tint,tdist,dintを定義する。
tint=targ_pitch_feat[pf]-targ_pitch_feat[pf-1] ・・・(2)
tdist=pitch-targ_pitch_feat[pf-1] ・・・(3)
dint=unitdb.pitch_feat[pf]-unitdb.pitch_feat[pf-1] ・・・(4)
上記(2)、(3)、(4)式を(1)式に代入すると、次式が得られる。
tint÷dint=tdist÷(modpit-unitdb.pitch_feat[pf-1]) ・・・(5)
この(5)式をさらに変形すると、次式が得られる。
modpit=unitdb.pitch_feat[pf-1]+dint÷tint×tdist ・・・(6)
よって、補正前の目標韻律のピッチ周波数と、このピッチ周波数をはさむ目標韻律の上側と下側のピッチ特徴点の周波数、およびこれらに対応する素片韻律の上側と下側のピッチ特徴点の周波数を用いて、上述の(2)(3)(4)を計算し、さらに(6)式を計算することにより、補正後の目標韻律のピッチ周波数を算出することができる。
いま、図3(a)の目標韻律のピッチ周波数のヒストグラム301と図3(b)の素片韻律のピッチ周波数のヒストグラム302を比較してみる。この場合、図1の入力テキストデータから目標韻律を生成するために使用された図1の韻律辞書104の作成に用いられた音声データの話者の韻律のピッチ周波数の遷移に比較して、音声辞書106中の音声コーパスの作成に用いられた音声データの話者の韻律のピッチ周波数の遷移のほうが、全体的に周波数が低めに遷移していることがわかる。そこで、本実施形態では、目標韻律と素片韻律とで図3(a)の301および図3(b)の302の各ヒストグラム上で、ピッチ周波数の遷移の代表的な特徴点の対応関係を305のように取る。そして、目標韻律データ201のピッチ周波数の目標韻律のピッチ周波数のヒストグラム301上での2つの特徴点間の内分比と同じになるように、素片韻律のピッチ周波数のヒストグラム302上での対応する2つの特徴点間を内分するピッチ周波数を補正後目標韻律データ206とすることにより、目標韻律データ201のピッチ周波数遷移を素片韻律データのピッチ周波数遷移に合わせることが可能となる。
図4は、図3(a)および(b)の例に対応する、補正前目標韻律データ201のピッチ周波数の時間遷移401と補正後目標韻律データ206のピッチ周波数の時間遷移402の関係を示す図である。縦軸(Pitch)がピッチ周波数(Hz)、横軸が時間遷移(ミリ秒)である。補正後目標韻律データ206のピッチ周波数の時間遷移402が、音声コーパス全体で低い周波数で遷移する素片データのピッチ周波数の時間遷移により近くなるように、韻律特徴が補正されていることがわかる。
このようにして、入力テキストデータから生成される補正後目標韻律データ206の韻律遷移を、音声辞書106内の音声コーパスの韻律遷移に合わせることが可能となって、入力テキストデータと素片データとで韻律特徴(言い換えれば例えば話者)が異なっても、素片データを正しく選択して質の良い合成音声を出力することが可能となる。
図2の説明に戻り、素片選定部207において、素片リストアップ部207aは、図1の韻律予測部103から出力されるセグメントデータごとに(以下これを「処理対象セグメントデータ」と記載する)、その処理対象セグメントデータに含まれる音素と一致する音素を有する1つ以上の素片データを、音声辞書106中の音声コーパス内の素片データから選択し、素片候補データ209として出力する。
評価部208内の素片評価部208aは、素片候補データ209ごとに(以下これを「処理対象素片候補データ209」と記載する)、処理対象素片候補データ209の音素を処理対象セグメントデータの音素と比較することによって、処理対象素片候補データ209の音素に関するコストを評価する。具体的には、素片評価部208aは、処理対象セグメントデータの音素とその処理対象セグメントデータの前後のセグメントデータの音素とから構成される音素列と、処理対象素片候補データ209の音素とその処理対象素片候補データ209の前後の素片データの音素とから構成される音素列とを比較することにより、音素列コストを算出する。この音素列コストは、音素列の不一致度を示す。隣接するセグメントデータ間の音素列と隣接する素片データ間の音素列の一致度が高いほど音素列コストが低くなるように、音素列コストが算出される。前後の音素列が一致する素片データを選択したほうが、自然な合成音声が得られるからである。
また、素片評価部208aは、素片候補データ209(処理対象素片候補データ209)ごとに、処理対象素片候補データ209の素片韻律データを、処理対象セグメントデータの補正後目標韻律データ206と比較することにより、処理対象素片候補データ209の韻律に関するコストを評価する。具体的には、素片評価部208aは、処理対象素片候補データ209の補正後目標韻律データ206と処理対象素片候補データ209の素片韻律データとの差に基づいて、韻律コストを算出する。韻律コストは、補正後目標韻律データ206と処理対象素片候補データ209の距離を示す。
そして、素片評価部208aは、音素列コストと韻律コストとの重み付け和のコスト値を、現在の素片候補データ209に対応する素片コストとして算出する。
素片リストアップ部207aは、素片評価部208aが評価した素片コストが低い順に、素片候補データ209を並び替えて、処理対象セグメントデータとリンクさせて出力する。
素片選定部207内の音素列選択部207bは、図1の韻律予測部103から入力するセグメントデータ列の先頭から2番目のセグメント(処理対象セグメントデータ)から順に、以下の処理を順次実行する。
まず、音素列選択部207bは、処理対象セグメントデータに対応する素片候補データ209のグループから1つの素片候補データ209(処理対象素片候補データ209)を選択する。
音素列選択部207bは、処理対象素片候補データ209と、処理対象セグメントデータの前方(時間的に1つ手前)のセグメントデータ(以下これを「前方セグメントデータ」と記載する)の各素片候補データ209(以下これを「前方素片候補データ209」と記載する)との間で、以下のコスト値を計算する。音素列選択部207bは、前方素片候補データ209に至るまでの最良の経路に対するコスト値として確定しているトータルコストと、前方素片候補データ209と処理対象素片候補データ209との間の接続コストとの、重み付き和のコスト値を計算する。
上述の接続コストは、評価部208内の接続評価部208bが計算する。接続評価部208bは、処理対象素片候補データ209と前方素片候補データ209との間の音素接続点での各素片データの音響パラメータ(特徴量ベクトルデータ)の不連続性の大きさを、接続コストとして算出する。より具体的には、接続評価部208bは例えば、上記両者間の各素片データの各特徴量ベクトルデータの組によって算出される各素片データの各スペクトル包絡の距離(例えばケプストラムのユークリッド距離)を、接続コストとして算出する。
音素列選択部207bは、前方素片候補データ209で確定しているトータルコストと、前方素片候補データ209と処理対象素片候補データ209との間の接続コストとの、重み付き和のコスト値が、最も小さい前方素片候補データ209を、処理対象素片候補データ209に対する最良の前方素片候補データ209として記憶する。同時に、音素列選択部207bは、そのときの重み付き和のコスト値を、処理対象素片候補データ209に対する確定したトータルコストとして記憶する。
音素列選択部207bは、処理対象セグメントデータ内の全ての素片候補データ209のうち、上述のトータルコストが最小となる素片候補データ209を記憶する。
その後、音素列選択部207bは、処理対象セグメントデータを1つ後方(時間的に1つ後ろ)に進める。
音素列選択部207bは、最後のセグメントデータまで処理が終わったら、まず、最後のセグメントデータでトータルコストが最小の素片候補データ209を選択し、その後、最後のセグメントデータから先頭のセグメントデータに向かって順次、選択した素片候補データ209に記憶されている最良の前方素片候補データ209を選択してゆく。音素列選択部207bは、このようにして順次選択した素片候補データ209列を、波形合成部107に出力する。
図5は、図1の音声合成装置100をソフトウェア処理として実現できるコンピュータのハードウェア構成例を示す図である。図5に示されるコンピュータは、CPU501、ROM(リードオンリーメモリ:読出し専用メモリ)502、RAM(ランダムアクセスメモリ)503、入力装置504、出力装置505、外部記憶装置506、可搬記録媒体510が挿入される可搬記録媒体駆動装置507、及び通信インタフェース508を有し、これらがバス509によって相互に接続された構成を有する。同図に示される構成は上記システムを実現できるコンピュータの一例であり、そのようなコンピュータはこの構成に限定されるものではない。
ROM502は、コンピュータを制御する音声合成プログラムを含む各プログラムを記憶するメモリである。RAM503は、各プログラムの実行時に、ROM502に記憶されているプログラム又はデータを一時的に格納するメモリである。
外部記憶装置506は、例えばSSD(ソリッドステートドライブ)記憶装置またはハードディスク記憶装置であり、入力テキストデータや合成音声データの保存に用いられる。
CPU501は、各プログラムを、ROM502からRAM503に読み出して実行することにより、当該コンピュータ全体の制御を行う。
入力装置504は、ユーザによるキーボードやマウス等による入力操作を検出し、その検出結果をCPU501に通知する。また、入力装置504は、図1のテキスト入力部101の機能を実行して入力テキストデータを外部から入力し、RAM503または外部記憶装置506に記憶させる。
出力装置505は、CPU501の制御によって送られてくるデータを表示装置や印刷装置に出力する。また、出力装置505は、図1の波形合成部107が外部記憶装置506またはRAM503に出力した合成音声データを、音声として放音する。
可搬記録媒体駆動装置507は、光ディスクやSDRAM、コンパクトフラッシュ等の可搬記録媒体510を収容するもので、外部記憶装置506の補助の役割を有する。
通信インターフェース508は、例えばLAN(ローカルエリアネットワーク)又はWAN(ワイドエリアネットワーク)の通信回線を接続するための装置である。
本実施形態によるシステムは、図1および図2の各処理部の機能を搭載した音声合成プログラムを、ROM502からRAM503に読み出してCPU501が実行することで実現される。そのプログラムは、例えば外部記憶装置506や可搬記録媒体510に記録して配布してもよく、或いはネットワーク接続装置508によりネットワークから取得できるようにしてもよい。
次に、図5のコンピュータが、図1および図2の機能を有する音声合成装置100として動作するために、RAM503または外部記憶装置506上に保持する各種データについて説明する。
図6は、RAM503に保持される制御変数WaveSelectionのデータ構成例を示す図である。制御変数WaveSelectionは、unitdb、seg_count、segment、targ_pf_countのスカラー各変数データと、targ_pitch_feat[0]〜targ_pitch_feat[targ_pf_count-1]の各配列データを保持する。unitdbは、外部記憶装置506上の音声辞書106に記憶される音声辞書データへのポインタを保持する。seg_countは、セグメントデータの総数を保持する。segmentは、最初のセグメントデータ(後述する図7のsegment[0]の先頭アドレス)へのポインタを保持する。targ_pf_countは、入力テキストデータ全体にわたる目標韻律データ201(図2)のピッチ特徴点の数を保持する。前述した図3(a)では、targ_pf_count=4である。targ_pitch_feat[0]からtarg_pitch_feat[targ_pf_count-1]は、目標韻律データ201(図2)の1番目からtarg_pf_count番目の各ピッチ特徴点(単位はcent)を保持する。targ_pitch_feat[0]〜targ_pitch_feat[targ_pf_count-1]は、図2の目標韻律ピッチ特徴点抽出部203によって抽出され、制御変数WaveSelectionにセットされている。
図7は、図6の制御変数WaveSelection内のsegmentポインタから参照されRAM503または外部記憶装置506に保持されるセグメントデータsegment[0]〜segment[seg_count]のデータ構成例を示す図である。各セグメントデータは、入力テキストデータを図1の形態素解析部102で形態素解析して得られる合計seg_count個(制御変数WaveSelectionのseg_countに保持される個数)の音素ごとに、図1の韻律予測部103によって、segment[0],segment[1],・・・,segment[seg_count-1]として得られる。セグメントデータの記憶アドレスは、制御変数WaveSelectionのsegmentによって示される。各セグメントデータsegment[i](i=0,・・・,seg_count-1)は、seg_id、phone_id、target_prosody、candidate、best_cand、prev、nextの各変数データを保持する。seg_idは、セグメントID(識別子)を保持する。phone_idは、音素IDを保持する。target_prosodyは、RAM503または外部記憶装置506に保持される目標韻律データ201の先頭へのポインタを保持する。candidateは、最初の素片候補データ209(後述する図10のcandidate[0]の先頭アドレス)へのポインタを保持する。best_candは、図2の音素列選択部207bに対応する処理によって現在のセグメントデータに対応してする選択される最良の素片候補データ209(後述する図9の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値を保持する。
図8は、図7の各セグメントデータ内のtarget_prosodyポインタまたは後述する図11の各素片データ内のprosodyポインタから参照されRAM503または外部記憶装置506に記憶される韻律データ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値を保持する。
図9は、図7のセグメントデータ内のtarget_prosodyポインタから参照されRAM503または外部記憶装置506に記憶される図2の素片候補データ209である素片候補データcandidate[0],candidate[1],・・・,candidate[N],・・・のデータ構成例を示す図である。各素片候補データcandidate[i](i=0,・・・,N,・・・)は、図2のリストアップ部で生成され、unit_id,ctxt_distance,pros_distance,unit_distance, cont_distance,total_cost,best_cand,prev,nextの各変数データを保持する。unit_idは、音声辞書106内の素片データを識別するための素片ID(図12参照)を保持し、図2の素片リストアップ部207aによりセットされる。ctxt_distanceは、前述した音素列コスト(音素列の不一致度)を保持し、図2の素片評価部208aによって算出されセットされる。pros_distanceは、前述した韻律コスト(目標韻律データ201と素片韻律データの距離)を保持し、図2の素片評価部208aによって算出されセットされる。unit_distanceは、音素列コストと韻律コストの重み付け和である前述した素片コストを保持し、図2の素片評価部208aによって算出されセットされる。cont_distanceは、前述した接続コスト(音素接続点での特徴量距離)を保持し、図2の接続評価部208bによって算出されセットされる。total_costは、先頭のセグメントデータからこの素片候補データが属するセグメントデータまでに確定したトータルコストを保持し、前述したように図2の音素列選択部207bにより算出されセットされる。best_candは、この素片候補データと接続する最良の前方素片候補データへのポインタを保持し、前述した音素列選択部207bによって算出されセットされる。ここで、前方素片候補データは、best_candが含まれる素片候補データ(処理対象素片候補データ)が属するセグメントデータ(処理対象セグメントデータ)の1つ手前のセグメントデータ(前方セグメントデータ)に属する素片候補データであって、その前方素片候補データで確定しているトータルコストと、処理対象素片候補データとの間の接続コストとの、重み付き和のコスト値が、最も小さい(最良の)前方素片候補データである。prevは1つ手前の素片候補データへのポインタ、nextは1つ後ろの素片候補データへのポインタを保持する。現在の素片候補データが、先頭データであればprevはNULL値を保持し、末端データであればnextはNULL値を保持する。
図10は、図1の音声辞書106を構成するRAM503または外部記憶装置506に記憶される音声辞書データunitdbのデータ構成例を示す図であり、図6の制御変数WaveSelectionのunitdbポインタから参照される。音声辞書データunitdbは、phone_count、phoneme、unit_count、unit、fval_count、pf_countの各変数データ、およびpitch_feat[0]〜pitch_feat[pf_count-1]の各配列変数データを保持する。phone_countは、この音声辞書データunitdbで定義されている音素数を保持する。phonemeは、先頭の音素データ(図12のphoneme[0]の先頭アドレス)へのポインタを保持する。unit_countは、この音声辞書データunitdbが搭載する素片データの数を保持する。unitは、この音声辞書データunitdbが搭載する先頭の素片データ(図12のunit[0]の先頭アドレス)へのポインタを保持する。pf_countは、素片データのピッチ特徴点の数を保持する。図3(b)の例では、pf_count=4である。pitch_feat[0]〜pitch_feat[pf_count-1]は、音声辞書データunitdb全体にわたる素片データの1番目からpf_count番目までの各ピッチ特徴点(単位はcent)を保持する。pitch_feat[0]〜pitch_feat[pf_count-1]は、図2の素片韻律ピッチ特徴点抽出部204によって抽出されている。
図11は、図1の音声辞書106を構成するRAM503または外部記憶装置506に記憶される素片データunit[0]〜unit[unit_count-1]のデータ構成例を示す図であり、図10の音声辞書データunitdbのunitポインタから参照される。音声辞書106への搭載素片数unit_countは、図10の音声辞書データunitdbのunit_countデータとして登録される。各素片データunit[i](i=0,・・・,unit_count-1)は、unit_id, phone_id,duration,prosody,prev,nextの各変数データと、featvalue[0]〜featvalue[fval_count-1]の各配列変数データを保持する。unit_idは、素片データを識別するための素片IDを保持する。phone_idは、この素片データに対応付けられる音素を図12で後述する音素データから特定するための音素IDを保持する。durationはこの素片データがどれだけの時間長だけ継続しているかを示す継続長を保持する。prosodyは、図7のデータ構成例を有する、RAM503または外部記憶装置506に保持される素片韻律データの先頭へのポインタを保持する。featvalue[0]〜featvalue[fval_count-1]は、1番目からfval_count番目までの後述する図13に示されるデータ構成例を有する特徴量ベクトルデータの先頭データへのポインタを保持する。prevは1つ手前の素片データへのポインタ、nextは1つ後ろの素片データへのポインタを保持する。現在の素片データが、先頭データであればprevはNULL値を保持し、末端データであればnextはNULL値を保持する。
図12は、図10の音声辞書データunitdb内のphonemeポインタから参照されRAM503または外部記憶装置506に記憶される音素データphoneme[0]〜phoneme[phone_count-1]のデータ構成例を示す図である。音素データの数は、音声辞書データunitdbのphone_countデータにセットされている。各音素データphoneme[i] (i=0,・・・,phone_count-1)は、phone_id,phomene,prev,nextの各変数データを保持する。phone_idは、音素を識別するための音素IDを保持する。前述した図7のセグメントデータまたは前述した図11の素片データは、その中のphone_idデータによって、図6の制御変数WaveSelection内のunitdb→図10の音声辞書データunitdb内のphoneme→図12の音素データphoneme[0]〜phoneme[phone_count-1]のうち上記phone_idの値が格納されている音素データとたどって、その音素データ内の音素名phomeneと関連付けられる。phomeneは音素名を保持する。prevは1つ手前の音素データへのポインタ、nextは1つ後ろの音素データへのポインタを保持する。現在の音素データが、先頭データであればprevはNULL値を保持し、末端データであればnextはNULL値を保持する。
図13は、図12の各素片データ内のfeatvalue[i] (i=0,・・・,fval_count-1)ポインタから参照されRAM503または外部記憶装置506に記憶される特徴量ベクトルデータ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との間の音素接続点での各素片データの各スペクトル包絡の距離を算出するために使用される。
図14は、図2の韻律補正部205に対応する機能を、図5のハードウェア構成例を有するコンピュータのCPU501が、ソフトウェアプログラムの処理により実現する場合の、韻律補正処理の例を示すフローチャートである。以下に説明する処理はすべてCPU501が実行する処理である。
まず、RAM503上の変数データsegに、前述した図6のデータ構成例を有する制御変数WaveSelection内のsegmentデータの値が格納される(ステップS1401)。この値は、図7のデータ構成例を有するセグメントデータの最初のセグメントデータsegmen[0]の先頭アドレスへのポインタである。
次に、seg変数の値が未定義値NULLでないか否か、すなわち図7の全てのセグメントデータsegment[0]〜segment[seg_count]が処理されたか否かが判定される(ステップS1402)。
全てのセグメントデータの処理が完了しておらずseg変数の値が未定義値NULLではなくてステップS1402の判定がYESならば、RAM503上の変数prosに、変数segが示す前述した図7のデータ構成例を有するセグメントデータ中のtarget_prosodyデータの値が格納される。この値は、図8のデータ構成例を有する目標韻律データ201の最初のデータprosody[0]の先頭アドレスへのポインタである。
続いて、pros変数の値が未定義値NULLでないか否か、すなわち図8の全ての目標韻律データprosody[0],prosody[1],・・・,prosody[N],・・・が処理されたか否かが判定される(ステップS1404)。
pros変数の値が未定義値NULLでなくステップS1404の判定がYESならば、以下に説明するステップS1405からS1419までの一連の処理が実行されることにより、pros変数が示す目標韻律データ内のpitchデータ(図8参照)を補正する韻律補正の処理が実行される。
現在の目標韻律データに対する韻律補正の処理が終了すると、pros変数が示す目標韻律データ内のnextポインタ(図8参照)が示す次の目標韻律データへのポインタ値が、新たにpros変数にセットされ(ステップS1419)、ステップS1404の判定に戻る。図8の説明で前述したように、末尾の目標韻律データのnextポインタには未定義値NULLが格納されている。このため、末尾の目標韻律データに対して韻律補正の処理が実行された後にステップS1419が実行されると、pros変数の値はNULL値となる。これにより、末尾の目標韻律データまで韻律補正の処理が完了すると、ステップS1404の判定がNOとなる。
現在のセグメントデータに対する全ての目標韻律データに対する韻律補正の処理が終了してステップS1404の判定がNOになると、seg変数が示すセグメントデータ内のnextポインタ(図7参照)が示す次のセグメントデータへのポインタ値が、新たにseg変数にセットされ(ステップS1420)、ステップS1402の判定に戻る。図7の説明で前述したように、末尾のセグメントデータのnextポインタには未定義値NULLが格納されている。このため、末尾のセグメントデータに対して全ての韻律データに対する韻律補正の処理が実行された後にステップS1404の判定がNOとなってステップS1420が実行されると、seg変数の値はNULL値となる。これにより、末尾のセグメントデータまで韻律補正の処理が完了すると、ステップS1402の判定がNOとなって、入力テキストデータに対応するセグメントデータ全体に対する韻律補正の処理が完了する。
ステップS1405からS1419までの韻律補正の処理について、以下に説明する。
まず、pros変数が示す図8のデータ構成例を有する目標韻律データのpitchデータすなわち音高データが、0よりも大きいか否かが判定される(ステップS1405)。
pitchデータがゼロでステップS1405の判定がNOならば、韻律補正の処理は実行せずにステップS1419に進んで、次の韻律データに対する処理に進む。
pitchデータがゼロよりも大きくステップS1405の判定がYESならば、そのpitchデータが、1オクターブの1200分の1を示す単位であるcent値に変換される(ステップ1406)。
その後、RAM503上の変数pfに値0がセットされる(ステップS1407)。pf変数は、図3で説明したピッチ特徴点(例えば1〜4)を順次指定するための変数であり、pf=0ならば周波数が最も低いピッチ特徴点(図3の例ではピッチ特徴点1)が指定される。また、前述したように、図6に例示される制御変数WaveSelection内のtarg_pf_countデータは、目標韻律のピッチ特徴点の数を示している。従って、ステップS1410でpf変数の値が順次+1ずつインクリメントされながら、pf変数の値がtarg_pf_count-1になったときに、周波数が最も高いピッチ特徴点(図3の例ではピッチ特徴点4)が指定される。
ステップS1407の後、pf変数の値が上述の制御変数WaveSelection内のtarg_pf_countデータの値よりも小さいか否かが判定される(ステップS1408)。
ステップS1408の判定がYESならば、現在の韻律データ中のpitchデータが、図6に例示される制御変数WaveSelectionに格納されている、pf変数の値pfによって指定される目標韻律のpf+1番目のピッチ特徴点の周波数targ_pitch_feat[pf]よりも小さいか否かが判定される(ステップS1409)。ここでは、pf=0である場合のピッチ特徴点を1番目のピッチ特徴点と考える。
pitchデータが目標韻律のpf+1番目のピッチ特徴点の周波数targ_pitch_feat[pf]よりも小さくはなくステップS1409の判定がNOならば、ピッチ特徴点が1つ高い周波数に移されて、ステップS1408とS1409の判定が繰り返される。
いま例えば図3で説明したように、pitchデータが目標韻律の2番目と3番目のピッチ特徴点の間に位置するときには、pf=2のときにステップS1409の判定がYESとなる。
次に、pf=0であるか否かが判定される(ステップS1411)。pf=2の場合にはステップS1411の判定はNOとなる。
その後、図3の説明で前述した、(2)式の計算(ステップS1412)、(3)式の計算(ステップS1413)、(4)式の計算(ステップS1414)、および(6)式の計算(ステップS1415)が実行される。この結果、変数modpitの値として、pitchデータに対する韻律補正後のピッチデータが算出される。
このようにして得られたmodpit変数値がcent値に変換された後、その変換結果値によって、pros変数が示す目標韻律データのpitchデータが置き換えられる(ステップS1416)。
ステップS1416の処理の後、ステップS1419が実行されて、次の目標韻律データに処理が移る。
pitchデータが、1番目の目標韻律のピッチ特徴点よりも低い周波数である場合、ステップS1411の判定がYESになる。この場合には、pitchデータの周波数よりも下側の周波数域にはピッチ特徴点は存在しないため、前述した図3の内分点計算はできない。そこで近似的に、目標韻律の1番目のピッチ特徴点の周波数WaveSelection.target_pitch_feat[0]からpitchデータ値までの周波数差と同じ周波数だけ、素片韻律の1番目のピッチ特徴点の周波数unitdb.pitch_feat[0]から移動させられた周波数が、補正後の目標韻律のピッチ周波数modpitとして算出される(ステップS1417)。
ステップS1417の処理の後、ステップS1419が実行されて、次の目標韻律データに処理が移る。
pitchデータが、最も高い周波数の目標韻律のピッチ特徴点よりも高い周波数である場合、ステップS1408の判定がNOになる。この場合には、pitchデータの周波数よりも上側の周波数域にはピッチ特徴点は存在しないため、やはり前述した図3の内分点計算はできない。そこで近似的に、目標韻律の最後のピッチ特徴点の周波数WaveSelection.target_pitch_feat[WaveSelection.targ_pf_count-1]からpitchデータ値までの周波数差と同じ周波数だけ、素片韻律の最後のピッチ特徴点の周波数unitdb.pitch_feat[unitdb.pf_count-1]から移動させられた周波数が、補正後の目標韻律のピッチ周波数modpitとして算出される(ステップS1418)。
ステップS1418の処理の後、ステップS1419が実行されて、次の目標韻律データに処理が移る。
以上の韻律補正処理によって、入力テキストデータから生成される補正後目標韻律データ206の韻律遷移を、音声辞書106内の音声コーパスの韻律遷移に合わせることが可能となって、入力テキストデータと素片データとで韻律特徴(言い換えれば例えば話者)が異なっても、素片データを正しく選択して音声辞書106の音声コーパスの話者に合わせた、質の良い合成音声を出力することが可能となる。
以上の実施形態に関して、更に以下の付記を開示する。
(付記1)
入力テキストデータから生成される音素及び目標韻律に基づいて、音声コーパスを参照することにより音声素片を選択し、当該選択された音声素片を接続することにより合成音声を出力する音声合成装置において、
前記目標韻律からピッチ特徴点を抽出する目標韻律ピッチ特徴点抽出部と、
前記選択された音声素片中の韻律情報である素片韻律からピッチ特徴点を抽出する素片韻律ピッチ特徴点抽出部と、
前記目標韻律から抽出されたピッチ特徴点と前記素片韻律から抽出されたピッチ特徴点との対応関係に基づいて、前記目標韻律を補正する韻律補正部と、
を備えることを特徴とする音声合成装置。
(付記2)
前記目標韻律ピッチ特徴点抽出部または素片韻律ピッチ特徴点抽出部はそれぞれ、前記目標韻律または前記素片韻律のピッチ周波数のヒストグラムを算出し、当該ヒストグラムから頻度値が極大を示す1つ以上の周波数と前記頻度値が概略ゼロに収束する1つ以上の周波数をそれぞれ、前記ピッチ特徴点として抽出する、
ことを特徴とする付記1に記載の音声合成装置。
(付記3)
前記韻律補正部は、前記目標韻律中のピッチ周波数が前記目標韻律から抽出された相互に隣接するいずれか2つの前記ピッチ特徴点の周波数の間に任意の内分比で位置する場合に、前記目標韻律から抽出された2つの前記ピッチ特徴点にそれぞれ対応する前記素片韻律から抽出された2つの前記ピッチ特徴点の周波数を前記内分比と同じ内分比で内分して得られる周波数になるように、前記目標韻律中のピッチ周波数を補正する、
ことを特徴とする付記2に記載の音声合成装置。
(付記4)
入力テキストデータから生成される音素及び目標韻律に基づいて、音声コーパスを参照することにより音声素片を選択し、当該選択された音声素片を接続することにより合成音声を出力する音声合成装置に用いられる音声合成方法であって、前記音声合成装置が、
前記目標韻律からピッチ特徴点を抽出し、
前記選択された音声素片中の韻律情報である素片韻律からピッチ特徴点を抽出し、
前記目標韻律から抽出されたピッチ特徴点と前記素片韻律から抽出されたピッチ特徴点との対応関係に基づいて、前記目標韻律を補正する、
ことを特徴とする音声合成方法。
(付記5)
入力テキストデータから生成される音素及び目標韻律に基づいて、音声コーパスを参照することにより音声素片を選択し、当該選択された音声素片を接続することにより合成音声を出力する音声合成プログラムにおいて、
前記目標韻律からピッチ特徴点を抽出するステップと、
前記選択された音声素片中の韻律情報である素片韻律からピッチ特徴点を抽出するステップと、
前記目標韻律から抽出されたピッチ特徴点と前記素片韻律から抽出されたピッチ特徴点との対応関係に基づいて、前記目標韻律を補正するするステップと、
をコンピュータに実行させるための音声合成プログラム。