スマホの読み上げやAIアシスタントの声は、もう人間と聞き分けられないところまで来ています。一方で、少し前の機械の声を覚えている人も多いはずです。SF映画のロボットの声、昔のカーナビのぎこちない案内、駅のホームの継ぎはぎめいたアナウンス。同じ「機械に喋らせる」なのに、この差はどこから来たのでしょうか。

今回はプログラムを書く手をいったん休めて、機械の声の90年をたどる読み物の回です。ただし年表を眺めるだけの話にはしません。ボコーダーからAI音声まで、どの時代のどの方式も、やっていることは実は同じで、声をいったん分解して、組み立て直しています。違うのは、分解したときに何を捨てて、何を残すか。それだけです。そして捨てたものの分だけ声は機械っぽくなり、残せるものが増えるほど自然になる。この一本の物差しを持つと、90年ぶんの歴史が一枚の図に収まります。

機械の声の90年。ボコーダー・規則合成・波形接続・ニューラルTTSの4方式を「何を捨てて何を残すか」で対比した年表の図

以下、この4つを順にたどります。真ん中には、自分の声をその場でロボット声に変えられる音デモを置きました。

ロボット声は電話の発明品だった ── ボコーダー

出発点は意外にも、喋る機械を作ろうという話ではありません。1930年代、ベル研究所の技術者ホーマー・ダドリーが取り組んでいたのは、電話の声をもっと少ない情報量で送れないか、という通信の問題でした。声の波形をそのまま送ると、電話線1本ぶんの帯域をまるまる使ってしまう。もっと圧縮できないか。

ダドリーの答えがボコーダー(vocoder、voice coder の略)です。発想はこうです。声の波形そのものを送るのはやめて、まず声をいくつかの周波数の帯域に分けます。低い帯、中くらいの帯、高い帯。そして帯域ごとに、音量が時間とともにどう動くかという曲線だけを取り出す。この音量の動きの曲線はエンベロープ と呼ばれます。声そのものに比べると、エンベロープはずっとゆっくりした信号なので、はるかに少ない情報量で送れます。受信側では、ブザーのような音源を同じ帯域に分け、送られてきたエンベロープどおりに各帯域の音量つまみを動かして、声を組み立て直す。

ボコーダーの仕組み。声を帯域フィルタで分け、帯域ごとの音量エンベロープの束だけを取り出し、ノコギリ波を同じ帯域に分けて束で音量を操ると、ロボット声になる図

つまりボコーダーが「声の本体」とみなしたのは、帯域ごとの音量エンベロープの束です。束が声の聞き取れる中身、いわば口の動きに相当し、波形そのもの、つまり声帯の細かな振動が持っていた「誰の声か」という個性は、思い切って捨てる。フォルマント合成の回 で、声は音源と口の形のフィルタの掛け算だという source-filter モデルを紹介しましたが、ボコーダーはその「フィルタ側の動きだけを抜き出して送る」機械だと言えます。

そして、この「捨てた」ことが思わぬ副産物を生みます。受信側の音源は何でもいいのです。ブザーの代わりにシンセサイザーのノコギリ波を使えば、ノコギリ波が喋る。和音を入れれば、和音が喋る。声の高さの情報は捨てているので、出てくる声の高さは音源側で自由に決められます。人の言葉なのに声帯の生々しさがない、あの独特のロボット声はこうして生まれ、通信装置だったはずのボコーダーは、のちに楽器として音楽の世界で愛されることになりました。

ちなみにベル研究所は1939年のニューヨーク万国博覧会で、この技術から派生した VODER という「鍵盤で操作して喋らせる機械」を実演して見せています。また第二次世界大戦中には、ボコーダーで声を分解してから暗号化する連合国側の秘話通信システム SIGSALY にも使われました。ロボット声は、遊びではなく通信と戦争の真剣な道具として始まったわけです。

1939年ニューヨーク万国博覧会のベル研究所ブースでVODERが実演される様子。壁面に大きく THE VODER と掲げられ、オペレーターが鍵盤の前に座り、大勢の見物客が取り囲んでいる

1939年ニューヨーク万国博覧会での VODER の実演。オペレーターが鍵盤を操作して機械に喋らせ、来場者が取り囲んだ(Bell System Technical Journal, 1940。パブリックドメイン, via Wikimedia Commons)

1943年のSIGSALY装置。2人の米陸軍将校が、無数のつまみが並ぶ機器ラックとレコードのターンテーブルの前に立っている

秘話通信システム SIGSALY(1943年)。ボコーダーで分解した声を暗号化し、連合国首脳の会話を守った(U.S. Army/NSA。パブリックドメイン, via Wikimedia Commons)

触ってみる

説明より体験のほうが早いので、チャンネルボコーダー(帯域=チャンネルに分けるボコーダー)のデモを用意しました。キャリア(着せ替え先の音源)はノコギリ波です。まずはそのまま「ロボット声にする」を押すと、内蔵の合成音声が「あーいーうー」と口を動かし、その口の動きがノコギリ波に乗り移ります。下の棒グラフが、いままさに送られている「帯域エンベロープの束」です。「あ」「い」「う」で束の形が変わるのを見てください。

マイクボタンを押してブラウザにマイクを許可すると、自分の声がそのままロボット声になります(https のページでだけ動きます。イヤホン推奨)。何か喋りながら「ロボット声の高さ」を動かすと、喋る内容はそのままで声の高さだけが変わります。高さの情報は捨てられていて、キャリア側が握っている証拠です。

うまく表示されないときは、デモを別タブで開く

録音ゼロで喋らせる ── 規則合成

ボコーダーには決定的な限界があります。入力に「いま人が喋っている声」が要ることです。声の衣装を着せ替えることはできても、文字を渡して勝手に喋ってもらうことはできません。テキスト読み上げ(TTS: text-to-speech)を作るには、人の声を借りずに、声をゼロから組み立てる必要があります。

その道具立てはすでにこの連載に登場しています。フォルマント合成 です。ノコギリ波をバンドパスフィルタに通し、口の共鳴の山(フォルマント)の位置 F1・F2 を選べば母音が決まるのでした。ならば「こ・ん・に・ち・は」という音の並びに合わせて、フォルマントの位置を時間どおりに動かす規則を書けば、機械は文字から喋れるはずです。これが規則合成と呼ばれる方式で、1980年代に実用の水準へ引き上げたのが、MITのデニス・クラットのフォルマント合成器でした。この系統の合成器は DECtalk などとして製品化され、車いすの物理学者スティーヴン・ホーキングが生涯使い続けた「声」も、クラットの合成器に由来する系統です。

規則合成の声は、身近なところにいまも現役でいます。動画の「ゆっくり実況」でおなじみのあの声は、アクエスト社の規則音声合成エンジン AquesTalk によるもので、録音した人の声を使わずに規則で組み立てる、この系統の音です。

一度でも聴けば分かるとおり、規則合成の声は明瞭ですが、はっきり機械の声です。理由は物差しに当てるとすぐ見えます。この方式は人の録音をいっさい残していません。残したのは「声とはこう動くものだ」という設計図、つまり人間が書き下せた規則だけです。実際の声が持つ揺らぎや癖のうち、規則にできなかったものはすべて捨てられる。とりわけ子音 は数十ミリ秒の時間設計のかたまりで、規則で書き切るのが難しく、機械っぽさの大きな源になります。その代わり、録音が要らないので驚くほど軽く、辞書にある言葉なら何でも、何時間でも喋れる。「ゆっくり」の声が四十年前の方式のまま愛され続けているのは、この軽さと、むしろ味になった機械っぽさのおかげでしょう。

ところで宣伝を少しだけ。筆者が個人開発している音感トレーニングアプリ Harmonize でも、「あー」と歌う声の音色をフォルマント合成で試作しています。まだ公開していない開発中の音色ですが、中身はまさにこの系統で、歌うだけで喋りはしません。規則合成のいちばん端っこの親戚と言えます。

本物を切り貼りする ── 波形接続

規則で書けないなら、書くのをやめてしまえ、という開き直りが次の主役です。人にたくさん喋ってもらって録音し、それを音の部品に細かく刻んでデータベースにしておく。喋らせたい文が来たら、合う部品を選んで並べ、つなぎ目をなめらかに貼り合わせる。波形接続(連結合成)と呼ばれる方式で、1990年代から2010年代半ばまで、実用のテキスト読み上げの主流でした。

物差しに当てれば、規則合成の正反対です。本物の録音の断片をそのまま残すのだから、一音一音は録音と同じだけ自然になる。その代わり、捨てたのは自由です。録音になかった言い方はできず、部品と部品のつなぎ目では音の高さや質感がわずかに食い違って、独特の「ぶつ切り感」が出ます。駅のホームや車内放送の案内で、単語ごとに抑揚が微妙に揃っていない、あの聞き覚えのある感じは、録り置きした部品をつないで文を作る方式の音だからです。自然さと引き換えに、収録スタジオで喋られた範囲という檻に入った声だと言えます。

波形を丸ごと学習する ── ニューラルTTS

そして2016年、DeepMind が発表した WaveNet が流れを変えます。この連載の最初の回 で、音の正体は1秒あたり数万個の数の列だという話をしました。WaveNet がやったのは、大量の録音からこの数の列の出方そのものを学習し、「ここまでの数の並びの次に来る1個」を予測しては出力する、という形で波形を頭から丸ごと生成することです。帯域のエンベロープも、フォルマントの規則も、部品の切り貼りも使いません。

物差しに当てると、この方式の異質さが際立ちます。これまでの方式はどれも、人間が「声の要点はこれだ」と決めて、それ以外を捨てることで成立していました。ボコーダーなら帯域の音量、規則合成ならフォルマントの動き、波形接続なら部品の在庫。ニューラルTTSは、その「要点選び」自体を人間がやめて、何が声らしさに効くかの判断ごと学習に委ねました。人間が書くルールを捨てた代わりに、息づかい、唇の音、言いよどみの気配といった、ルール化をあきらめていた細部までがデータから声に残る。いまのAI音声が不気味なほど自然なのは、要するに、もうほとんど何も捨てていないからです。

90年前のボコーダーが真っ先に捨てたのは「誰の声か」でした。それがいまや、数秒のサンプルから特定の人の声を再現できると言われる時代です。捨てるものを減らし続けた歴史が一周して、今度は「本人の同意なく声を残せてしまう」ことが新しい問題になっているのは、皮肉な着地だと思います。

どう実現するか

読み物の回とはいえ、ここはサウンドプログラミングの連載なので、チャンネルボコーダーの最小構成だけ載せておきます。部品は3つ、帯域を切り出すバンドパスフィルタと、音量の動きを取り出すエンベロープフォロワ(信号の絶対値をとってローパスフィルタでならすと、波形の外形=音量の動きだけが残る回路)と、キャリアの音源です。

/* チャンネルボコーダー(C風の擬似コード) */
for (n = 0; n < length; n++) {
    double v = voice[n];                       /* モジュレータ:声 */
    double c = saw(&phase, f0, fs);            /* キャリア:ノコギリ波 */
    double out = 0;
    for (k = 0; k < BANDS; k++) {
        double band = bandpass(&ana[k], v);            /* 声を帯域に分け */
        env[k] += (fabs(band) - env[k]) * 0.005;       /* 音量の動きだけ取り出し */
        out += bandpass(&syn[k], c) * env[k];          /* 同じ帯域のキャリアに着せる */
    }
    output[n] = out;
}

Web Audio API では、絶対値を WaveShaperNode で、ならしを BiquadFilterNode のローパスで作り、その出力を GainNode の gain 端子につなぐと「エンベロープが音量つまみを動かす」配線がそのまま組めます。

for (const f of bandFreqs) {                     // 帯域ごとに
  const ana = ac.createBiquadFilter();           // 分析側BPF
  ana.type = 'bandpass'; ana.frequency.value = f; ana.Q.value = 4;
  const syn = ac.createBiquadFilter();           // 再構成側BPF
  syn.type = 'bandpass'; syn.frequency.value = f; syn.Q.value = 4;
  const lpf = ac.createBiquadFilter();
  lpf.type = 'lowpass'; lpf.frequency.value = 25;      // ならす=エンベロープ化
  const vca = ac.createGain(); vca.gain.value = 0;     // 帯域の音量つまみ

  voice.connect(ana).connect(abs).connect(lpf);        // abs は絶対値の WaveShaper
  lpf.connect(vca.gain);                               // エンベロープがつまみを動かす
  carrier.connect(syn).connect(vca).connect(output);
}

上のデモは、この配線を14帯域ぶん並べただけのものです。1930年代には棚いっぱいの真空管とフィルタ回路だった機械が、いまはブラウザの数十行に収まります。

参考文献

  • H. Dudley, “Remaking Speech,” The Journal of the Acoustical Society of America, vol. 11 (1939). ボコーダーの発明者本人による解説。声を分析して作り直すという発想の原典。
  • D. H. Klatt, “Review of text-to-speech conversion for English,” The Journal of the Acoustical Society of America, vol. 82 (1987). 規則合成の第一人者による、当時までの音声合成史の網羅的なレビュー。
  • A. van den Oord et al., “WaveNet: A Generative Model for Raw Audio ” (2016). 波形を直接生成するニューラルTTSの出発点となった論文。
  • 青木直史『サウンドプログラミング入門――音響合成の基本とC言語による実装 』技術評論社(2013)。フィルタやボイスシンセサイザなど、本記事の部品にあたる技術をC言語の実装つきで解説する定番書。
  • デモの実装には Web Audio API を使用。BiquadFilterNode のバンドパスを分析側・再構成側に14本ずつ並べています。

90年ぶんの歴史も、物差しは「何を捨てて、何を残すか」の一本でした。まずはデモのマイクで、自分の声から束だけ残る瞬間を聴いてみてください。