Skip to content

Ephemeral token voiceConfig (prebuiltVoiceConfig) not applied in Live API - gemini-3.1-flash-live-preview #1333

Description

@ethannguyen89

Description of the bug:

Hi all,

I'm seeing a consistent issue where prebuiltVoiceConfig.voiceName configured for a Live API session is never actually applied to the output audio - the session always uses the same fixed voice regardless of what's configured, tested across Kore/Leda/Aoede/Zephyr/Fenrir.

Setup: ephemeral AuthToken (authTokens.create) → BidiGenerateContentConstrained WebSocket, model gemini-3.1-flash-live-preview.

What I've verified:

  • Server-side logging confirms the correct voiceId reaches our authTokens.create call every time (e.g. "Leda"), so the value being sent is correct.
  • Tried baking speechConfig into bidiGenerateContentSetup with an empty field_mask (the documented "fully locks the session, client setup message ignored" approach) - voice still wrong every time.
  • Tried a non-empty field_mask naming every field except speechConfig, while still including speechConfig in the object - rejected with 400 "BidiGenerateContentSetup contains fields that are not specified in field_mask".
  • Tried omitting speechConfig entirely from the token and sending voiceConfig only via the client's own WebSocket setup message instead - connects fine, but voice is still the same fixed default, not what was configured.

systemInstruction set the same way (baked into the token) IS being honored correctly - it's specifically speechConfig/voiceConfig that seems to be ignored.

Is this a known limitation of ephemeral tokens + prebuilt voice selection on this model? Anyone found a working combination?

Thanks!

Actual vs expected behavior:

No response

Any other information you'd like to share?

No response

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions