声を自由にデザインできる音声合成モデルMaya1を使ってみた
はじめに
この記事はLivetoon Tech Advent Calendar 2025の3日目の記事です。
こんにちは
株式会社LivetoonでAIエンジニアをしている大塚です。
今回のアドベントカレンダーでは、LivetoonのAIキャラクターアプリのkaiwaに関わるエンジニアが、アプリの話からLLM・合成音声・インフラ監視・GPU・OSSまで、幅広くアドベントカレンダーとして書いて行く予定です。
是非、publicationをフォローして、記事を追ってみてください。
Maya1とは
Maya Researchが開発したMaya1は、テキストで声の特徴を記述するだけで、様々な声質・感情・アクセントを生成できる最先端のオープンソース音声AIモデル(TTS)です。
Llamaベースの3B TransformerモデルとSNACニューラルコーデックを組み合わせた、言語モデルによる音声生成という新しいアプローチを採用しています。
Maya1の基本アーキテクチャ
Maya1はBERT-VITS2のような従来のTTSモデルとは異なり、Language Model(LM)ベースの音声生成を採用しています。
モデル構成
Maya1は以下の2つの主要コンポーネントから構成されています:
[テキスト] → [Llama 3B Transformer] → [SNACトークン] → [SNACデコーダ] → [音声波形]
1. Llama 3Bベースの言語モデル
| パラメータ | 値 |
|---|---|
| アーキテクチャ | LlamaForCausalLM |
| パラメータ数 | 3B (30億) |
| 隠れ層サイズ | 3,072 |
| レイヤー数 | 28層 |
| アテンションヘッド数 | 24 (KV: 8) |
| 語彙サイズ | 156,960 |
| 最大コンテキスト長 | 131,072トークン |
| データ型 | bfloat16 |
特筆すべきは語彙サイズ156,960という大きさです。これは通常のLlamaの言語トークン(12,800種類)にSNAC用の音声トークンを含めた拡張語彙になっています。
2. SNACニューラルコーデック
SNAC(Multi-Scale Neural Audio Codec)はNeurIPS 2024のAudio Imagination Workshopで発表された最新のニューラル音声コーデックです。
SNACの特徴:
- 超低ビットレート: 0.98 kbps(24kHz版)
- マルチスケール量子化: 3階層の時間解像度(L1: 12Hz, L2: 23Hz, L3: 47Hz)
- パラメータ数: 19.8M(モデル本体より遥かに軽量)
- 出力: 24kHz モノラル音声
トークン体系の詳細分析
# 特殊制御トークン
CODE_START_TOKEN_ID = 128257 # Start of Speech (SOS)
CODE_END_TOKEN_ID = 128258 # End of Speech (EOS)
CODE_TOKEN_OFFSET = 128266 # SNACコードの開始位置
# SNACトークンの範囲
SNAC_MIN_ID = 128266
SNAC_MAX_ID = 156937 # 128266 + (7 * 4096) - 1
トークンの内訳
Maya1の156,960トークンは以下のように構成されています:
| トークン種類 | 範囲 | 個数 | 用途 |
|---|---|---|---|
| テキスト | 0 ~ 128256 | 128,257 | 通常のLlamaテキストトークン |
| SOS | 128257 | 1 | 音声生成開始マーカー |
| EOS | 128258 | 1 | 音声生成終了マーカー |
| 予約領域 | 128259 ~ 128265 | 7 | 将来の拡張用? |
| SNAC音声 | 128266 ~ 156937 | 28,672 | 音声コード (7×4096) |
SNAC音声トークンが28,672個ある理由は、SNACが7トークン/フレームの構造を持ち、各レベルで4096個のコードブックを使用するためです:
7トークン/フレーム × 4096コード = 28,672トークン
プロンプトフォーマット
Maya1は特殊な構造化フォーマットを使用します。以下の特殊トークンIDが定義されています:
# 特殊トークンID
SOH_ID = 128259 # Start of Header
EOH_ID = 128260 # End of Header
SOA_ID = 128261 # Start of Audio
BOS_ID = 128000 # Beginning of Sequence
TEXT_EOT_ID = 128009 # End of Text
CODE_START_TOKEN_ID = 128257 # Start of Speech (SOS)
使用例:
description = "Realistic male voice in the 30s age with american accent. Normal pitch, warm timbre, conversational pacing."
text = "Hello! <excited> This is amazing! <laugh>"
prompt = build_prompt(tokenizer, description, text)
# → <SOH><BOS><description="..."> Hello! <excited>...<EOT><EOH><SOA><SOS>
対応する感情タグ(special_tokens_map.jsonに定義、全20種類):
angry, appalled, chuckle, cry, curious, disappointed, excited,
exhale, gasp, giggle, gulp, laugh, laugh_harder, mischievous,
sarcastic, scream, sigh, sing, snort, whisper
これらはトークナイザーのadditional_special_tokensとして登録されており、通常のテキストトークンとは異なります。
声のデザイン機能:自由度の高い音声制御
Maya1の最大の特徴の一つが、体系的な声のデザインシステムです。自然言語で声の特徴を記述するだけで、様々な声質・感情・アクセントを生成できます。
制御可能なパラメータ
共通属性(Realistic & Creative両方)
| カテゴリ | オプション |
|---|---|
| 年齢 | 20s, 30s, 40s |
| 性別 | male, female |
| アクセント | american, british, indian, middle_eastern, asian_american |
| ピッチ | low, normal, high |
| 声質 | deep, warm, gravelly, smooth, raspy, nasally, throaty, harsh (+ robotic/ethereal for Creative) |
| スピード | very_slow, slow, conversational, brisk, fast, very_fast |
| 感情 | neutral, energetic, excited, sad, sarcastic, dry |
| 感情の強さ | low, med, high |
Realistic専用属性
| カテゴリ | 用途 |
|---|---|
| ドメイン | podcast, commercial, education, support, entertainment, corporate等 |
| 役割 | podcast_host, ad_narrator, elearning_instructor等 |
| 場面 | formal, neutral, casual |
Creative専用属性
Character: animated_cartoon, ai_machine_voice, alien_scifi, pirate, dark_villain, demon, gangster, mafia, vampire, spy, anime等
声のデザインの仕組み
Maya1の声デザイン機能は以下の2層構造になっています:
1. 感情タグ:Special Tokens
special_tokens_map.jsonで定義された20個の感情タグは、トークナイザーレベルで特別扱いされています:
{
"additional_special_tokens": [
{"content": "<angry>"},
{"content": "<laugh>"},
{"content": "<whisper>"},
// ... 全20種類
]
}
これにより、<laugh>や<whisper>はテキストとして分割されず、単一のトークンIDとして処理されます。
2. 声の記述:自然言語による学習
<description="..."> の部分は特別な処理を受けず、通常のテキストとしてトークン化されます。つまり:
- チャットテンプレート(
chat_template.jinja)は標準的なLlama 3形式 -
descriptionに関する特別なプリプロセスは存在しない - モデルが学習データから自然言語記述と音声特徴の対応を学習
これは非常に興味深い設計で、固定されたパラメータセットではなく、柔軟な自然言語記述で声質を制御できます。
実際に声をデザインして生成してみる
同じテキストで6つの異なる話者パターンを生成し、Maya1の声質制御能力を検証しました。
Hello! <excited> This is amazing! <laugh>
40代男性(ブリティッシュ)
Description: "Realistic male voice in the 40s age with british accent. Normal pitch, warm timbre, conversational pacing."
渋い声
20代女性(興奮)
Description: "Young female voice in the 20s age with american accent. High pitch, bright timbre, energetic pacing. 良い
30代女性(囁き)
Description: "Friendly female voice in the 30s age with american accent. Normal pitch, soft timbre, slow pacing." まじで人間
海賊
Description: "Creative, pirate character. Male voice in their 40s with british accent. Low pitch, gravelly timbre, slow pacing, energetic tone at high intensity."
すっごい
コマーシャルナレーター
Description: "Realistic male voice in the 30s age with american accent. Normal pitch, clear timbre, brisk pacing, energetic tone at high intensity, commercial Domain, ad_narrator role, formal delivery."
ちょっとうざいかも
AIロボット
Description: "Creative, ai_machine_voice character. Male voice in their 30s with american accent. Normal pitch, robotic timbre, conversational pacing, neutral tone at med intensity."
ちゃんとロボット
全体的にめちゃくちゃクオリティが高いです!!
笑い声やwhisperをテキストだけで調整できるのは凄いし、海賊の声の表現力が高いです。
AIロボットのガラガラ機械音声を学習データに含めるのは勇気あるなと思いました。
課題
- 日本語未対応
- 女性の高音がかすれる :SNACの限界?
- GPU必須: CPU推論は非現実的, GPUでもリアルタイムはちょっと厳しい
次回
弊社LivetoonでMaya1の日本語版をトレーニングしており、まもなく公開する予定です。
次回の記事ではMaya1のトレーニングにおける課題や日本語の推論について深掘るつもりです。
その他の実験記録
実験環境:
- GPU: NVIDIA Tesla T4 (16.7GB VRAM)
- モデル: maya-research/maya1 (3.3B parameters)
- フレームワーク: Transformers + SNAC(vLLMは未使用)
- 生成パラメータ: max_new_tokens=500, temperature=0.4, top_p=0.9
- モデルロード時間: 約90秒(初回のみ)
- 推論時間: 約5-8秒/サンプル(500トークン生成)
- メモリ使用量: 約7GB VRAM(bfloat16精度)
Discussion