Gemini 3.8 Flash TTSは、話し方の指定と、本文に入れるタグを分けて書きます。
間を入れたいだけなら、<short pause>と<long pause>の2つを覚えれば足ります。
- 間・息・笑い・ため息:本文の中に、英語のタグを山括弧で書く
- 全体の速さや声の調子:本文とは別の style に書く
- 閉じタグ:いらない
- 日本語の原稿でも:タグは英語・半角で書く
この記事は、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秒 |
文末では、<short pause>を入れても入れなくても、間の長さにほとんど差が出ませんでした。
句点だけで0.5秒前後の間が空いていたためです。
文の途中に入れた<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 の中に書きます。
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だけを差し替えたものです。
当方は、同じ中身をREST(/v1beta/interactions)で送って音声ができることを確かめました。
Gemini 3.8のTTSは、何も指定しなければWAVで返すので、そのままファイルに書けば再生できます。
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"},
],
},mode を conversational にすると、会話らしい間合いで順番に話します。
聞き手の短い相づちは、話し手の発話の中に縦棒で囲んで書けます。
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料金の比較にまとめています。
