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本目以降も、この形のまま声を作っています。

参考

同じGeminiのTTSでは、回数の上限と残高切れでも止まっています。
Gemini TTSが429エラーで止まった。1日100回の上限に、朝のテストも入っていた
Gemini APIの402エラー「prepayment credits are depleted」。前払い残高が0で、待っても戻らなかった

記事URLをコピーしました