Gemini TTSが400「Unknown parameter ‘mode’」で止まった。speech_configからmodeを外したら通った
道具には何も手を入れていないのに、きのうまで通っていたリクエストが400で返ってきました。
2026年10月24日の朝、7時すぎのことです。
自作の組み立てツールは、最初の場面で次の文を出して止まりました。
シーン1 会話モード: HTTP 400(リクエストの形式か内容が受け付けられませんでした)。
API の返答: Unknown parameter 'mode' at 'generation_config.structured_speech_config'.
直し方は、リクエストから "mode": "conversational" の1行を消すことでした。
複数話者の指定は、speakers の並びだけを残します。
消した形で1回だけ送って通るのを見てから、道具を直しました。
僕は英語圏向けの日本語学習チャンネル「Honto Japanese」で、2人の会話の声をGeminiのTTSで作っています。
TTSは、文字を読み上げ音声にする機能のことです。
この日は26本目の声を作る予定でした。
前日の25本目は、同じ道具、同じ書き方で通っています。
エラー文が言っていること
Unknown parameter は、知らない項目が入っているという意味です。
400は、送った中身の形がおかしいときに返る番号です。
Googleのエラー一覧にも、未知の項目は400で、外して送り直すよう書かれています。
引っかかるのは、場所の名前です。
僕が送ったのは speech_config で、structured_speech_config とは書いていません。
APIの項目の一覧を見ると、声の設定の項目は structured_speech_config という名前で載っています。
使い方の説明の例は、speech_config と書いています。
同じ項目の別名で、エラーは中の名前で答えている、と僕は見ています(推測です)。
なので、このエラーは speech_config の中に mode がある、という意味に読めます。
前日まで通っていた書き方
当時の道具が送っていた、声の設定の部分です。
2人の話し手(Interactions APIの会話モード)を指定しています。
"generation_config": {
"speech_config": {
"mode": "conversational",
"speakers": [
{ "speaker": "A", "voice": "<声の名前>" },
{ "speaker": "B", "voice": "<声の名前>" }
]
}
}
"mode": "conversational" は、9月25日に公式の説明を読んで入れたものです。
自然な受け答えの間合いにする指定、として載っていました。
10月24日の朝に公式の説明を開き直しても、例にはまだこの行がありました。
説明どおりに書いて、APIだけが変わっていたことになります。
直したあとの形
mode の行を消して、speakers だけにします。
"generation_config": {
"speech_config": {
"speakers": [
{ "speaker": "A", "voice": "<声の名前>" },
{ "speaker": "B", "voice": "<声の名前>" }
]
}
}
今の公式の説明は、この形です。
複数話者は {"speakers": [...]} のオブジェクト、1人なら [{"voice": "..."}] の配列で渡す、とあります。
1回のリクエストで話せるのは、用意された声で2人までです。
1人で読ませる形は、もともと mode を入れていませんでした。
こちらは変えずに、日本語1文で1回だけ試し、通るのを確かめています。
道具の中では、リクエストを組み立てる関数の1か所だけを変えました。
変える前に、元のファイルの写しを残しています。
if multi:
# 2026-10-24: API が mode を受け付けなくなった → speakers だけにする
speech = {"speakers": [{"speaker": label, "voice": voice}
for label, voice in speakers]}
else:
speech = [{"voice": speakers[0][1]}]
道具を直す前に、1回だけ送って確かめた
400が出たとき、すぐ道具を書き換えると、別の原因だったときに戻すのが手間です。
声は1回ごとにお金がかかり、1日に送れる回数にも上限があります。
そこで、直した形のリクエストを手で1回だけ送りました。
返ってきたのは、完了を表す completed と、音声が1つです。
それを見てから道具を直し、そのまま26本目の10場面の声を作りました。
手元で同じ確かめ方をするなら、公式の例を短くしたこの形が使えます。
キーは環境変数(プログラムに外から渡す設定の値)の GEMINI_API_KEY に入れておきます。
curl -s -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.8-flash-tts",
"input": [{
"type": "user_input",
"content": [
{"type": "text", "text": "Hello, Jane.",
"annotations": [{"type": "speech_metadata", "speaker": "Joe"}]},
{"type": "text", "text": "Hi, Joe.",
"annotations": [{"type": "speech_metadata", "speaker": "Jane"}]}
]
}],
"response_format": {"type": "audio"},
"generation_config": {
"speech_config": {
"speakers": [
{"speaker": "Joe", "voice": "Puck"},
{"speaker": "Jane", "voice": "Kore"}
]
}
}
}' | head -c 300
先頭に error が出ず、音声のデータが続いていれば、この形は通っています。speech_config に "mode": "conversational" を足して送ると、同じ400になるはずです。
ここは僕が11月に試し直したわけではありません。
公式の説明が直ったのは、あとからだった
Googleの開発者フォーラムに、同じ症状の報告が10月26日に立っていました。
投稿者も、10月23日から通らなくなったと書いています。
10月29日にGoogle側が再現を認め、それまでは mode を外すよう案内しました。
11月3日には、説明のページを直したと返しています。
11月13日に開くと、説明のページからこの行は消えていました。
変更の履歴(changelog)には、mode に触れた項目は見当たりません。
古い書き方を写したコードは、何の知らせもなく止まることになります。
400は待っても直らない
僕の道具は、Geminiの400を受けると、取り直さずに止まります。
APIの返答をそのまま表示するので、今回もエラー文から原因に届きました。
429のような回数の上限なら待てば戻りますが、400は送る中身を変えるまで同じです。
この件のあと、運営の記録に1行を足しました。
APIは予告なく形が変わるので、400が出たら送った中身の形を疑います。
直すのは、小さな1回で試してからにします。
mode を外したあと、会話の間合いが変わったかは聞き比べていません。
26本目以降も、この形のまま声を作っています。
参考
- 運営記録:2026年10月24日(26本目の声の生成で400・道具の修正・1回の確認)
- 運営記録:2026年9月25日(Gemini 3.8 TTSの書き方を公式の説明から調べたメモ)
- Text-to-speech generation | Gemini API(2026年11月13日確認):https://aistudio.google.com/docs/speech-generation
- Interactions API reference(2026年11月13日確認):https://aistudio.google.com/api-reference/interactions-api
- API errors | Gemini API(2026年11月13日確認):https://aistudio.google.com/docs/api-errors
- Changelog | Gemini API(2026年11月13日確認):https://aistudio.google.com/docs/changelog
- Googleの開発者フォーラムの報告(2026年10月26日〜11月3日):https://discuss.ai.google.dev/t/interactions-api-speech-config-mode-conversational-documented-now-rejected-with-400-for-gemini-3-8-flash-tts/195156
同じGeminiのTTSでは、回数の上限と残高切れでも止まっています。
Gemini TTSが429エラーで止まった。1日100回の上限に、朝のテストも入っていた
Gemini APIの402エラー「prepayment credits are depleted」。前払い残高が0で、待っても戻らなかった