[!NOTE]
【この記事の要約(TL;DR)】
- 問題の所在: Gemini TTSの「Puck」ボイスは公式分類でも感情表現(Upbeat)が強いため、技術解説や長文ナレーションではオーバーリアクションに聞こえやすい。
- ボイス選定: 落ち着いたトーンの「Charon(Informative)」に切り替えることで、過度な抑揚が抑えられ、耳馴染みの良いナレーションに変わる。
- 3.8現行仕様: 本文内に命令を混ぜるのではなく、
speech_metadata.styleを用いて「読み上げテキスト」と「発話スタイル」を完全に分離するのが現在のAPI標準設計。- 実装コード: Gemini 3.8 Flash TTSの公式仕様に完全準拠したPython実装サンプルを全公開。
1. Gemini TTSを試して感じた「抑揚のわざとらしさ」
Googleのモデルファミリーで利用可能な Gemini 3.8 Flash TTS(音声合成)。テキスト生成とシームレスに結合し、低遅延で自然な音声を返してくれる非常に強力な機能です。
しかし、初めてAPIを叩いて音声を出力させたとき、こう感じた方も多いのではないでしょうか。
「……感情が豊かすぎて、ナレーションとしては少しわざとらしく聞こえるな?」
YouTubeの解説動画やPodcast、あるいは個人開発の業務アプリに組み込む際、「AI特有の過剰なテンションや抑揚」は視聴者の聞き疲れを招く大きな要因になります。
なぜこのような違和感が生まれるのか、そしてどうすれば「自然で落ち着いた語り」に調整できるのか。実際に音声を生成・比較しながら検証しました。
2. なぜわざとらしく聞こえるのか? 2つの根本原因
Geminiの音声合成が不自然にハイテンションに聞こえてしまう原因は、主に以下の2点にあります。
原因①:ボイス「Puck」のキャラクター特性(Upbeat)
Gemini APIのサンプル等でよく使われるプリセットボイス Puck は、公式分類でも 「Upbeat(陽気・活気がある)」 に位置づけられています。日常会話や親しみやすいアシスタントとしては魅力的ですが、淡々と情報を伝えるナレーションや技術解説には感情が乗りすぎてしまう という側面があります。
原因②:スタイル指定によって発話の印象が変わる
Gemini 3.8 TTSでは、発話スタイルを speech_metadata.style で指定できます。スタイルを指定しないデフォルト状態では、モデルが文脈から表現豊かに演じようとするため、僕の検証環境ではPuckの持つ「Upbeat」な性格も重なり、技術解説としては抑揚が強く感じられました。
3. 解決策①:落ち着いたトーンのボイス「Charon」を選ぶ
最も手軽かつ効果的な対策は、声質(ボイスモデル)の変更 です。
Gemini TTSでは複数のプリセットボイスが提供されています。
| ボイス名 | Google公式分類 | 実際の聴感と推奨用途(一次体験) |
|---|---|---|
| Puck | Upbeat(陽気・活発) | 元気でエネルギッシュ。カジュアルな対話向け |
| Charon | Informative(情報提供・解説) | 低音でフラット。技術解説、ニュース、落ち着いたナレーション向け |
| Aoede | Breezy(軽やか・爽やか) | 柔らかく澄んだ声質。案内ガイドやアシスタント向け |
| Fenrir | Excitable(熱意・感情的) | 重みのある男性声。ドラマ、オーディオブック向け |
| Kore | Firm(芯のある・明瞭) | 明快で通る声質。標準アナウンス、プレゼン向け |
実際に Puck から Charon に切り替えるだけで、過度なテンションがスッと落ち着き、一気に聞きやすい解説トーンへと変わります。
4. 解決策②:発話スタイルを分離して指定する(Gemini 3.8仕様)
さらに自然なナレーションに仕上げるための重要なポイントが、発話スタイルの制御 です。
⚠️ 旧方式(本文への指示混ぜ)の注意点
以前のように読み上げ本文の中に 「アナウンサーのように淡々と読んで:[本文]」 と命令文をそのまま混ぜてしまうと、モデルがその指示文自体を声に出して読み上げてしまう リスクがあります。
⭕ 3.8現行仕様:speech_metadata.style でスタイルを渡す
Gemini 3.8 Flash TTSでは、「読み上げるテキスト(本文)」 と 「どのように発話するか(スタイル指示)」 を明確に切り分けて渡す設計になっています。
- 本文(text): 読ませたい文章そのもの
- 発話スタイル(speech_metadata.style):
「落ち着いたトーンで明瞭に発話してください」
このように発話スタイルを独立して与えることで、本文を誤読することなく、AIが自律的に抑揚のトゲを削ぎ落とした安定感のある音声を出力してくれます。
5. Pythonによる実装コード(Gemini 3.8 Flash TTS公式仕様)
以下は、最新のGemini API(Google GenAI SDK / REST)仕様に準拠し、ボイス指定(Charon)と speech_metadata.style を分離して音声を生成するPythonコード例です。
REST API(urllib)による完全実装例
import os
import json
import base64
import urllib.request
from pathlib import Path
from dotenv import load_dotenv
load_dotenv()
api_key = os.getenv("GEMINI_API_KEY")
# エンドポイント(Gemini 3.8 Flash TTS または Lite TTS)
url = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-3.8-flash-lite-tts:generateContent?key={api_key}"
headers = {"Content-Type": "application/json"}
# 1. 読み上げさせる純粋な本文(Transcript)
text_to_speak = "AIの音声合成を試してみたら、抑揚が大きすぎてびっくりしました。"
# 2. 発話トーン・スタイルの制御指示
style_instruction = "過剰な抑揚を抑え、落ち着いたトーンで明瞭に発話してください。"
# 3. ペイロード構築(text と speech_metadata.style を完全に分離)
payload = {
"contents": [
{
"role": "user",
"parts": [
{
"text": text_to_speak,
"speech_metadata": {
"style": style_instruction
}
}
]
}
],
"generationConfig": {
"response_modalities": ["AUDIO"],
"speech_config": {
"voice_config": {
"voice": "Charon" # 落ち着いたInformativeボイスを指定
}
}
}
}
req = urllib.request.Request(url, data=json.dumps(payload).encode("utf-8"), headers=headers)
with urllib.request.urlopen(req) as response:
res = json.loads(response.read().decode("utf-8"))
audio_b64 = res["candidates"][0]["content"]["parts"][0]["inlineData"]["data"]
audio_bytes = base64.b64decode(audio_b64)
# Gemini 3.8 TTSはデフォルトでWAVバイト列を返すためそのまま保存可能
output_file = Path("output_calm.wav")
output_file.write_bytes(audio_bytes)
print(f"✅ 自然なナレーション音声を保存しました: {output_file.name}")
6. まとめ:TTSは「本文・声・スタイル」の3層設計が命
AIの音声合成(TTS)は、「文章をそのまま投げれば完成する」という単純なものではありません。
- 本文(Transcript): 読ませたい純粋な原稿
- 声質(Voice): 用途に合ったキャラクター(技術解説ならCharon)
- 発話スタイル(Style): 場面に合わせたトーン(
speech_metadata.style)
この3層を切り分けて設計することで、Gemini TTSは不自然なわざとらしさから解放され、実用に耐えうる「専属ナレーター」へと進化します。ぜひ手元の環境で音声の違いを体感してみてください。
📖 あわせて読みたいSNS集客・導線設計関連記事
💡 あわせて読みたい:Gemini APIの無料枠仕様
Gemini APIキーの安全な発行方法や、Free Tierの課金リスクについては初めてのGoogle API利用で知るべき「無料のカラクリ」をご参照ください。

