0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Gemini 3.8 Flash TTSを日本語で58本作って検証|演技・読み・速さ・料金を実際の音声で確かめた

0
Last updated at Posted at 2026-09-24

この記事には、Gemini 3.8 TTS で実際に作った音声が46か所あります。 この媒体では記事内に音声プレーヤーを置けないため、各所の「▶ 音声」リンクから再生してください(MP3が開きます)。WordPress版の記事では、ページ内でそのまま聞き比べられます。

はじめに:「AIの声」は、どこまで仕事に使えるのか

動画のナレーション、電話の自動応答、社内研修の読み上げ。人の声を録る代わりにAIの声を使いたい場面は増えています。一方で、実際に試すと次のような壁にぶつかりがちです。

  • 読み方は正しくても、どの文も同じ調子で気持ちが乗らない
  • 人名や「生物(なまもの)」のような言葉を読み間違える
  • 返事が始まるまでの待ち時間が長く、電話では気まずい間になる
  • 結局いくらかかるのかが分かりにくい

2026年9月23日、Googleが開発者向けの音声合成モデル Gemini 3.8 Flash TTS と Gemini 3.8 Flash-Lite TTS を発表しました(APIの変更履歴では9月22日付で正式版)。発表では、ふつうの言葉による演技指示、説明文から声を作る「ボイスデザイン」、2人の会話、長時間の音声などが強調されています。

この記事では、発表内容を並べるだけでなく、日本語の台本で実際に58本の音声を作り、聞ける形で埋め込んで検証しました。音声はすべて、各所の「▶ 音声」リンクから再生できます。

課題(同じ調子の読み上げ)から、台本・演技指示・声を分けて渡すことで表情のある音声になるまでを示す比較図

図1:これまでの読み上げは「何を読むか」だけを渡していました。3.8 TTS では「どう演じるか」をふつうの言葉で添えられます。静止画版:fig01-before-after.png

先に結論

検証の結果を先にまとめます。詳しい数字と音声は本文で紹介します。

観点 結果(2026年9月24日、このMacから実測)
日本語の自然さ 既成の声12本(6声×2モデル)は、文字に戻すと台本と完全に一致
演技指示 「明るく」「ささやく」「悲しく」は、判定用のAIが6択で毎回言い当てた。「怒って」は台本の内容と合わないと伝わりにくい
読み間違い Flash は「東海林(しょうじ)」「生物(なまもの)」も正しく読んだ。Flash-Lite は人名を読み間違えた
速さ 最初の音が届くまで Flash 約1.8秒、Flash-Lite 約1.3秒(ストリーミング)
長さ 約2分半(146秒)のナレーションを1回のリクエストで生成できた
料金 音声1分あたり Flash 約1.7セント、Flash-Lite 約1.2セント(実際の請求トークンから計算)
無料で試せるか AI Studio の画面と API の無料枠で、どちらのモデルも無料。ただし送った内容は製品改善に使われる

この記事の想定読者

次のような方を想定しています。Pythonのコードは出てきますが、AI Studio の画面だけで試す方法も紹介します。

  • 動画・音声コンテンツにAIのナレーションを使いたい方
  • 電話やチャットの自動応答(ボイスエージェント)を作っている、または検討している方
  • 「AI Studio なら無料で使えるの?」を確かめたい方

Gemini 3.8 Flash TTS / Flash-Lite TTS とは

TTS(Text-to-Speech、テキスト読み上げ) は、文章を音声に変える技術です。今回の2モデルは、Gemini の音声チームが出した「テキストを渡すと音声が返ってくる」専用モデルです。

2つのモデルは役割が分かれています。公式の説明と料金表をもとに整理すると、次のとおりです。

項目 Gemini 3.8 Flash TTS Gemini 3.8 Flash-Lite TTS
モデルID gemini-3.8-flash-tts gemini-3.8-flash-lite-tts
公式の位置づけ 表現力・忠実度・長時間の安定性 大量生成・低遅延・コスト重視の会話向け
対応言語 130言語(日本語を含む) 101言語(日本語を含む)
料金(有料枠、100万トークンあたり) 入力 $0.50 / 音声出力 $9 入力 $0.50 / 音声出力 $6
使える場所 Gemini API、AI Studio、Gemini Notebook Gemini API、AI Studio、Google Vids

料金は2026年12月31日までのもので、2027年1月1日からはどちらも2倍になると料金表に書かれています。Flash-Lite は、前世代の gemini-3.1-flash-tts-preview を置き換えるモデルという位置づけです。

何が新しいのか:台本と演技を分けて渡す

使い方で一番大きな変化は、台本(読む文章)と演技指示を別々の場所に書くようになったことです。ドキュメントでは、text 欄は厳密に「一字一句そのまま読む台本」として扱うと説明されています。

text・効果音タグ・speech_metadata.style・speech_config・response_format の5つをモデルへ渡し、音声が返る流れを順に示す図

図2:1回のリクエストで渡すもの。台本の中に「明るく言って:」と書くと、その指示まで読まれることがあります。静止画版:fig02-request.png

図の5つの要素は、それぞれ次の役割を持ちます。

  • text(台本):読む文章そのもの。書いたとおりに読まれます
  • 効果音タグ:<laugh>(笑い)、<sigh>(ため息)、<short pause>(短い間)などを、台本の中の鳴らしたい位置に入れます
  • 相づち:|mhm| のように縦棒で囲むと、会話の聞き手の相づちになります
  • speech_metadata.style(演技指示):「涙をこらえながら、震える声で」のように、その発話全体の話し方を自然な言葉で書きます。日本語でも書けます
  • speech_config(声):1人なら声の名前、2人なら話者名と声の対応を指定します

声の用意のしかたは3通り

声は、既成の声を選ぶ、説明文から作る、本人の声を複製する、の3通りで用意できます。

既成ボイス・ボイスデザイン・ボイス複製の3つの入手方法と、共通のSynthID透かしを示す図

図3:声の用意のしかた。今回は①②を実際に試し、③は仕様の確認にとどめました。静止画版:fig03-voice-sources.png

③のボイス複製(Voice Replication) は、10〜30秒の参照音声に加えて、声の持ち主本人が決まった同意文を読み上げた録音が必要です。日本語の同意文も用意されています。同意音声と参照音声が同じ人のものか、自動で確かめる仕組みです。今回は本人の声を扱う手続きが必要になるため、検証の対象から外しました。

公式ブログでは、このモデル群で作ったすべての音声に SynthID(聞こえない電子透かし)が入ると説明されています。AIが作った音声かどうかを、あとから確かめられるようにするための仕組みです。

AI Studio なら無料? 無料でできることと注意点

「Google AI Studio を使えば、音声合成も文字起こしも無料でできるのか」は、よく聞かれる疑問です。公式の料金表・請求の案内・利用規約(いずれも2026年9月24日に確認)を読むと、おおむね無料で使えます。ただし、データの扱いに大きな条件があります。

無料(AI Studio・APIの無料枠)と有料枠で、料金と送った内容の扱いがどう違うかを並べた比較図

図4:無料と有料の違い。料金より大事なのは「送った台本がどう扱われるか」です。静止画版:fig04-free-vs-paid.png

無料でできること

AI Studio の画面は無料です。 請求の案内(Billing)には、有料のAPIキーをつながない限り AI Studio の利用は無料だと書かれています。

料金表では、今回の2つの音声合成モデルとも、無料枠の入力・出力が「無料」です。文字起こしも、8月に正式版になった専用モデル Gemini 3.5 Transcribe(gemini-3.5-transcribe)の無料枠が「無料」です。Transcribe は日本語に対応しています。話者の区別、単語ごとの時刻、専門用語の登録もでき、1ファイル1時間まで(話者の区別や時刻を付けると30分まで)扱えます。

AI Studio で音声合成を試す手順は次のとおりです。

  1. ブラウザで https://aistudio.google.com/generate-speech を開き、Googleアカウントでログインします
  2. モデル欄で Gemini 3.8 Flash TTS か Gemini 3.8 Flash-Lite TTS を選びます
  3. 声を選び、台本と話し方の指示を入力して生成します
  4. できた音声はその場で再生し、ダウンロードできます

※画面の項目名は変わることがあります。この記事の検証はAPIで行ったため、AI Studio の画面の細部は確認していません。

無料で使うときの注意点

無料枠には、料金以外に次の条件があります。

  1. 送った内容は製品改善に使われます。 料金表の「プロダクトの改善に使用されます」は、無料枠が「はい」、有料枠が「いいえ」です。利用規約には、人の担当者が入力と出力を読む場合があることと、機密・個人情報を無料サービスに送らないようにという注意が、太字で書かれています
  2. 回数に上限があります。 具体的な数字はドキュメントになく、ログインして aistudio.google.com/rate-limit で確認する形です。上限はAPIキーごとではなく、プロジェクト単位でかかります
  3. 18歳以上・開発や業務の目的での利用が前提です(利用規約)
  4. 請求先を設定したプロジェクトがある場合は、AI Studio でも有料と同じデータ規約が適用されると案内されています

まとめると、試作や学習は無料で十分です。お客さんとの通話内容や社外秘の台本を扱うなら、有料枠に切り替えるのが安全です。

準備:APIで試す環境を作る

ここからは、APIで検証した手順を紹介します。Mac(Python 3.12)で確認しました。

APIキーの発行から仮想環境・SDK・.env・実行までの5ステップを順に示すフローチャート

図5:準備の流れ。SDK は google-genai 2.25.0 以上が必要です。静止画版:fig05-setup.png

作業フォルダを作り、Python の仮想環境(プロジェクト専用のPython環境)に SDK を入れます。

# 作業フォルダを作って移動する
mkdir -p ~/gemini-tts-test && cd ~/gemini-tts-test

# 仮想環境を作って有効化する(Windowsは .venv\Scripts\activate)
python3.12 -m venv .venv
source .venv/bin/activate

# SDK と、.env を読むためのライブラリを入れる
pip install "google-genai>=2.25.0" python-dotenv

APIキーは Google AI Studio の https://aistudio.google.com/apikey で発行します。コードに直接書かず、同じフォルダの .env ファイルに保存します。

# <YOUR_API_KEY> を発行したキーに置き換えて実行する
printf 'GEMINI_API_KEY=%s\n' '<YOUR_API_KEY>' > .env
chmod 600 .env  # 自分以外が読めないようにする

最初の1本は、次のスクリプトで作れます。台本と演技指示を分けて渡し、WAVファイルとして保存します。

# tts_basic.py — 1人の読み上げ:台本(text)と演技指示(style)を分けて渡す
import base64
from dotenv import load_dotenv
from google import genai

load_dotenv()  # 同じフォルダの .env から GEMINI_API_KEY を読む
client = genai.Client()

interaction = client.interactions.create(
    model="gemini-3.8-flash-tts",  # 速さ重視なら "gemini-3.8-flash-lite-tts"
    input=[{
        "type": "user_input",
        "content": [{
            "type": "text",
            "text": "明日の発表、ずっと準備してきたんだから、きっと大丈夫だよ。",
            "annotations": [{
                "type": "speech_metadata",
                "style": "涙をこらえながら、震える声で悲しそうに",
            }],
        }],
    }],
    response_format={"type": "audio"},  # 既定は WAV(24kHz・モノラル・16bit)
    generation_config={"speech_config": [{"voice": "Kore"}]},
)

with open("basic.wav", "wb") as f:
    f.write(base64.b64decode(interaction.output_audio.data))
print("saved basic.wav / 音声トークン:", interaction.usage.total_output_tokens)
python tts_basic.py
# 出力例: saved basic.wav / 音声トークン: 228

interaction.usage には、入力と出力のトークン数が入っています。あとで料金を計算するときに使います。

検証の設計:何を作って、どう確かめたか

自然さの評価は、聞く人の好みに左右されます。そこで今回は、「聞いた印象」だけに頼らず、機械で測れるものは測るようにしました。

声と演技・会話と長さ・実務の条件の3種類の音声を作り、文字に戻す・数値で測る・目隠し判定の3つの方法で確かめた検証設計の図

図6:検証の設計。同じ台本を Flash と Flash-Lite の両方で読ませ、聞き比べられるようにしました。静止画版:fig06-test-plan.png

確かめ方は3つです。

  • A. 文字に戻す:手元の Whisper(large-v3-turbo)と Gemini 3.5 Transcribe で音声を書き起こし、台本と比べます。読み間違いや欠けを見つけるためです
  • B. 数値で測る:話す速さ(1秒あたりの文字数)、音量、無音の割合、生成にかかった時間、請求されたトークン数を記録します
  • C. 目隠し判定:演技指示の中身を伏せたまま、音声を Gemini 3.8 Flash に聞かせ、「どの話し方に最も近いか」を6択で3回答えさせます

B と C は機械による参考値です。特に C は、Google のモデルが Google の音声を判定しているので、甘めに出る可能性があります。最終的な自然さは、ぜひ記事内の音声を聞いて判断してください。

結果1:既成の声6種を聞き比べる

まずは、同じあいさつ文を6つの既成の声で読ませました。声の性格は、ドキュメントの英語の説明をそのまま載せています。

台本:「こんにちは。今日は、Googleが公開した新しい音声合成モデルを、実際に試していきます。」

声 公式の説明 Flash TTS Flash-Lite TTS
Kore Firm ▶ 音声(8.3秒) ▶ 音声(7.2秒)
Puck Upbeat ▶ 音声(7.1秒) ▶ 音声(6.9秒)
Charon Informative ▶ 音声(7.7秒) ▶ 音声(6.2秒)
Aoede Breezy ▶ 音声(7.5秒) ▶ 音声(6.2秒)
Leda Youthful ▶ 音声(7.5秒) ▶ 音声(6.9秒)
Fenrir Excitable ▶ 音声(6.9秒) ▶ 音声(7.0秒)

12本すべてが、文字に戻すと台本と完全に一致しました(文字の誤り率0%)。日本語だからといって片言になったり、英語風のなまりが出たりはしていません。

声の高さの中央値は、Charon が約145Hz(低め)、Kore と Leda が約230Hz(高め)でした。低い声・高い声の両方がそろっています。同じ声でも、多くの声で Flash-Lite のほうが速めに話しました(最大で約2割。Kore は Flash が8.3秒、Lite が7.2秒)。

結果2:同じ一文を、6通りに演じさせる

次に、声を Kore に固定し、同じ一文を演技指示だけ変えて読ませました。指示はすべて日本語で書いています。

台本:「明日の発表、ずっと準備してきたんだから、きっと大丈夫だよ。」

演技指示(style) Flash TTS Flash-Lite TTS
(指示なし) ▶ 音声(4.8秒) ▶ 音声(4.1秒)
明るく元気に、はずむように ▶ 音声(4.8秒) ▶ 音声(4.9秒)
耳元でささやくように、小声で ▶ 音声(5.4秒) ▶ 音声(5.6秒)
涙をこらえながら、震える声で悲しそうに ▶ 音声(6.7秒) ▶ 音声(5.8秒)
怒りを抑えきれず、強い口調で ▶ 音声(5.1秒) ▶ 音声(4.7秒)
早口のニュースアナウンサーのように、きびきびと ▶ 音声(3.4秒) ▶ 音声(3.5秒)

聞き比べたうえで、数値と目隠し判定の結果を見てみましょう。

6つの演技指示ごとに、話す速さ・音量の変化と目隠し判定の正解数を Flash と Flash-Lite で並べた結果の図

図7:演技指示の結果。「ささやく」「悲しく」は音量がはっきり下がり、「早口」は速さが上がりました。静止画版:fig07-style-results.png

結果から、次の3つが読み取れます。

  • 「明るく」「ささやく」「悲しく」は確実に伝わる:目隠し判定で、両モデルとも3回中3回言い当てられました。「ささやく」は音量が9〜12dB下がり、「悲しく」は話す速さが約3割落ちています
  • 「早口」は、速さとしては守られている:Flash では話す速さが1.41倍になりました。ただ、判定モデルは「明るい話し方」と答えています。速さは指示どおりでも、アナウンサーらしい口調かどうかは聞いて確かめる必要があります
  • 「怒って」は伝わらなかった:指示なしと比べて音量も速さもほぼ変わらず、判定も0回でした

「怒り」が伝わらなかった理由を探る

「怒り」だけが伝わらなかったので、原因を探る追加の実験をしました。まず、指示の言い方を強めた「激しく怒って、声を荒げて怒鳴るように」と、英語の「furious, shouting angrily」も試しました。音量は Flash で約6dB上がったものの、判定はやはり「明るい話し方」でした。

次に、台本そのものを怒りに合う内容に変えてみました。

台本:「何度言ったらわかるの! 約束の時間は、とっくに過ぎてるんだよ。」

条件 Flash TTS Flash-Lite TTS
指示なし ▶ 音声(5.4秒) ▶ 音声(4.7秒)
怒りを抑えきれず、強い口調で ▶ 音声(5.5秒) ▶ 音声(5.0秒)

こちらは、指示なしでも、判定は4条件すべて3回中3回が「怒った口調」でした。指示を付けると、Flash では音量がさらに約4dB上がっています。

ここから分かるのは、モデルが台本の意味から感情をかなり強く読み取っていることです。励ましの文を怒って読ませると、「強さ」は出ても怒りには聞こえにくいようです。演技指示は、台本の内容と同じ方向で使うと効きやすいと言えます。

結果3:笑い・ため息などの効果音タグ

台本の中に <laugh>(笑い)、<short pause>(短い間)、<sigh>(ため息)を入れました。

台本:「えっ、本当に? <laugh> それはすごいね。<short pause> でも、締め切りは明日なんだよね。<sigh> がんばろう。」

タグの文字は、どちらのモデルでも読み上げられませんでした。Flash は、<sigh> の位置で「はぁ」というため息が文字起こしにも出るほどはっきり入りました。Flash-Lite では、ため息は文字起こしに出ていません。笑い声は文字起こしでは確かめられないので、耳で確認してください。

結果4:2人の会話を1回で作る

ポッドキャスト風に、ユイ(声:Aoede)とケン(声:Puck)の会話を作りました。発話ごとに話者名と演技指示を付け、途中に相づち |へえ| と間 <short pause> も入れています。

作った会話を Gemini 3.5 Transcribe で、話者を区別して文字に戻しました。Flash 版の結果は次のとおりです(括弧内は話し始めの時刻)。

[spk:0] (0.2s)  今日のテーマはGoogleの新しい音声合成です。ケンさん、もう試しました?
[spk:1] (6.8s)  試しました。
[spk:0] (7.9s)  へえ。
[spk:1] (8.6s)  正直日本語がここまで自然だとは思ってなかったです。
[spk:0] (13s)   どのあたりが一番驚きました?
[spk:1] (15.3s) 間の取り方ですね。人が考えながら話す時のあの一瞬の間があるんです。
[spk:0] (22.1s) へえ。それは聞いてみたい。じゃあ早速行きましょう。

注目したいのは3行目です。台本ではケンのセリフの中に |へえ| と書きましたが、実際には聞き手のユイの声で「へえ」が入っています。相づちの記法が、狙いどおり「聞き手の反応」として働いていることが確認できました。

会話のコードは次のとおりです。発話ごとに話者名と演技指示を付け、speakers で話者名と声を対応させます。

# tts_dialog.py — 2人の会話:発話ごとに話者名と演技指示を付ける
import base64
from dotenv import load_dotenv
from google import genai

load_dotenv()
client = genai.Client()

def line(speaker, text, style):
    return {"type": "text", "text": text,
            "annotations": [{"type": "speech_metadata", "speaker": speaker, "style": style}]}

interaction = client.interactions.create(
    model="gemini-3.8-flash-tts",
    input=[{"type": "user_input", "content": [
        line("ユイ", "今日のテーマは、Googleの新しい音声合成です。ケンさん、もう試しました?", "明るく、番組の冒頭らしく"),
        # |へえ| は聞き手(ユイ)の相づち、<short pause> は短い間
        line("ケン", "試しました。|へえ| 正直、日本語がここまで自然だとは思ってなかったです。", "少し驚いた様子で"),
        line("ユイ", "どのあたりが一番驚きました?", "興味津々に"),
        line("ケン", "間の取り方ですね。<short pause> 人が考えながら話すときの、あの一瞬の間があるんです。", "思い出しながら、ゆっくり"),
    ]}],
    response_format={"type": "audio"},
    generation_config={"speech_config": {
        "mode": "conversational",
        "speakers": [{"speaker": "ユイ", "voice": "Aoede"}, {"speaker": "ケン", "voice": "Puck"}],
    }},
)
open("dialog.wav", "wb").write(base64.b64decode(interaction.output_audio.data))
print("saved dialog.wav")

2人会話で使える声について、今回読んだドキュメントの範囲では、1回のリクエストで使えるのは既成の声の2人までとされています。ボイスデザインで作った声を会話にしたいときは、話者ごとに別々に生成してつなぐ方法が案内されています。

結果5:説明文から声を作る(ボイスデザイン)

ボイスデザインでは、声の特徴を文章で説明すると、新しい声が作られて voice_... というIDで保存されます。1声を作るのに約20〜27秒かかりました。作った声で読ませた結果は次のとおりです。

説明文(要約) 読ませたセリフ 音声
大阪の商店街で40年たこ焼き屋を営む、陽気でせっかちな60代男性。こてこての関西弁で、少ししゃがれた声 まいど! 焼きたてやで。今日はタコ大きめにしといたから、熱いうちに食べてや。 ▶ 音声(4.9秒)
深夜のドキュメンタリー番組のナレーター。低く落ち着いた声の50代女性で、静かにゆっくり語る その夜、研究室の明かりは、最後まで消えることがなかった。 ▶ 音声(6.2秒)
明るく元気な20代の女性。声は高めで、うれしいとつい早口になる ねえねえ、聞いて! 今日のライブ、最前列だったんだよ! ▶ 音声(4.3秒)

数値で見ても、説明文の特徴はよく反映されています。ナレーターは声の高さの幅が5.9半音と、ほかの声(11〜17半音)の半分程度でした。「抑揚を抑えて静かに語る」話し方になっています。関西弁の店主は1秒あたり6.7文字と、今回作った声の中で最も速く話しました。「せっかち」の指示どおりです。

子どもの声は作れなかった

実は最初、3つ目の声は「好奇心いっぱいの小学3年生の男の子」でした。ところがこの説明文だけは、Voice prompt was blocked by safety policies. というエラーで、0.6秒で拒否されました。大人の声の説明文は、日本語・英語を含めて試した6つすべてが作成できました。子どもの声を説明文から作ることは、安全ポリシーで制限されているようです。

ボイスデザインのコードは次のとおりです。

# tts_design.py — 説明文から声を作り(1回だけ)、そのIDで読み上げる
import base64
from dotenv import load_dotenv
from google import genai

load_dotenv()
client = genai.Client()

voice = client.voices.create(  # 作成には20秒ほどかかる。作った声はプロジェクトに保存される
    store=True,
    voice={
        "model": "gemini-3.8-flash-tts",
        "type": "prompted",
        "display_name": "kansai-takoyaki",
        "gender": "male",
        "language_code": "ja-JP",
        "prompted": {"input": "大阪の商店街で40年たこ焼き屋を営む、陽気でせっかちな60代の男性。"
                               "こてこての関西弁で、少ししゃがれた声。お客さんに話しかけるように話す。"},
    },
)
print("voice id:", voice.id)  # 次回からはこのIDを使えば作り直し不要

interaction = client.interactions.create(
    model="gemini-3.8-flash-tts",
    input=[{"type": "user_input", "content": [
        {"type": "text", "text": "まいど! 焼きたてやで。今日はタコ大きめにしといたから、熱いうちに食べてや。"}]}],
    response_format={"type": "audio"},
    generation_config={"speech_config": [{"voice": voice.id}]},
)
open("design.wav", "wb").write(base64.b64decode(interaction.output_audio.data))
print("saved design.wav")

作った声は、1プロジェクトあたり200件まで、1年間保存されます(ボイスデザインのドキュメントより)。試すたびに作り直すと枠を使ってしまうので、IDを控えておきましょう。

結果6:読み間違えやすい日本語

実務で困りやすいのが、数字・英語・読みが複数ある漢字です。次の台本を、両モデルで2回ずつ読ませました。

台本:「2026年9月24日、GoogleはGemini 3.8 Flash TTSを公開しました。料金は100万トークンあたり9ドルで、1分の音声なら約1.35セントです。APIとGPU、LLMの比較表は、午後3時15分から生配信します。市場で買った生物は、今日中に冷蔵庫へ。会議は3階の大会議室で行います。担当は、角田さんと東海林さんです。」

※台本中の「約1.35セント」は読み上げ用の例文です。実測の料金は後の章で紹介します。

漢字で書き起こすと、読みの違いが見えなくなります。そこで、音声を「聞こえたとおりにひらがなで書き起こして」と Gemini 3.8 Flash に渡し、Gemini 3.5 Transcribe と Whisper の書き起こしとも照らし合わせました。

東海林・生物・Gemini・数字の読みについて、Flash と Flash-Lite の2回ずつの結果を正誤で並べた図

図8:読みの結果。数字や英語は両モデルとも問題なし。差が出たのは人名と、文脈で読みが変わる言葉でした。静止画版:fig08-reading.png

差がはっきり出たのは次の2つです。

  • 東海林さん:Flash は2回とも「しょうじ」と正しく読みました。Flash-Lite は「とうかいりん」「とうかいり」と2回とも読み間違えました
  • 市場で買った生物:Flash は2回とも文脈どおり「なまもの」。Flash-Lite は1回「せいぶつ」と読みました

数字(年月日・小数・時刻)と、API・GPU・LLM などの英字略語は、両モデル4回とも問題ありませんでした。「角田」は「つのだ」と「かどた」に分かれましたが、どちらも実在する読みなので、誤りとは言えません。

人名や読みを確実に指定したいときは、台本側をひらがなで書くのが一番確実です。 今回の結果では、特に Flash-Lite を使う場合に効きそうです。

結果7:約2分半のナレーションを1回で

公式ブログでは、長い音声でも声の質や話す速さが崩れにくい点が強調されています。そこで、約810文字の読み物(音声合成の歴史をテーマにした、この記事用の書き下ろし)を1回のリクエストで読ませました。

どちらも最後まで途切れず、文章の抜けや同じ部分の繰り返しもありませんでした。文字起こしでの食い違いは、「深層学習」が「真相学習」になるような同じ音の別の漢字がほとんどでした。これは文字起こし側の変換の問題で、読み方の誤りではありません。

生成にかかった時間は、Flash が54秒、Flash-Lite が42秒でした。音声の長さの約3分の1の時間で作れています。

1回のリクエストで出力できるのは16,384トークンまでです(モデルのページより)。今回の実測(1秒あたり約32トークン)で割ると、1回あたり約8分半が上限の目安になります。それより長い音声は、段落ごとに分けて生成してつなぎます。

結果8:速さと、電話への組み込み

電話の自動応答では、相手が話し終えてから返事の声が出るまでの「間」が体験を大きく左右します。そこで、ストリーミング(少しずつ受け取る方式)で、最初の音が届くまでの時間(TTFA:Time To First Audio)を5回ずつ測りました。

ストリーミングの最初の音までの時間・一括生成の時間・長いナレーションの生成時間を、Flash と Flash-Lite の横棒グラフで比べた図

図9:速さの実測。応答の速さに効くのは「最初の音が届くまで」の時間です。静止画版:fig09-speed.png

実測値を表にまとめます。

測定 Flash TTS Flash-Lite TTS
最初の音が届くまで(5回の中央値) 1.82秒(1.54〜1.94秒) 1.33秒(1.02〜1.55秒)
約6秒の音声が全部届くまで(中央値) 6.62秒 5.48秒
約37秒の読み上げ(一括) 16.0秒 12.0秒
2人会話 約26秒(一括) 11.7秒 9.4秒
約2分半のナレーション(一括) 54.2秒 41.8秒

Flash-Lite は、最初の音が約0.5秒早く届きます。2026年9月24日に自宅回線のMacから測った値なので、回線や時間帯によって変わります。目安として見てください。

ストリーミングのコードは次のとおりです。受け取った音声を、届いたそばからスピーカーへ流せば、全体の完成を待たずに話し始められます。

# tts_stream.py — 音声を少しずつ受け取り、最初の音が届くまでの時間を測る
import base64, time, wave
from dotenv import load_dotenv
from google import genai

load_dotenv()
client = genai.Client()

t0 = time.perf_counter()
stream = client.interactions.create(
    model="gemini-3.8-flash-lite-tts",
    input=[{"type": "user_input", "content": [
        {"type": "text", "text": "お電話ありがとうございます。ご予約の確認ですね。お名前を伺ってもよろしいでしょうか。"}]}],
    response_format={"type": "audio"},
    generation_config={"speech_config": [{"voice": "Kore"}]},
    stream=True,
)
chunks, first = [], None
for event in stream:
    if event.event_type == "step.delta" and event.delta.type == "audio":
        if first is None:
            first = time.perf_counter() - t0
        chunks.append(base64.b64decode(event.delta.data))  # ここでスピーカーへ流せば即再生できる

# ストリーミングはヘッダーなしの生データ(24kHz・16bit・モノラル)なので WAV の枠を付けて保存
with wave.open("stream.wav", "wb") as w:
    w.setnchannels(1); w.setsampwidth(2); w.setframerate(24000)
    w.writeframes(b"".join(chunks))
print(f"最初の音まで {first:.2f} 秒 / 合計 {time.perf_counter() - t0:.2f} 秒")
python tts_stream.py
# 出力例: 最初の音まで 1.14 秒 / 合計 5.64 秒

電話の自動応答に組み込むなら

音声合成は、ボイスエージェントの最後の部品です。全体の流れの中で、どこに待ち時間が生まれるかを図にしました。

聞き取り・考える・声にする・電話回線への4段階と、各段階で使える部品や待ち時間の注意点を示す流れ図

図10:電話の自動応答の流れ。③の数値は実測、それ以外は公式ドキュメントとブログをもとにした概念図です。静止画版:fig10-voice-agent.png

電話で使うときに役立つのが、出力形式をμ-law(ミューロー)・8kHzにできる点です。電話回線で一般的な形式なので、変換の手間が1つ減ります。response_format に1行足すだけで、指定どおりの形式で返ってきました。

# 電話向け:μ-law・8kHz で出力する(ヘッダーなしの生データで返る)
response_format={"type": "audio", "mime_type": "audio/mulaw", "sample_rate": 8000}

8kHzで作った音声(電話の音質):▶ 音声(5.7秒)

電話の音質でも、文字に戻すと台本と完全に一致しました。

なお、3.8 TTS は Live API(常時接続の双方向会話)には対応していません。聞き取りから返事までを1つのモデルで済ませたい場合は、Live API に対応したモデルと比べて選ぶのがよいでしょう。公式ブログでは、LiveKit・Pipecat・Agora など、ボイスエージェントを組み立てる開発基盤との連携も案内されています。

結果9:前の世代(3.1 Flash TTS Preview)と比べる

前の世代の gemini-3.1-flash-tts-preview でも、同じ文を読ませました。

使い方の面で、はっきりした違いが2つありました。

  • 3.1 は演技指示の欄(speech_metadata)に非対応で、Speech annotations are not supported というエラーになります。3.1 では従来どおり台本の頭に指示を書く必要があり、今回はその指示部分は読み上げられませんでした
  • 3.1 は、ヘッダーの付かない生の音声データを返します。 そのままWAVとして開こうとすると file does not start with RIFF id というエラーになります。3.8 は、既定でWAVの形で返ってきます

3.1 から移行するときは、台本に書いていた指示を style へ移し、保存処理を見直すことになります。

料金:実測トークンで計算すると1分いくら?

料金表の注記には「音声1秒あたり25トークン」とあります。ところが今回、トークン数を記録できた46本では、実際に請求された音声トークンが、どれも1秒あたり32.0〜32.3トークンでした。例えば4.68秒の音声が150トークンです。そこで、実測値で1分あたりの料金を計算しました。

モデル 1分あたりの音声トークン(実測) 2026年末までの料金 2027年1月からの料金
Flash TTS 約1,920 約1.7セント(約2.5円) 約3.5セント(約5円)
Flash-Lite TTS 約1,920 約1.2セント(約1.7円) 約2.3セント(約3.3円)

円換算は1ドル=145円の目安です。台本(テキスト入力)の料金は、1分あたり0.01セントにも届かないため無視できます。トークン数を記録した46本(Flash 約6分・Flash-Lite 約5分半の音声)を有料枠で作った場合でも、合計17セントほどです。

さらに安くしたい場合は、急がない一括生成向けの Batch(料金表では音声出力が半額)も選べます。

Flash と Flash-Lite、どちらを選ぶ?

ここまでの結果を、選び方の目安にまとめます。

用途が「固有名詞が多い・作品として残す」なら Flash、「速さと量が大事」なら Flash-Lite を選ぶ判断フロー

図11:選び方の目安。同じコードのままモデル名を変えるだけで切り替えられます。静止画版:fig11-choose.png

判断のポイントは次のとおりです。

  • Flash TTS が向く用途:ナレーション、オーディオブック、動画の吹き替え、人名や固有名詞が多い台本。読みの正確さと、効果音タグの表現で有利でした
  • Flash-Lite TTS が向く用途:電話の自動応答、通知の読み上げ、大量の一括生成。最初の音が約0.5秒早く、料金は約3分の2です。人名はひらがなで渡しましょう
  • 迷ったら:まず Flash で作り、本番と同じ台本で Flash-Lite と聞き比べるのが安全です

うまくいかないとき:今回実際に出たエラー

検証中に実際に出たエラーと、その対処をまとめました。

今回の検証で実際に遭遇した5つのエラーや問題と、それぞれの対処を順に示す図

図12:実際に出たエラーと対処。エラー文は原文のままです。静止画版:fig12-trouble.png

表でも整理しておきます。

症状・エラー 原因 対処
Voice prompt was blocked by safety policies. ボイスデザインで子どもの声を説明した 大人の声の説明に変える
Speech annotations are not supported for model 'gemini-3.1-flash-tts-preview' 旧モデルに演技指示の欄を送った モデル名を gemini-3.8-... にする
file does not start with RIFF id 3.1 やストリーミングの生データをWAVとして開いた 24kHz・16bit・モノラルのWAVの枠を付けて保存する
演技の指示まで読み上げられる 指示を台本(text)の中に書いた 指示は speech_metadata の style に書く
文字起こしで話者ラベルが返ってこない 3.5 Transcribe で話者の区別だけを頼んだ timestamp_granularities: ["word"] も一緒に指定する(2026年9月24日時点の挙動)

最後の話者ラベルの件は、ドキュメントの例とは違う挙動でした。今後修正される可能性があります。

まとめ

Gemini 3.8 Flash TTS / Flash-Lite TTS を、日本語の台本で58本作って検証しました。要点を振り返ります。

  • 日本語の自然さは高い:既成の声12本は、文字に戻すと台本と完全に一致しました。2分半の長いナレーションも、1回で崩れずに生成できました
  • 演技は「台本と同じ方向」なら効く:明るく・ささやく・悲しくは確実に伝わりました。台本の内容と逆の感情は伝わりにくいです
  • 読みの正確さは Flash、速さと料金は Flash-Lite:人名の読みで差が出ました。最初の音は Flash-Lite が約0.5秒早く届きます
  • 料金は1分あたり約1.2〜1.7セント:料金表の注記(1秒25トークン)より、実際の請求(1秒約32トークン)は多めでした
  • AI Studio と無料枠で試せる:ただし、送った内容は製品改善に使われます。業務の台本は有料枠で

次に試すなら、次の3つがおすすめです。

  1. 自分の動画の台本1本を、Flash と Flash-Lite で読ませて聞き比べる
  2. ボイスデザインで「番組の顔」になる声を1つ作り、IDを保存して使い回す
  3. 本人の同意を取ったうえで、ボイス複製(Voice Replication)を試す

参考リソース

公式情報は、いずれも2026年9月24日に確認しました。

検証環境

  • 日時:2026年9月24日(日本時間)
  • 端末:Mac(Apple Silicon)、Python 3.12、google-genai 2.25.0
  • 文字起こし:mlx-whisper(whisper-large-v3-turbo)、Gemini 3.5 Transcribe
  • 演技の目隠し判定:Gemini 3.8 Flash(6択×3回)
  • 音声の掲載:WAVで生成した音声を、Webで再生しやすいようMP3(64kbps、電話音質のみ32kbps)に変換して掲載しています
0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?