asopi tech
asopi techOSS Developer
【第3回】音声モデルはLLMに近づく ― TTSとSpeech2Speechの教師データ

【2026年7月版】

【第3回】音声モデルはLLMに近づく ― TTSとSpeech2Speechの教師データ

公開日: 2026/07/09
読了時間: 約 12分

音声モデルは「テキスト→音声」と「音声→音声」

今回扱う音声系のモデルには、大きく2種類あります。ひとつは音声合成(TTS: Text-to-Speech)で、テキストを入れると読み上げ音声が返るモデルです。入力がテキスト・出力が音声なので「TXT2Speech」とも書けます。カーナビやスマートスピーカーが文章を読み上げる、あの技術です。

もうひとつはSpeech2Speech(S2S)で、音声を入れると別の音声が返るモデルです。音声翻訳(日本語音声→英語音声)や声質変換(ある人の声→別の声)などがこれにあたります。

前回までのLLM(TXT2TXT)や画像生成(TXT2IMG)と同じく、音声系も「入力Xを入れると出力Yが返る」という形で捉えられます。違うのは、扱う対象が「音」であること。では、その対応をどうやって学ばせるのか——TTSから順に見ていきます。

音声の教師データは「テキストと音のペア」から始まる

音声合成(TTS: Text-to-Speech)の教師データは、基本的にテキストと、その読み上げ音声のペアです。典型的なデータセットは、こんな構造をしています。

dataset/
    speaker001/
        0001.wav
        0002.wav
        metadata.csv
0001.wav|今日は良い天気ですね。
0002.wav|明日は雨になるでしょう。

「どのテキストが、どの音声に対応するか」がそろっていれば学習できます。ここまではLLMや画像と同じで、要は「入力」と「正解」のペアを作る話です。違いは、正解が「音」であること。その「音」をどう表現するかで、TTSは大きく2つの世代に分かれます。

従来型 ― 正解は Mel Spectrogram

まず、音声をそのまま波形で扱うと情報量が多すぎます。そこで多くのモデルは Mel Spectrogram(人間の聴覚に合わせた周波数表現)に変換します。

import librosa

wave, sr = librosa.load("0001.wav", sr=22050)

mel = librosa.feature.melspectrogram(
    y=wave, sr=sr, n_fft=1024, hop_length=256, n_mels=80,
)

テキスト側はトークン化します。すると教師データはこうなります。

入力:  テキスト(トークン列)
正解:  Mel Spectrogram

Tacotron2のような古典的モデルなら、学習はほぼこれだけです。

predicted_mel = model(tokens)
loss = F.l1_loss(predicted_mel, target_mel)

最後に、Mel Spectrogramから実際の音声波形へ戻す必要があります。ここはボコーダの仕事で、昔はGriffin-Lim、いまはHiFi-GAN、BigVGAN、UnivNetなどが使われます。

Text ─▶ TTS Model ─▶ Mel ─▶ Vocoder ─▶ 音声

最近型 ― 正解は「音声トークン」

Tacotron型のあと、TTSはひとつの方式に定まったわけではありません。考え方としては、音声を離散トークンにしてLLMのように次トークンを予測する自己回帰(音声トークン)型(VALL-Eなど)と、音声表現にノイズを加えて復元を学ぶ拡散・フローマッチング型(Voiceboxなど)に分けられます。

ただし、実在のモデルはこの二つにきれいに二分できるわけではありません。むしろ両者を組み合わせたハイブリッドが多いのが実情です。たとえばCosyVoiceは、テキストから音声トークンを自己回帰で生成するLLM部と、そのトークンから音声を作るフローマッチングの復元部を組み合わせた構成です。Seed-TTSには自己回帰版と拡散(DiT)版の両方があり、F5-TTSはフローマッチングの非自己回帰モデル、XTTSは自己回帰のトークン生成にボコーダを組み合わせた構成、というように、実システムは複数方式の合わせ技で成り立っています。

本記事では、シリーズの「各分野がLLMの形へ収束していく」流れが最もよく見える自己回帰(音声トークン)型の部分に注目して説明します。この考え方では、Mel Spectrogramではなく音声トークンを予測します。

やり方は画像のlatentとよく似ています。Encodecのようなニューラルコーデックで、音声データを離散トークンに変換するのです。

tokens = encodec.encode(wave)
# 例: [[54, 91, 12, ...], [83, 19, 42, ...], ...]

すると教師データは、こうなります。

入力:  今日は良い天気ですね(テキストトークン)
正解:  54 91 12 ... / 83 19 42 ...(音声トークン)

学習コードは、もう完全にLLMです。

text_ids = tokenizer(text)
target_audio = encodec.encode(wave)

logits = model(text_ids)

loss = F.cross_entropy(
    logits.reshape(-1, vocab_size),
    target_audio.reshape(-1),
)

第1回のLLMは「文字トークン」を、このTTSは「音声トークン」を予測している。トークンの中身が文字から音に変わっただけで、学習の骨格は同じです。生成AIの各分野が同じ形へ収束しつつある、という第2回までの話が、音声でもそのまま当てはまります。

さらに最新のモデルでは、テキストだけでなく、話者ID・感情・話速・ピッチ・言語・アクセント・参考音声まで条件として入力し、それぞれをEmbedding化して渡します。「誰が、どんな感情で、どんな速さで話すか」まで教師データに含めるわけです。

Speech2Speech ― 音声から音声への変換

音声には、テキストを介さず音声から音声へ直接変換するタスクもあります。これがSpeech2Speech(S2S)で、実はかなり広い概念です。

  • 音声翻訳(日本語 → 英語)
  • 声質変換(男性 → 女性)
  • ノイズ除去
  • 感情変換・話者変換
  • リアルタイム会話AI

いずれも教師データの骨格は「入力音声 → 出力音声」です。たとえばノイズ除去なら、同じ発話の「雑音あり」と「雑音なし」を用意します。

noisy = load_audio("noisy.wav")
clean = load_audio("clean.wav")

pred = model(noisy)
loss = F.l1_loss(pred, clean)

声質変換なら「男性音声 → 女性音声」、音声翻訳なら「日本語音声 → 英語音声」のペアを大量に集めます。

そして最近は、S2Sもトークン方式が主流です。入力音声と出力音声をそれぞれAudioトークンに変換し、その変換を学びます。

src_tokens = encodec.encode(source_wave)
tgt_tokens = encodec.encode(target_wave)

logits = model(src_tokens)

loss = F.cross_entropy(
    logits.reshape(-1, vocab),
    tgt_tokens.reshape(-1),
)

「入力トークン列 → 出力トークン列」——これもまた、翻訳を学ぶLLMとほとんど同じ構造です。

エンドツーエンド会話AI ― 途中にテキストを置かない

もう一歩進んだのが、リアルタイム会話AI(OpenAIのAdvanced Voice Modeのような構成)です。ここでは音声を、テキストに変換せずに処理します。

音声 ─▶ Audio Encoder ─▶ Audio Token ─▶ LLM ─▶ Audio Token ─▶ Decoder ─▶ 音声

途中でテキストを経由しない点がポイントです。これを Speech-to-Speech End-to-End と呼びます。中核にあるのはLLMで、扱うトークンが「文字」ではなく「音」になっただけ。つまり、こう言えます。

LLM:    文字Token ─▶ Transformer ─▶ 文字Token
音声AI:  音声Token ─▶ Transformer ─▶ 音声Token

この構成の教師データは「入力音声 → 出力音声」だけでは足りません。会話履歴、話者ID、感情、アクセント、言語、会話ターンといったメタデータも合わせて記録し、自然なやり取りを学ばせます。

3つを並べて整理する

第1回から扱ってきた「文字・音声」系を並べると、収束の様子がよく見えます。

モデル入力出力教師データ
LLMテキストテキスト次トークン
TTSテキスト音声テキスト+音声(Mel/音声トークン)
Speech2Speech音声音声入力音声+出力音声

音声ならではの難しさ ― 対応データが集まらない

最後に、音声特有の難所に触れておきます。S2Sは、LLMやTTSよりも教師データの収集が難しい分野です。理由は「入力音声」と「理想的な出力音声」の対応が要るから。

  • ノイズ除去 → 同じ発話の「雑音あり/なし」を録る必要がある
  • 音声翻訳 → 同じ内容を別言語で話した対応データが要る
  • 声質変換 → 同じ内容を複数話者が発話したペアが要る

こうした完全な対応ペアは、そう都合よく大量には存在しません。そこで近年は、まず大量の音声から自己教師ありで音声表現を学び、その上で少量の対応データで目的タスクへ適応させる手法が広く使われています。LLMの「大規模事前学習+Instruction Tuning」とまったく同じ発想です。ここでも、教師データの作り方はモデルを越えて似通ってきています。

まとめ

  • TTSの教師データは「テキスト+音声」。従来はMel Spectrogramを正解にしていたが、最近は音声トークンを正解にし、構造がLLMそっくりになった。
  • Speech2Speechは「入力音声 → 出力音声」。翻訳・声質変換・エンドツーエンド会話AIまで、骨格はトークン列変換に収束している。
  • 音声は対応ペアが集めにくいため、大規模な自己教師あり事前学習+少量の適応、という組み合わせが定石になっている。

次回は、時間と空間を併せ持つ映像へ進みます。動画生成と、その先にあるワールドモデル——両者は似て見えて、学ぶ目的も教師データもまるで違います。