初音ミクとかの音声合成のしくみ

2007年に「初音ミク」という歌声合成ソフトがブレイクしました。
そこで、わけもなく「音声合成のしくみ」を簡単に解説します。
とはいっても、VOCALOIDシリーズは手法が明かされていないので、
かなり推測が入っています。

その推測した部分が誤っていたので、
この色で加筆します(2008年3月29日)。
誤っている部分もそのまま残してあります。
また、手法もかなり明かされているようです。

ところで、結構たくさん図がありますが、
あまり正確ではありません。
また、内容そのものもかなり簡易化してあります。

音声合成って何?

まずは音声合成とはなんぞやという話なのですが、
一般的には、文字を音声信号にすることです。
イメージとしてはこんな感じです。

初音ミクの場合、そこに音程や音の長さやその他いろいろも入ってくるので、
イメージとしてはこうなります。

音声波形を拡大してみる

一般に、音声波形はなじみが薄いと思うので、
一応お見せします。

「たぬき」と言っています。
(「pau」の部分は無音だと思ってください。)
これを時間方向に拡大してみると、こうなります。

似たような波形が周期的に連なっているのが分かると思います。
そして、連続的に変化していることも分かると思います。
これは「ぬ」の一部です(本当はもう少し前後に長い)。

また、「た」の「t」の部分はこうなっています。

雑音っぽい音だと見てとれます。
音声は、変化する周期波形と雑音っぽい波形でできています。

VOCALOIDに関する推測

初音ミクはVOCALOID2で、KAITOはVOCALOID(1)だそうですが、
「1」と「2」ではかなり音の質が違います。
「2」の方が自然に聞こえるとは思いますが、
「1」が好きという人もいるはずです。

これは、推測になってしまうのですが、
「1」と「2」では合成方法がかなり違うはずです。
それぞれ「HMM合成法」と「素片接続法」なのではないかと思います。

その推測は間違いでした。
音声合成が専門の方からのコメントによれば、両方とも「素片接続法」だそうです。
文献を読んでも何がどちらに対応しているのかが分からなかったので、
この青い字の説明のところは基本的に、
「2」の初音ミクについてのものだと思ってください。

とりあえず、このページでは、
初音ミク(「2」)が使っていると思われる「素片接続法」から説明します。
そのあとでKAITOが使っていると思われる「HMM合成法」を説明します。

そういうわけで、KAITOについては説明しません。

素片接続法

初音ミクが使っていると思われる素片接続法ですが、
考え方はものすごくシンプルです。

こんな感じに、
これぞと思われる波形素片を持ってきて、
適切と思われる接続をします。

くっつける単位

まず問題になってくるのは、その「素片」の長さです。
「ひらがな一文字分」「ローマ字一文字分」などいろいろ考えられますが、
多分、一周期分の波形のはずです。

初音ミクは、一周期ではなくてもっと長いです。

一周期というのは、ここからここまでです。

(ただし本当はもう少し前後に長めにとります。)

この素片を「どう選ぶか」と「どう接続するか」が、
素片接続法のポイントとなります。

問題の分離

さて、このあたりで人間の声の性質について簡単に説明しましょう。

人間の声は、
「音韻性」と「その他(音の高さ・強さなど)」
に分けることができます。

「音韻性」というのは、
例えば「あ・い・う・え・お」のどれを言っているのか、
とかそういうことです。

音声合成でも、問題をまずこの二つに分けます。
そして、詳しい説明は省きますが、
「素片の選択」が「音韻性」を左右し、
「接続」が「音の高さや強さ」を左右します。

初音ミクの場合、
素片そのものに手を加えて音の高さを調節しているようです。

素片を選ぶ

合成したい音韻が得られるように素片の選択をおこないます。
単純にいえば、「あ」を合成したかったら、
「あ」の素片を選ぶということです。
このとき、音の大きさや音の高さを考慮する必要は、あまりありません。
(厳密にいえば、必要はあるのですが。)

この素片ですが、
「子音→母音」の単位や、
「母音→子音」の単位で、
データベース化されていることが多いです。

初音ミクもそういう単位でデータベース化しているようです。
書き忘れていましたが、「母音→母音」もあります。

日本語の場合は母音が5で子音が20くらいですから、
200種類くらいのデータベースが少なくとも必要です。
でも、実際にはそう単純でもなく、中間の音なども考慮します。

子音と母音

母音に時間的な幅があるということは、
おそらく感覚的に分かると思いますが、
子音にも時間が費やされています。

注目すべきは、子音にかける割合が発音ごとに異なるということです。
なので、子音と母音の時間的な割合を考慮する必要があります。
声の聞こえ方はこの割合にもかなり左右されます。

それぞれの音の長さ

歌声を合成するときには考慮する必要がないのですが、
日本語の文字列は等間隔には発声されていません。
「たぬき」などと言うときも、
「た」「ぬ」「き」でかなり音の長さが違います。

この音の長さにも、声の自然さがかなり左右されます。

声の高さ

声には有声音と無声音がありますが、
無声音には音の高さがなく、
有声音には音の高さがあります。
音の高さというのは、音韻性とは別のものです。
具体的には、素片と素片の時間的な幅で決まってきます。
合成するときには、
選んだ素片と素片の時間的な幅を調整して、
音の高さを作り出します。

ビブラートなどは、この時間的な幅を揺らすことで作り出すことができます。

この音の高さなのですが、初音ミクの場合、
そう簡単には説明できない手法で作り出されています。
「周波数領域の調波構造の間隔をいじっています」と書いても、
よく分からないと思うので説明しません。

音の大きさは、単純に素片の大きさで決まります。

アクセント

歌声の合成には関係ありませんが、
日本語にはそれぞれの単語にアクセントがあり、
それは音の高低によって決まります。

また、基本傾斜のような現象もあり、
日本語の場合はだいたい下がっていきます。

これを組み合わせると、こんな感じになります。

この音の高さの調整が声の自然さのかなりの部分を左右します。

アクセントなどの推定

歌声の場合には推定する必要がないのですが、
普通の音声合成の場合には、
音の高さの指定がないので、
文字列からアクセントやイントネーションなどを推定する必要があります。
おそろしく難しいです。

素片の接続

持ってくる素片と、素片の大きさと、素片と素片の幅が決まったら、
そのとおりにつなぎ合わせます。
これは本当につなぎ合わせます。
重なった部分は足し合わせます。

素片接続のまとめ

音韻性を考慮して素片を決め、
音の高さを考慮して素片と素片の幅を決め、
データベースから持ってきた素片を単純につなぎ合わせます。

初音ミクの場合、「周波数領域」で音の高さを変えています。

HMM合成法

続いて、VOCALOID(1)のKAITOの「HMM合成法」です。

嘘です。KAITOについてはよく分かりません。
そういうわけで、以下の文章は「素片接続法」ではない音声合成の方法もあるのだ、
ということを説明しているにすぎません。

手法の名称に「HMM(隠れマルコフモデル)」という見慣れない用語が冠されていますが、
これについては説明しません。

音声に対する考え方は、素片接続法とほぼ同じです。
「音韻性」と「音源」の二つの組み合わせで、
音声を合成するのですが、
数学的なアプローチがまるで違います。

以下、素片接続と異なる部分のみを説明します。

物理的なモデル

声の出し方は下のような図でモデル化されます。
細長い管が「声道(のどから口までの空間)」を表していて、
そこに音源の音が入ってくる感じです。

声道の形状が変化すると、音韻性が変化し、
音源が変化すると、音の高さや強さなどが変化します。

数式モデルにする

コンピュータでこれを扱うには数式モデルにする必要があります。
具体的な数式は示しませんが、
いろいろとややこしいフィルタを使います。
フィルタが音韻性に対応します。
(携帯電話も似たような方式で音声を符号化しています。)

音源の信号はかなり簡単なものになります。
代表的な音源の信号はパルス列(有声音)や白色ノイズ(無声音)です。

ただし、VOCALOID(1)がぴったりこういう方式かどうかは分かりません。
でも、だいたい似たような考え方のはずです。

VOCALOID(1)は素片接続法だそうなので、この説明は関係ないです。

要するに、音源が入力変数で、フィルタが関数で、合成音声が返り値だと思えば、
プログラミング言語を少しでも触ったことがある人は分かると思います。

フレームに切る

「音源の信号」と「フィルタの特性」を適切に決めると音声合成ができます。
ただし、ここで、
「音韻性は時々刻々と変化する」
にもかかわらず、
「フィルタの特性を変化させるのは難しい」
という問題が出てきます。

ということで、細切れの音声合成をおこなっておいて、
あとでその細切れの音声をつなげるということをします。

ただし、一周期ごとの合成ではなく、
一定時間ごとの合成です。

音源とフィルタ

この部分に関しては、素片接続法と内容がかなりかぶるので、
細かい説明はしません。
音源は有声音の場合は「音の強さ」「音の高さ」を参考に、
パルス列などを並べます。
無声音の場合は「音の強さ」を考慮して白色ノイズを用います。

フィルタは音韻性に対して最適になるように、
パラメータを選びます。
このときにHMM(隠れマルコフモデル)と呼ばれるモデルを使うことが多いので、
HMM合成法という名前がついています。

HMM合成法のまとめ

素片接続とは異なり、素片のデータベースは使いません。
全て一から合成しています。
音源としては、パルス列・白色ノイズなどを用います。
フィルタはHMM(隠れマルコフモデル)によって決定します。

素片接続法とHMM合成法との違い

決定的な違いは、素片データベースを使うかどうかです。
素片接続法は、メモリ容量を食います。
HMM合成法は、音質がしばしば金属的になります。
ただし、当然ですが、HMM合成法もパラメータの事前学習はおこないます。

歌声合成と一般的な音声合成の違い

歌声合成には音の高さと音の強さと歌詞を入力しますが、
一般的な音声合成には、大抵、文字しか入力しません。
音の高さや強さを推測するかどうかが大きな違いです。

まとめ

音声合成の一般的な方法を簡単に紹介しました。
「素片接続法」と「HMM合成法」について説明しました。
それぞれVOCALOID2とVOCALOID(1)に対応していると推測されます。

音声合成が専門の方のコメントによれば、どちらも「素片接続法」だそうです。

関連ページ

初音ミクの公式ページ
VOCALOIDに関する論文(2008年3月29日追加)
その他、参考文献など(ブログ)

更新履歴

2008/02/08:ページ作成
2008/02/11:「HMM」が「隠れマルコフモデル」であることを明記
2008/03/29:VOCALOIDに関する誤りを青い字で大幅に訂正
2013/11/29:関連ページを修正

inserted by FC2 system