Gemini 3.8 Flash TTSは、話し方の指定と、本文に入れるタグを分けて書きます。
間を入れたいだけなら、<short pause>と<long pause>の2つを覚えれば足ります。
- 間・息・笑い・ため息:本文の中に、英語のタグを山括弧で書く
- 全体の速さや声の調子:本文とは別の style に書く
- 閉じタグ:いらない
- 日本語の原稿でも:タグは英語・半角で書く
記法とAPI形式は2026年10月23日に公式ガイドと照合しました。測定値は2026年9月27日の既存記録です。今回は元音声・測定コード・書き起こしを再照合しておらず、API生成や聴取も再実施していません。
よく使う記法の早見表
| やりたいこと | 書き方 | 書く場所 |
|---|---|---|
| 短い間 | <short pause> | 本文 |
| 長めの間 | <long pause> | 本文 |
| 息を吸う | <breath> | 本文 |
| 笑う | <laugh> | 本文 |
| 軽く笑う | <chuckle> | 本文 |
| ため息 | <sigh> | 本文 |
| 咳払い | <throat-clearing> | 本文 |
| 全体をゆっくり読む | speaking slowly | style |
| 全体を穏やかに読む | calm and relaxed | style |
タグは、日本語の原稿の中でも英語のまま、半角の山括弧で書きます。
styleと本文のタグの違い
Gemini 3.8 Flash TTSは、本文をそのまま読み上げる原稿として扱います。
そのため公式ガイドでは、指示を効く範囲で2つに分けて書くよう説明されています。
| 効く範囲 | 書く場所 | 例 |
|---|---|---|
| 発話の最初から最後まで続くもの(感情・速さ・声の調子) | speech_metadata の style | speaking slowly、calm and relaxed、whispers |
| ある一点で起きるもの(間・息・笑い) | 本文の中 | <short pause>、<breath>、<laugh> |
styleには、年齢・性別・名前・ずっと変わらない訛りは書かないよう勧められています。
それらは、声そのものを選ぶか、Voice designで声を作る側で決めます。
間の入れ方
句読点で入れる
公式ガイドでは、カンマ・ダッシュ・三点リーダーで、会話らしい自然なためらいが出るとされています。
タグを使う前に、まず句読点で足りるかを聞いてみると手間が減ります。
<short pause>と<long pause>
間を置きたい位置に、そのままタグを書きます。
今日の作業はここまでです。<long pause>明日は資料の見直しから始めます。秒数を指定する記法は、公式ガイドにはありません。
実際にどれくらい間が空くか
以下は同じ原稿を各3回生成し、途中で最長の無音を測った当時の記録です。モデル・声・原稿に依存する参考値で、タグの秒数仕様ではありません。
| タグを置いた場所 | タグ | いちばん長い無音(3回) |
|---|---|---|
| 文末(「。」のあと) | なし | 0.48〜0.69秒 |
| 文末(「。」のあと) | <short pause> | 0.22〜0.90秒 |
| 文末(「。」のあと) | <long pause> | 1.47〜3.13秒 |
| 文の途中(読点なし) | なし | 0.08〜0.23秒 |
| 文の途中(読点なし) | <short pause> | 0.31〜0.79秒 |
掲載した各3回の記録では、文末の無指定と<short pause>の範囲が重なっています。この少数試行だけで、タグに効果がないとは判断できません。
句点のみでも0.48〜0.69秒の無音が記録されています。ただし、測った「途中で最長の無音」が必ずタグ位置の間に対応するとは限らず、波形と聴取で位置を確かめる必要があります。
文の途中に入れた<short pause>は、3回中2回で0.8秒近い間になりました。
<long pause>は、はっきり間が伸びる一方で、1.5秒から3.1秒まで回ごとの差が大きく出ました。
固定秒数が必要なら生成後に波形と聴取で対象位置を確認し、音声編集で無音を調整します。再生成による聞き比べだけでは長さを保証できません。
測った原稿は次の2つです。
文末:今日の作業はここまでです。(ここにタグ)明日は資料の見直しから始めます。
文の途中:資料は(ここにタグ)明日までに出します。息・笑い・ため息のタグ一覧
公式ガイドで勧められているタグは、次のとおりです。
| 種類 | タグ |
|---|---|
| 息 | <breath>、<heavy breath>、<exhales>、<pant>、<gasp>、<yawn> |
| 笑い | <laugh>、<laughter>、<chuckle>、<chuckles>、<giggle>、<snicker>、<cackle> |
| ため息・ほっとする | <sigh>、<sighs>、<phew>、<pff> |
| 泣く・うめく | <cry>、<sob>、<whimper>、<groan>、<moan> |
| 叫ぶ・声を張る | <scream>、<shriek>、<shout>、<cheer> |
| いら立ち・うなり | <argh>、<grr>、<growl>、<grunt>、<hiss>、<tsk>、<snort> |
| 体の音 | <cough>、<sneeze>、<throat-clearing> |
| ささやき | <whispers>、<whispering> |
| 間 | <short pause>、<long pause> |
拍手や物音のような、人の声でない効果音のタグは避けるよう書かれています。
当方の試しでは、<laugh>と<sigh>は、書き起こしにも笑い声・ため息として出ました。
当時の書き起こしは<breath>を拾いませんでした。書き起こしに出ないことだけでは、息の音が生成されなかったとは判断できません。
日本語の原稿でもタグは英語・半角で書く
公式ガイドには、英語以外の原稿でも、タグは英語のまま使うと良い結果になると書かれています。
閉じタグはなく、<laugh>…</laugh>のように囲む書き方は公式ガイドに載っていません。
全角や日本語で書いたときに起きたこと
同じ原稿で、タグの書き方だけを変えて音声を作り、読まれた言葉を書き起こして比べました。
| タグの書き方 | 作った回数 | 原稿にない言葉が入った回数 | 入った言葉 |
|---|---|---|---|
| <short pause>(英語・半角) | 5 | 0 | - |
| <short pause>(全角の山括弧) | 6 | 3 | 少し休み、ちょっと待ってくださいね、少し長かったかな |
| <短い間>(日本語) | 6 | 2 | 短い間 |
全角の山括弧では、原稿にない一言をAIが足してしまうことがありました。
日本語で書いたタグは、「短い間」とそのまま読み上げられることがありました。
日本語入力のまま打つと山括弧が全角になりやすいので、半角に切り替えてから打ちます。
styleの書き方
styleは、speech_metadata の中に、短い言葉で書きます。
公式ガイドには、次のような例が載っています。
- cheerful and friendly(明るく親しげに)
- calm and relaxed(落ち着いて)
- speaking slowly(ゆっくり)
- speaking rapidly(早口で)
- whispers(ささやく)
- out of breath(息を切らして)
- monotone and flat(抑揚なく)
公式ガイドでは、まずstyleを空にして試し、直したい発話にだけ短い指定を足す手順が勧められています。
何段落もある長い演出メモは、声が回ごとにぶれるいちばんの原因とされています。
話の途中で感情を変えたいときは、発話を分けて、それぞれにstyleを付けます。
styleの効き方
30字ほどの原稿を、styleなしと、styleありで3回ずつ音声にして、話している部分の長さを測りました。
| style | 話している部分の長さ(3回) |
|---|---|
| なし | 4.10〜4.57秒 |
| speaking slowly | 9.27〜9.86秒 |
| ゆっくり話す | 8.56〜9.62秒 |
どちらも2倍ほどの長さになり、日本語で書いたstyleも効いていました。
ただし公式ガイドの例はすべて英語なので、迷ったら英語で書くほうが無難です。
コードで書くとこうなる
本文はtext、styleは同じ発話のannotationsに書きます。Python例はgoogle-genai >= 2.25.0と、対象モデルを利用できるAPI認証が前提です。APIキーはGEMINI_API_KEYなどの安全な環境設定で渡し、コードへ直書きしないでください。
import base64
from google import genai
client = genai.Client()
interaction = client.interactions.create(
model="gemini-3.8-flash-tts",
input=[{
"type": "user_input",
"content": [{
"type": "text",
"text": "今日の作業はここまでです。<long pause>明日は資料の見直しから始めます。",
"annotations": [{
"type": "speech_metadata",
"style": "speaking slowly",
}],
}],
}],
response_format={"type": "audio"},
generation_config={"speech_config": [{"voice": "Kore"}]},
)
with open("out.wav", "wb") as f:
f.write(base64.b64decode(interaction.output_audio.data))これは公式ガイドのPython例の本文とstyleを変更したものです。interaction.output_audioはSDKの便利プロパティで、RESTのJSONではsteps[].content[].dataの音声ブロックを扱います。レスポンスのMIMEタイプを確認して保存してください。
2026年9月27日の記録では、同じ中身をREST(/v1beta/interactions)で送って音声生成を確認しています。今回のPython SDKでの実行確認ではありません。
この単発リクエストの既定出力はaudio/wavです。base64を復号したWAVへヘッダーを重ねて付けないでください。PCMなどを明示指定した場合は、指定形式に応じて保存方法を変えます。
2人の会話と相づちの記法
1回のリクエストで話させられるのは、用意された声を使った2人までです。
発話ごとに text を分け、それぞれの speech_metadata に speaker を書きます。
公式の移行ガイドでは、すべての発話に speaker を書くことが求められています。
"content": [
{"type": "text", "text": "資料はもう見ましたか?",
"annotations": [{"type": "speech_metadata", "speaker": "Joe"}]},
{"type": "text", "text": "<chuckle>まだ半分です。",
"annotations": [{"type": "speech_metadata", "speaker": "Jane"}]},
],
# generation_config の speech_config に書く
"speech_config": {
"mode": "conversational",
"speakers": [
{"speaker": "Joe", "voice": "Puck"},
{"speaker": "Jane", "voice": "Kore"},
],
},RESTのspeech_config.modeにはconversationalを指定できます。本文の2話者コードはRESTのフィールド構成を説明する断片で、そのまま実行するPythonプログラムや完全なJSONではありません。現行SDK例ではspeech_configへspeakersを持つオブジェクトを渡します。
聞き手の短い相づちは、話し手の発話の中に縦棒で囲んで書けます。
So the launch is Thursday |oh hmm| Are we actually ready?縦棒の中は、聞き手の相づちとして重ねて読まれます。
2話者の設定と相づちは公式資料に基づく例ですが、この記事では音声生成を検証していません。カスタム音声で複数話者を組み合わせる場合は、各話者の発話を別々に生成する方法が案内されています。
旧モデルから移るときに変わる書き方
gemini-3.1-flash-tts-preview までは、演出の指示を本文に書き込む使い方がありました。
3.8では、その指示を style に、話者の名前を speaker に移すよう、公式の移行ガイドに書かれています。
当方の試しでは、「(ゆっくり穏やかに)」や「(speaking slowly)」を本文の頭に書いても、5回とも読み上げられはしませんでした。
ただ、本文に指示を書く使い方は3.8の公式ガイドでは案内されていないため、styleに書くほうが確かです。
音声の形式も変わり、以前は頭の情報がない生のPCMで返っていたのが、3.8ではWAVで返ります。
自分でWAVの頭を付けていたコードは、その処理を外して、返ってきた中身をそのまま書き出すよう案内されています。
APIの料金は、ChatGPT・Claude・GeminiのAPI料金の比較にまとめています。
出典
よくある質問:Gemini 3.8 Flash TTSのタグと話し方
Gemini 3.8 Flash TTSで、間を入れるには、どう書きますか?
本文の中に、英語のタグを半角の山括弧で書きます。
短い間は <short pause>、長めの間は <long pause> です。
間を入れたいだけなら、この2つを覚えれば足ります。
閉じタグはいりません。
句読点でも間は入ります。
<short pause> を文末に入れると、間は長くなりますか?
9月27日の既存記録では文末の無指定と<short pause>の測定範囲が重なりました。各3回の参考値なので、差がないという一般的な結論にはできません。
句点のみでも0.48〜0.69秒の無音が記録されています。ただし、測った「途中で最長の無音」が必ずタグ位置の間に対応するとは限らず、波形と聴取で位置を確かめる必要があります。
文の途中に入れた <short pause> は、3回中2回で0.8秒近い間になりました。
<long pause> は、どれくらいの間になりますか?
文末に入れると、記事の測定では1.47〜3.13秒で、はっきり間が伸びる一方、回ごとの差が大きく出ました。
固定秒数が必要なら生成後に波形と聴取で対象位置を確認し、音声編集で無音を調整します。再生成による聞き比べだけでは長さを保証できません。
息・笑い・ため息は、どのタグで入れますか?
息は <breath>、笑いは <laugh>・<chuckle>、ため息は <sigh>、咳払いは <throat-clearing> などです。
公式ガイドで勧められているタグには、ほかにも泣く・叫ぶ・ささやくなどの種類があります。
拍手や物音のような、人の声でない効果音のタグは避けるよう書かれています。
当時の書き起こしでは笑い・ため息が記録され、息は拾われませんでした。音が実際に生成されたかの判定には、元音声の聴取と波形の確認が必要です。
日本語の原稿でも、タグは英語で書くのですか?
英語・半角で書きます。
公式ガイドには、英語以外の原稿でも、タグは英語のまま使うと良い結果になると書かれています。
記事の測定では、全角の山括弧では、原稿にない一言をAIが足してしまうことがあり、日本語で書いたタグは、「短い間」とそのまま読み上げられることがありました。
日本語入力のまま打つと山括弧が全角になりやすいので、半角に切り替えてから打ちます。
全体の速さや声の調子は、どこに書きますか?
本文とは別の style に、短い言葉で書きます。
公式ガイドの例は、cheerful and friendly(明るく親しげに)、calm and relaxed(落ち着いて)、speaking slowly(ゆっくり)、speaking rapidly(早口で)、whispers(ささやく)などです。
まず style を空にして試し、直したい発話にだけ短い指定を足す手順が勧められています。
何段落もある長い演出メモは、声が回ごとにぶれるいちばんの原因とされています。
話の途中で感情を変えたいときは、発話を分けて、それぞれに style を付けます。
日本語で書いた style も、効きますか?
記事の測定では、speaking slowly でも、日本語の「ゆっくり話す」でも、話している部分の長さが2倍ほどになり、効いていました。
ただし、公式ガイドの例はすべて英語なので、迷ったら英語で書くほうが無難です。
2人の会話や、旧モデルからの移行は、どうしますか?
1回のリクエストで話させられるのは、用意された声を使った2人までで、発話ごとに text を分け、それぞれの speech_metadata に speaker を書きます(公式の移行ガイドは、すべての発話に speaker を書くことを求めています)。
RESTのspeech_config.modeにはconversationalを指定できます。本文の2話者コードはRESTのフィールド構成を説明する断片で、そのまま実行するPythonプログラムや完全なJSONではありません。現行SDK例ではspeech_configへspeakersを持つオブジェクトを渡します。
gemini-3.1-flash-tts-preview までは演出の指示を本文に書き込む使い方がありましたが、3.8では、その指示を style に、話者の名前を speaker に移します。
なお、2人の会話と相づちは、記事の筆者は試していません。
記法は2026年10月23日の公式ガイドと照合済みです。掲載した9月の測定記録は今回再検証しておらず、現行SDK実行・音声生成・聴取・2話者の相づちも未検証です。
