音声合成を1から — テキストから声まで
数文字のテキストから、その数万倍の長さの波形をでっちあげる——それが音声合成です。素直な回帰がなぜ破綻するのか(一対多と位相)、なぜテキスト→メルスペクトログラム→波形の二段構えが定番になったのか、そして数秒の参照音声で声色が移る仕組みまでを前提知識ゼロから解説します。
WaveNet: A Generative Model for Raw Audio
一次資料 — この記事の根拠
この解説の公開 2026-08-26
WaveNet: A Generative Model for Raw AudioarXiv:1609.03499論文ページ·PDFNatural TTS Synthesis by Conditioning WaveNet on Mel Spectrogram PredictionsarXiv:1712.05884論文ページ·PDF
FastSpeech 2: Fast and High-Quality End-to-End Text to SpeecharXiv:2006.04558論文ページ·PDF
HiFi-GAN: Generative Adversarial Networks for Efficient and High Fidelity Speech SynthesisarXiv:2010.05646論文ページ·PDF
Conditional Variational Autoencoder with Adversarial Learning for End-to-End Text-to-SpeecharXiv:2106.06103論文ページ·PDF
Neural Codec Language Models are Zero-Shot Text to Speech SynthesizersarXiv:2301.02111論文ページ·PDF
「声を作る」とは何を作ることか
音声合成(TTS: Text-To-Speech)の出力は、突き詰めれば数字の列です。スピーカーの振動板が前後に動く量を、一定間隔で測った値を並べたもの。それだけです。
音声合成でよく使われるサンプリング周波数は 22,050 Hz や 24,000 Hz。つまり1秒しゃべらせるには2万個以上の数値を、正しい順番で、正しい大きさで並べる必要があります。「こんにちは」と1.5秒かけて言わせるなら、入力は5文字、出力は3万6千個の数値です。入力の7千倍の長さのものを、無から作る——これが音声合成という仕事の正体です。
音声認識を1からで扱ったのは、ちょうど逆向きの仕事でした。数万個の数字を数文字に畳む。畳むのは情報を捨てる作業なので、細部が多少ずれても答えは同じ文字に落ちます。膨らませる方はそうはいきません。捨てるものがない代わりに、足りない情報を全部でっちあげる必要がある。
素直な回帰が破綻する3つの理由
1つめは、長さを誰も教えてくれないこと。 文字は「どれくらいの時間をかけて発音するか」の情報を持っていません。「あ」は0.05秒にも1秒にもなります。テキスト側に手がかりがないこの長さを、モデルが自分で決めなければならない。
2つめは、正解が1つではないこと。 「明日は晴れです」の読み方は無数にあります。速さ、間の取り方、どこを高く言うか。ところが訓練データにはそのうちの1通りしか入っていません。ここで「正解の音声との二乗誤差を最小にせよ」と素直に命じると、モデルはありうる全部の読み方の平均を出すのが最も損をしない、と学習します。平均された音声は輪郭がぼやけ、こもった声になります。生成モデル一般で over-smoothing と呼ばれる現象です。
対策は、1つの正解を当てにいくのをやめて、分布を作ってそこから引くことです。そして分布の尖り具合が、そのまま読み上げの表情になります。
3つめは、位相です。 人間の耳は、波の「ずれ」にほとんど鈍感です。ある音を1000分の1秒ぶんずらして鳴らしても、同じ音に聞こえる。ところが数値の列としては、ずらした波形は元の波形とまったく別物です。つまりサンプルごとの二乗誤差は、聞こえ方とほとんど対応しません。耳に同じでも損失は巨大、耳に別物でも損失は小さい、ということが平気で起きる。波形をそのまま学習の的にしてはいけない、いちばん深い理由がこれです。
分割統治: 二段構えという発明
この3つを一度に相手にするのは無理がある、というのが現代のTTSが出した答えです。仕事を2つに割ります。
テキスト ──[音響モデル]──▶ メルスペクトログラム ──[ボコーダ]──▶ 波形
前半は「何を、どんな抑揚で、どれくらいの長さで読むか」という言語の問題。後半は「その音色を実際の空気の震えにする」という信号の問題です。分けるとご利益が2つあります。後半は言語にも話者にも依存しないので、テキストのない大量の音声だけで訓練でき、いろいろな前半と組み合わせて使い回せます。そして前半は、位相という厄介者を扱わずに済みます。
メルスペクトログラム: 音の設計図
前半の出力であるメルスペクトログラムは、音を「縦=周波数、横=時間」の画像に直したものです。
作り方は素朴です。波形を20〜50ミリ秒くらいの窓で切り出し、窓ごとにフーリエ変換して周波数成分の強さを測る。窓を10ミリ秒ほどずつずらしながらこれを繰り返す(短時間フーリエ変換、STFT)。すると時間の刻みごとに「どの高さの音がどれだけ鳴っているか」の縦一列が得られ、並べると画像になります。
ここで周波数の目盛りを、物理ではなく耳に合わせて張り替えます。
は物理的な周波数(Hz)、 が耳にとっての「高さ」の目盛りです。式(1)が言っているのは要するに、低い音域ほど細かい違いが聞き分けられ、高い音域はざっくりでよい、ということだけです。100 Hz と 200 Hz の差ははっきり分かるのに、8,000 Hz と 8,100 Hz はほぼ同じに聞こえる。その耳の性質を、目盛りの側に焼き込んでいます。
この目盛りで周波数軸を80本前後の帯(メルフィルタバンク)に束ね、強さの対数を取ったものがメルスペクトログラムです。24 kHz の波形が毎秒24,000個の数値なのに対し、メル80本を10ミリ秒ごとに並べれば毎秒8,000個。数はそこまで減りませんが、決定的なのは滑らかで、位相を含まないことです。理由3が消え、理由2の被害も小さくなります。
裏を返せば、メルスペクトログラムは音の設計図であって音そのものではありません。捨てた位相を作り直して音に戻す担当が、別途どうしても要ります。
コメント
コメントにはログインが必要です