Gemini Live API 支持使用文本、音频和视频输入进行低延迟的双向互动,并提供音频和文本输出。这有助于实现自然的、类似人类的语音对话,并能够随时中断模型。该模型的视频理解功能扩展了沟通模式,让您可以分享摄像头输入或屏幕投放内容,并提出相关问题。
功能
Live API 包含以下主要功能:
- 多模态:模型可以看到、听到和说话。
- 低延迟实时互动:模型可以快速响应。
- 会话记忆:该模型会保留单个会话中的所有互动记忆,从而回想之前听到或看到的信息。
- 支持函数调用、代码执行和“搜索作为工具”:您可以将模型与外部服务和数据源集成。
Live API 专用于服务器到服务器通信。
对于网站和移动应用,我们建议您使用 Daily 合作伙伴提供的集成服务。
开始使用
如需试用实时 API,请前往 Vertex AI Studio,然后点击开始会话。
Live API 是一种使用 WebSocket 的有状态 API。
本部分通过示例介绍了如何使用 Python 3.9 及更高版本的 Live API 进行文本到文本生成。
Gen AI SDK for Python
安装
pip install --upgrade google-genai
设置环境变量以将 Gen AI SDK 与 Vertex AI 搭配使用:
# Replace the `GOOGLE_CLOUD_PROJECT` and `GOOGLE_CLOUD_LOCATION` values # with appropriate values for your project. export GOOGLE_CLOUD_PROJECT=GOOGLE_CLOUD_PROJECT export GOOGLE_CLOUD_LOCATION=us-central1 export GOOGLE_GENAI_USE_VERTEXAI=True
集成指南
本部分介绍了如何与 Live API 集成。
会话
WebSocket 连接会在客户端和 Gemini 服务器之间建立会话。
客户端发起新连接后,会话可以与服务器交换消息,以执行以下操作:
- 向 Gemini 服务器发送文本、音频或视频。
- 接收来自 Gemini 服务器的音频、文本或函数调用请求。
会话配置会在连接后的首条消息中发送。会话配置包括模型、生成参数、系统说明和工具。
请参阅以下示例配置:
{
"model": string,
"generationConfig": {
"candidateCount": integer,
"maxOutputTokens": integer,
"temperature": number,
"topP": number,
"topK": integer,
"presencePenalty": number,
"frequencyPenalty": number,
"responseModalities": [string],
"speechConfig": object
},
"systemInstruction": string,
"tools": [object]
}
如需了解详情,请参阅 BidiGenerateContentSetup。
发送消息
消息是通过 WebSocket 连接交换的 JSON 格式对象。
如需发送消息,客户端必须通过打开的 WebSocket 连接发送 JSON 对象。JSON 对象必须包含以下对象集中的恰好一个字段:
{
"setup": BidiGenerateContentSetup,
"clientContent": BidiGenerateContentClientContent,
"realtimeInput": BidiGenerateContentRealtimeInput,
"toolResponse": BidiGenerateContentToolResponse
}
支持的客户端消息
请参阅下表,了解支持的客户端消息:
消息 | 说明 |
---|---|
BidiGenerateContentSetup |
要在第一条消息中发送的会话配置 |
BidiGenerateContentClientContent |
从客户端传送的当前对话的增量内容更新 |
BidiGenerateContentRealtimeInput |
实时音频或视频输入 |
BidiGenerateContentToolResponse |
对从服务器收到的 ToolCallMessage 的响应 |
接收消息
如需接收来自 Gemini 的消息,请监听 WebSocket“message”事件,然后根据支持的服务器消息的定义解析结果。
请参阅以下内容:
ws.addEventListener("message", async (evt) => { if (evt.data instanceof Blob) { // Process the received data (audio, video, etc.) } else { // Process JSON response } });
服务器消息将包含以下对象集中的恰好一个字段:
{
"setupComplete": BidiGenerateContentSetupComplete,
"serverContent": BidiGenerateContentServerContent,
"toolCall": BidiGenerateContentToolCall,
"toolCallCancellation": BidiGenerateContentToolCallCancellation
"usageMetadata": UsageMetadata
"goAway": GoAway
"sessionResumptionUpdate": SessionResumptionUpdate
"inputTranscription": BidiGenerateContentTranscription
"outputTranscription": BidiGenerateContentTranscription
}
支持的服务器消息
请参阅下表中支持的服务器消息:
消息 | 说明 |
---|---|
BidiGenerateContentSetupComplete |
来自客户端的 BidiGenerateContentSetup 消息,在设置完成时发送 |
BidiGenerateContentServerContent |
模型为客户端消息生成的内容 |
BidiGenerateContentToolCall |
请求客户端运行函数调用并返回包含匹配 ID 的响应 |
BidiGenerateContentToolCallCancellation |
当函数调用因用户中断模型输出而被取消时发送 |
UsageMetadata |
一份报告,其中包含会话到目前为止使用的令牌数 |
GoAway |
表示当前连接即将终止的信号 |
SessionResumptionUpdate |
可恢复的会话检查点 |
BidiGenerateContentTranscription |
用户或模型语音的转写内容 |
增量内容更新
使用增量更新发送文本输入、建立会话上下文或恢复会话上下文。对于简短的情境,您可以发送精细互动来表示确切的事件顺序。对于较长的上下文,建议提供单个消息摘要,以便为后续互动腾出上下文窗口。
请参阅以下上下文消息示例:
{ "clientContent": { "turns": [ { "parts":[ { "text": "" } ], "role":"user" }, { "parts":[ { "text": "" } ], "role":"model" } ], "turnComplete": true } }
请注意,虽然内容部分可以是 functionResponse
类型,但不应使用 BidiGenerateContentClientContent
来响应模型发出的函数调用。应改用 BidiGenerateContentToolResponse
。BidiGenerateContentClientContent
应仅用于建立先前情境或向对话提供文本输入。
在线播放音频和视频
代码执行
如需详细了解代码执行,请参阅代码执行。
函数调用
必须在会话开始时声明所有函数,方法是将工具定义作为 BidiGenerateContentSetup
消息的一部分发送。
您可以使用 JSON 定义函数,具体而言,使用 OpenAPI 架构格式的部分子集。单个函数声明可以包含以下参数:
name(字符串):API 调用中函数的唯一标识符。
description(字符串):全面说明函数的用途和功能。
参数(对象):定义函数所需的输入数据。
type(字符串):指定整体数据类型,例如对象。
properties(对象):列出各个参数,每个参数包含:
- type(字符串):参数的数据类型,例如字符串、整数、布尔值。
- description(字符串):清楚地说明参数的用途和预期格式。
required(数组):一个字符串数组,用于列出函数运行所必需的参数名称。
如需查看使用 curl 命令的函数声明的代码示例,请参阅使用 Gemini API 进行函数调用。如需查看使用 Gemini API SDK 创建函数声明的示例,请参阅函数调用教程。
从单个提示中,模型可以生成多个函数调用以及串联其输出所需的代码。此代码在沙盒环境中执行,并生成后续的 BidiGenerateContentToolCall
消息。执行会暂停,直到每个函数调用的结果都可用,以确保顺序处理。
客户端应返回 BidiGenerateContentToolResponse
响应。
如需了解详情,请参阅函数调用简介。
音频格式
Live API 支持以下音频格式:
- 输入音频格式:16kHz 小端字节序的原始 16 位 PCM 音频
- 输出音频格式:24kHz 小端字节序的原始 16 位 PCM 音频
系统指令
您可以提供系统指令,以更好地控制模型的输出,并指定音频回答的语气和情感。
系统说明会在互动开始之前添加到提示中,并在整个会话期间保持有效。
系统说明只能在会话开始时(初始连接后立即)设置。如需在会话期间向模型提供更多输入,请使用增量内容更新。
中断
用户可以随时中断模型的输出。当语音活动检测 (VAD) 检测到中断时,系统会取消并舍弃正在生成的音频。只有已发送给客户端的信息会保留在会话历史记录中。然后,服务器会发送 BidiGenerateContentServerContent
消息来报告中断。
此外,Gemini 服务器会舍弃所有待处理的函数调用,并发送包含已取消调用的 ID 的 BidiGenerateContentServerContent
消息。
语音
Live API 支持以下语音:
- Puck
- Charon
- Kore
- Fenrir
- Aoede
如需指定语音,请在会话配置中,在 speechConfig
对象内设置 voiceName
。
请参阅 speechConfig
对象的以下 JSON 表示法:
{ "voiceConfig": { "prebuiltVoiceConfig": { "voiceName": "VOICE_NAME" } } }
限制
在规划项目时,请考虑 Live API 和 Gemini 2.0 的以下限制。
客户端身份验证
Live API 仅提供服务器到服务器身份验证,不建议直接在客户端中使用。客户端输入应通过中间应用服务器路由,以便通过 Live API 进行安全身份验证。
对话记录
虽然该模型会跟踪会话内的互动,但不会存储对话记录。会话结束后,系统会清除相应上下文。
为了恢复之前的会话或向模型提供用户互动的历史上下文,应用应维护自己的对话日志,并在新的会话开始时使用 BidiGenerateContentClientContent
消息发送此信息。
会话时长上限
会话时长:音频不超过 15 分钟,音频和视频不超过 2 分钟。当会话时长超出限制时,连接会终止。
模型还受上下文大小的限制。在视频和音频流中发送大量内容可能会导致会话提前终止。
语音活动检测 (VAD)
默认情况下,该模型会自动对连续的音频输入流执行语音活动检测 (VAD)。您可以使用设置消息的 RealtimeInputConfig.AutomaticActivityDetection
字段配置 VAD。
当音频流暂停超过一秒时(例如,当用户关闭麦克风时),系统会发送 AudioStreamEnd
事件以刷新所有缓存的音频。客户端可以随时恢复发送音频数据。
或者,您也可以在设置消息中将 RealtimeInputConfig.AutomaticActivityDetection.disabled
设置为 true
来关闭自动 VAD。在此配置中,客户端负责检测用户语音并在适当的时间发送 ActivityStart
和 ActivityEnd
消息。在此配置中,系统不会发送 AudioStreamEnd
。而是会通过 ActivityEnd
消息标记任何流中断。
其他限制
不支持手动端点设置。
音频输入和音频输出会对模型使用函数调用功能的能力产生负面影响。
token 计数
不支持 token 计数。
速率限制
以下速率限制适用:
- 每个 API 密钥 3 个并发会话
- 每分钟 400 万个 token
消息和事件
BidiGenerateContentClientContent
对客户端传送的当前对话进行增量更新。此处的所有内容都会无条件附加到对话历史记录中,并用作向模型发出的提示的一部分,以生成内容。
此处显示消息会中断任何当前的模型生成。
字段 | |
---|---|
turns[] |
可选。附加到与模型当前对话的内容。 对于单轮查询,这是单个实例。对于多轮查询,这是包含对话历史记录和最新请求的重复字段。 |
turn_complete |
可选。如果为 true,则表示服务器内容生成应从当前累积的提示开始。否则,服务器会等待其他消息,然后再开始生成。 |
BidiGenerateContentRealtimeInput
实时发送的用户输入。
这与 ClientContentUpdate
在以下几个方面有所不同:
- 可以连续发送,不会中断模型生成。
- 如果需要混合在
ClientContentUpdate
和RealtimeUpdate
中交错的数据,服务器会尝试进行优化以获得最佳响应,但无法保证。 - 未明确指定转换结束,而是从用户活动(例如语音结束)派生而来。
- 即使在对话结束之前,系统也会增量处理数据,以便优化模型快速开始回答。
- 始终假定为用户的输入(无法用于填充对话记录)。
字段 | |
---|---|
media_chunks[] |
可选。媒体输入的内嵌字节数据。 |
activity_start |
可选。标记用户活动的开始时间。只有在停用自动(即服务器端)活动检测后,系统才会发送此事件。 |
activity_end |
可选。标记用户活动结束。只有在停用自动(即服务器端)活动检测后,系统才会发送此事件。 |
ActivityEnd
此类型没有字段。
标记用户活动结束。
ActivityStart
此类型没有字段。
一次只能设置此消息中的其中一个字段。标记用户活动的开始时间。
BidiGenerateContentServerContent
模型为响应客户端消息而生成的增量服务器更新。
内容会尽快生成,但不是实时生成。客户端可以选择缓冲并实时播放。
字段 | |
---|---|
turn_complete |
仅限输出。如果为 true,则表示模型已生成完毕。系统仅会在响应其他客户端消息时开始生成。可与 |
interrupted |
仅限输出。如果为 true,则表示客户端消息中断了当前的模型生成。如果客户端正在实时播放内容,则表示可以停止并清空当前队列。如果客户端正在实时播放内容,则表示可以停止并清空当前的播放队列。 |
generation_complete |
仅限输出。如果为 true,则表示模型已生成完毕。 当模型在生成过程中被中断时,中断转弯中不会出现“generation_complete”消息,而是会经历“interrupted > turn_complete”。 当模型假定实时播放时,generation_complete 和 turn_complete 之间会出现延迟,这是由模型等待播放完成所致。 |
grounding_metadata |
仅限输出。元数据用于指定生成内容的依据来源。 |
input_transcription |
可选。输入转写内容。转写内容与模型回合无关,这意味着转写内容与模型回合之间没有任何顺序关系。 |
output_transcription |
可选。输出转写内容。转写内容与模型回合无关,这意味着转写内容与模型回合之间没有任何顺序关系。 |
model_turn |
仅限输出。模型在与用户的当前对话中生成的内容。 |
转录
音频转写消息。
字段 | |
---|---|
text |
可选。转写文本。 |
finished |
可选。布尔值表示转写结束。 |
BidiGenerateContentSetup
要在第一条(也是唯一一条)客户端消息中发送的消息。包含将在流式传输会话期间应用的配置。
客户端应先等待 BidiGenerateContentSetupComplete
消息,然后才能发送任何其他消息。
字段 | |
---|---|
model |
必需。发布商模型的完全限定名称。 发布商模型格式: |
generation_config |
可选。生成配置。 不支持以下字段:
|
system_instruction |
可选。用户为模型提供的系统说明。注意:部分中应仅使用文本,并且每个部分中的内容都应位于单独的段落中。 |
tools[] |
可选。模型可能用于生成下一个回答的
|
session_resumption |
可选。配置会话恢复机制。如果包含,服务器会向客户端发送定期 |
context_window_compression |
可选。配置上下文窗口压缩机制。 如果包含,服务器会压缩上下文窗口以适应给定长度。 |
realtime_input_config |
可选。配置实时输入的处理方式。 |
input_audio_transcription |
可选。输入内容的转写与输入音频语言一致。 |
output_audio_transcription |
可选。输出的转写内容与为输出音频指定的语言代码一致。 |
AudioTranscriptionConfig
此类型没有字段。
音频转写配置。
BidiGenerateContentSetupComplete
此类型没有字段。
作为对客户端发送的 BidiGenerateContentSetup
消息的响应而发送。
BidiGenerateContentToolCall
请求客户端执行 function_calls
并返回包含匹配 id
的响应。
字段 | |
---|---|
function_calls[] |
仅限输出。要执行的函数调用。 |
BidiGenerateContentToolCallCancellation
向客户端发送通知,告知之前针对指定 id
签发的 ToolCallMessage
不应执行,应予取消。如果这些工具调用产生了副作用,客户端可能会尝试撤消工具调用。只有在客户端中断服务器转换时,才会出现此消息。
字段 | |
---|---|
ids[] |
仅限输出。要取消的工具调用的 ID。 |
BidiGenerateContentToolResponse
客户端针对从服务器收到的 ToolCall
生成的响应。各个 FunctionResponse
对象会通过 id
字段与相应的 FunctionCall
对象进行匹配。
请注意,在单项和服务器流式 GenerateContent API 中,函数调用是通过交换 Content
部分进行的,而在双向 GenerateContent API 中,函数调用是通过这组专用消息进行的。
字段 | |
---|---|
function_responses[] |
可选。对函数调用的响应。 |
RealtimeInputConfig
在 BidiGenerateContent
中配置实时输入行为。
字段 | |
---|---|
automatic_activity_detection |
可选。如果未设置,则自动活动检测功能默认处于启用状态。如果停用了自动语音检测,客户端必须发送活动信号。 |
activity_handling |
可选。定义 activity 的效果。 |
turn_coverage |
可选。定义用户回合中包含哪些输入。 |
ActivityHandling
处理用户活动的不同方式。
枚举 | |
---|---|
ACTIVITY_HANDLING_UNSPECIFIED |
如果未指定,则默认行为为 START_OF_ACTIVITY_INTERRUPTS 。 |
START_OF_ACTIVITY_INTERRUPTS |
如果为 true,activity 的开始将中断模型的响应(也称为“插入”)。模型的当前回答将在中断时中止。这是默认行为。 |
NO_INTERRUPTION |
模型的回答不会中断。 |
AutomaticActivityDetection
配置自动检测活动。
字段 | |
---|---|
start_of_speech_sensitivity |
可选。确定系统检测到语音的可能性。 |
end_of_speech_sensitivity |
可选。确定检测到的语音结束的可能性。 |
prefix_padding_ms |
可选。在提交语音开始时间之前,检测到的语音所需的时长。此值越低,语音开始检测的灵敏度就越高,可识别的语音越短。不过,这也会增加出现假正例的概率。 |
silence_duration_ms |
可选。在提交语音结束时间之前,检测到的静音(或非语音)所需的时长。此值越大,语音间隔时间可以越长,而不会中断用户的活动,但这会增加模型的延迟时间。 |
disabled |
可选。如果启用,系统会将检测到的语音和文本输入计为活动。如果停用,客户端必须发送活动信号。 |
EndSensitivity
语音结束的灵敏度。
枚举 | |
---|---|
END_SENSITIVITY_UNSPECIFIED |
默认值为 END_SENSITIVITY_LOW。 |
END_SENSITIVITY_HIGH |
自动检测功能会更频繁地结束语音。 |
END_SENSITIVITY_LOW |
自动检测功能会更少地结束语音。 |
StartSensitivity
语音开始的灵敏度。
枚举 | |
---|---|
START_SENSITIVITY_UNSPECIFIED |
默认值为 START_SENSITIVITY_LOW。 |
START_SENSITIVITY_HIGH |
自动检测功能会更频繁地检测语音开始。 |
START_SENSITIVITY_LOW |
自动检测功能会更少地检测到语音开始。 |
TurnCoverage
有关用户回合中包含哪些输入的选项。
枚举 | |
---|---|
TURN_COVERAGE_UNSPECIFIED |
如果未指定,则默认行为为 TURN_INCLUDES_ALL_INPUT 。 |
TURN_INCLUDES_ONLY_ACTIVITY |
“用户转弯”仅包含自上次转弯以来的活动,不包括非活动状态(例如音频流中无声)。 |
TURN_INCLUDES_ALL_INPUT |
用户回合包括自上次回合以来的所有实时输入,包括无活动(例如音频流中无声)。这是默认行为。 |
UsageMetadata
有关缓存内容使用情况的元数据。
字段 | |
---|---|
total_token_count |
缓存内容消耗的令牌总数。 |
text_count |
文本字符数。 |
image_count |
图片数量。 |
video_duration_seconds |
视频时长(以秒为单位)。 |
audio_duration_seconds |
音频时长(以秒为单位)。 |
GoAway
服务器很快将无法为客户端提供服务。
字段 | |
---|---|
time_left |
连接终止为“ABORTED”前的剩余时间。此处返回的最短时间以及给定模型的速率限制的指定方式有所不同。 |
SessionResumptionUpdate
更新会话恢复状态。
仅在设置了 BidiGenerateContentSetup.session_resumption
时才发送。
字段 | |
---|---|
new_handle |
表示可恢复状态的新句柄。如果 |
resumable |
如果此时可以恢复会话,则为 true。 在某些情况下,可能无法恢复会话。在这种情况下,我们会发送更新后的空 new_handle 和 resumable=false。此类情况的示例可能是模型执行函数调用或仅生成函数调用。在这种状态下恢复会话(使用上一个会话令牌)会导致部分数据丢失。 |
last_consumed_client_message_index |
客户端发送的最后一个消息的索引,该消息包含在此 SessionResumptionToken 表示的状态中。仅在设置了 此索引的存在可让用户透明地重新连接,并避免丢失实时音频输入/视频的某些部分。如果客户端希望暂时断开连接(例如,由于收到 GoAway),则可以通过缓冲自上次 它不会在稍后用于“恢复状态的接续”;在这些情况下,可能不需要部分音频和视频帧。 |