JA EN
体系音声系
·★ 会員·論文·14分で読めます

音声合成を1から — テキストから声まで

数文字のテキストから、その数万倍の長さの波形をでっちあげる——それが音声合成です。素直な回帰がなぜ破綻するのか(一対多と位相)、なぜテキスト→メルスペクトログラム→波形の二段構えが定番になったのか、そして数秒の参照音声で声色が移る仕組みまでを前提知識ゼロから解説します。

対象textタスクspeech

WaveNet: A Generative Model for Raw Audio


「声を作る」とは何を作ることか

音声合成(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つの正解を当てにいくのをやめて、分布を作ってそこから引くことです。そして分布の尖り具合が、そのまま読み上げの表情になります。

FIG 1同じ文でも読み方は何通りもある。温度を下げると分布が1本に尖り、モデルは毎回まったく同じ平坦な読み方をする。上げると候補が横並びになり、抑揚は豊かになる代わりに言い間違いや崩れが混じり始める

3つめは、位相です。 人間の耳は、波の「ずれ」にほとんど鈍感です。ある音を1000分の1秒ぶんずらして鳴らしても、同じ音に聞こえる。ところが数値の列としては、ずらした波形は元の波形とまったく別物です。つまりサンプルごとの二乗誤差は、聞こえ方とほとんど対応しません。耳に同じでも損失は巨大、耳に別物でも損失は小さい、ということが平気で起きる。波形をそのまま学習の的にしてはいけない、いちばん深い理由がこれです。

分割統治: 二段構えという発明

この3つを一度に相手にするのは無理がある、というのが現代のTTSが出した答えです。仕事を2つに割ります。

テキスト ──[音響モデル]──▶ メルスペクトログラム ──[ボコーダ]──▶ 波形

前半は「何を、どんな抑揚で、どれくらいの長さで読むか」という言語の問題。後半は「その音色を実際の空気の震えにする」という信号の問題です。分けるとご利益が2つあります。後半は言語にも話者にも依存しないので、テキストのない大量の音声だけで訓練でき、いろいろな前半と組み合わせて使い回せます。そして前半は、位相という厄介者を扱わずに済みます。

メルスペクトログラム: 音の設計図

前半の出力であるメルスペクトログラムは、音を「縦=周波数、横=時間」の画像に直したものです。

作り方は素朴です。波形を20〜50ミリ秒くらいの窓で切り出し、窓ごとにフーリエ変換して周波数成分の強さを測る。窓を10ミリ秒ほどずつずらしながらこれを繰り返す(短時間フーリエ変換、STFT)。すると時間の刻みごとに「どの高さの音がどれだけ鳴っているか」の縦一列が得られ、並べると画像になります。

ここで周波数の目盛りを、物理ではなく耳に合わせて張り替えます。

m=2595log10 ⁣(1+f700)m = 2595 \log_{10}\!\left(1 + \frac{f}{700}\right)
(1)

ff は物理的な周波数(Hz)、mm が耳にとっての「高さ」の目盛りです。式(1)が言っているのは要するに、低い音域ほど細かい違いが聞き分けられ、高い音域はざっくりでよい、ということだけです。100 Hz と 200 Hz の差ははっきり分かるのに、8,000 Hz と 8,100 Hz はほぼ同じに聞こえる。その耳の性質を、目盛りの側に焼き込んでいます。

この目盛りで周波数軸を80本前後の帯(メルフィルタバンク)に束ね、強さの対数を取ったものがメルスペクトログラムです。24 kHz の波形が毎秒24,000個の数値なのに対し、メル80本を10ミリ秒ごとに並べれば毎秒8,000個。数はそこまで減りませんが、決定的なのは滑らかで、位相を含まないことです。理由3が消え、理由2の被害も小さくなります。

裏を返せば、メルスペクトログラムは音の設計図であって音そのものではありません。捨てた位相を作り直して音に戻す担当が、別途どうしても要ります。

意外にも、最初の関門は機械学習より前にあります。テキスト正規化——「2026年」を「にせんにじゅうろくねん」に、「3/4」を文脈次第で「よんぶんのさん」か「さんがつよっか」に開く工程です。続いて書記素から音素へ(G2P)。日本語なら「今日」が「きょう」か「こんにち」かを決め、さらにアクセント核(雨と飴、橋と箸を分けている音の高低)まで付ける必要があります。英語なら "read" の現在形と過去形、"live" の形容詞と動詞。この辺りは辞書と規則が今も強い領域で、`pyopenjtalk` や `espeak-ng` のような形態素解析・G2P器が使われます。

この先にあるもの

§

ここから先は会員限定です

解説記事371本・教科書26章・学生モード48単元・論文精読6本が、月額¥490ですべて読み放題になります。新しい解説は毎日3本ずつ増えます。いつでも解約でき、解約後も期間の終わりまで読めます。

会員の方はログインすると続きが表示されます

参考文献

  1. WaveNet: A Generative Model for Raw Audio. arXiv:1609.03499論文ページ·PDF
  2. Natural TTS Synthesis by Conditioning WaveNet on Mel Spectrogram Predictions. arXiv:1712.05884論文ページ·PDF
  3. FastSpeech 2: Fast and High-Quality End-to-End Text to Speech. arXiv:2006.04558論文ページ·PDF
  4. HiFi-GAN: Generative Adversarial Networks for Efficient and High Fidelity Speech Synthesis. arXiv:2010.05646論文ページ·PDF
  5. Conditional Variational Autoencoder with Adversarial Learning for End-to-End Text-to-Speech. arXiv:2106.06103論文ページ·PDF
  6. Neural Codec Language Models are Zero-Shot Text to Speech Synthesizers. arXiv:2301.02111論文ページ·PDF

本記事は上記論文の本文にもとづいて執筆しています。数値・主張は原典を優先してください。

コメント

コメントにはログインが必要です