2007年に「初音ミク」という歌声合成ソフトがブレイクしました。
そこで、わけもなく「音声合成のしくみ」を簡単に解説します。
とはいっても、VOCALOIDシリーズは手法が明かされていないので、
かなり推測が入っています。
その推測した部分が誤っていたことが分かりました。
詳しくは、こちらをご覧ください。
後日、訂正すべき箇所を訂正します。
ところで、結構たくさん図がありますが、
あまり正確ではありません。
また、内容そのものもかなり簡易化してあります。
初音ミクの場合、そこに音程や音の長さやその他いろいろも入ってくるので、
イメージとしてはこうなります。
「たぬき」と言っています。
(「pau」の部分は無音だと思ってください。)
これを時間方向に拡大してみると、こうなります。
似たような波形が周期的に連なっているのが分かると思います。
そして、連続的に変化していることも分かると思います。
これは「ぬ」の一部です(本当はもう少し前後に長い)。
また、「た」の「t」の部分はこうなっています。
雑音っぽい音だと見てとれます。
音声は、変化する周期波形と雑音っぽい波形でできています。
これは、推測になってしまうのですが、
「1」と「2」では合成方法がかなり違うはずです。
それぞれ「HMM合成法」と「素片接続法」なのではないかと思います。
とりあえず、このページでは、
初音ミク(「2」)が使っていると思われる「素片接続法」から説明します。
そのあとでKAITOが使っていると思われる「HMM合成法」を説明します。
こんな感じに、
これぞと思われる波形素片を持ってきて、
適切と思われる接続をします。
(ただし本当はもう少し前後に長めにとります。)
この素片を「どう選ぶか」と「どう接続するか」が、
素片接続法のポイントとなります。
人間の声は、
「音韻性」と「その他(音の高さ・強さなど)」
に分けることができます。
「音韻性」というのは、
例えば「あ・い・う・え・お」のどれを言っているのか、
とかそういうことです。
音声合成でも、問題をまずこの二つに分けます。
そして、詳しい説明は省きますが、
「素片の選択」が「音韻性」を左右し、
「接続」が「音の高さや強さ」を左右します。
この素片ですが、
「子音→母音」の単位や、
「母音→子音」の単位で、
データベース化されていることが多いです。
日本語の場合は母音が5で子音が20くらいですから、
200種類くらいのデータベースが少なくとも必要です。
でも、実際にはそう単純でもなく、中間の音なども考慮します。
注目すべきは、子音にかける割合が発音ごとに異なるということです。
なので、子音と母音の時間的な割合を考慮する必要があります。
声の聞こえ方はこの割合にもかなり左右されます。
この音の長さにも、声の自然さがかなり左右されます。
ビブラートなどは、この時間的な幅を揺らすことで作り出すことができます。
音の大きさは、単純に素片の大きさで決まります。
また、基本傾斜のような現象もあり、
日本語の場合はだいたい下がっていきます。
これを組み合わせると、こんな感じになります。
この音の高さの調整が声の自然さのかなりの部分を左右します。
音声に対する考え方は、素片接続法とほぼ同じです。
「音韻性」と「音源」の二つの組み合わせで、
音声を合成するのですが、
数学的なアプローチがまるで違います。
以下、素片接続と異なる部分のみを説明します。
声道の形状が変化すると、音韻性が変化し、
音源が変化すると、音の高さや強さなどが変化します。
音源の信号はかなり簡単なものになります。
代表的な音源の信号はパルス列(有声音)や白色ノイズ(無声音)です。
ただし、VOCALOID(1)がぴったりこういう方式かどうかは分かりません。
でも、だいたい似たような考え方のはずです。
要するに、音源が入力変数で、フィルタが関数で、合成音声が返り値だと思えば、
プログラミング言語を少しでも触ったことがある人は分かると思います。
ということで、細切れの音声合成をおこなっておいて、
あとでその細切れの音声をつなげるということをします。
ただし、一周期ごとの合成ではなく、
一定時間ごとの合成です。
フィルタは音韻性に対して最適になるように、
パラメータを選びます。
このときにHMM(隠れマルコフモデル)と呼ばれるモデルを使うことが多いので、
HMM合成法という名前がついています。