I am using the Multimodal Live API with ephemeral AuthTokens (authTokens.create → BidiGenerateContentConstrained WebSocket). My implementation strictly follows the API documentation for voice selection, but the gemini-3.1-flash-live-preview model completely ignores the configured voice and always defaults to a fixed voice.
Environment:
-
Model:
models/gemini-3.1-flash-live-preview -
Endpoint:
generativelanguage.googleapis.com(Google AI Studio)
Payload Structure Used: I am wrapping the configuration correctly inside the token creation request as follows:
JSON
"bidiGenerateContentSetup": {
"model": "models/gemini-3.1-flash-live-preview",
"generationConfig": {
"responseModalities": ["AUDIO"],
"speechConfig": {
"voiceConfig": {
"prebuiltVoiceConfig": { "voiceName": "Kore" }
}
}
}
}
What I’ve verified (Troubleshooting steps taken):
-
The JSON schema is accepted by the API (no 400 Bad Request error).
-
systemInstructionconfigured exactly the same way works perfectly. -
I have tested multiple valid Live API voices (
Kore,Puck,Aoede). The result is always the same fixed default voice. -
I tested both baking
speechConfiginto the AuthToken and delegating it to the client WebSocket setup message (usinglockAdditionalFields). Same issue.
Question: Is speechConfig intentionally hardcoded/disabled on the backend for the 3.1-flash-live-preview model, or is this a bug in the voice synthesis module? Any timelines on when custom voice selection will be enabled for 3.1?
Thank you!