Multimodal Live API 支持与 Gemini 进行低延迟的双向语音和视频互动。借助 Multimodal Live API,您可以为最终用户提供自然的人声对话体验,并让用户能够使用语音指令中断模型的回答。该模型可以处理文本、音频和视频输入,并可以提供文本和音频输出。
功能
Multimodal Live API 包含以下主要功能:
- 多模态:该模型可以看到、听到和说话。
- 低延迟实时互动:提供快速响应。
- 会话记忆:该模型会保留单个会话中的所有互动记忆,从而回想之前听到或看到的信息。
- 支持函数调用、代码执行和将搜索用作工具:支持与外部服务和数据源集成。
- 自动语音活动检测 (VAD):该模型可以准确识别用户何时开始和停止说话。这样,用户就可以进行自然的对话式互动,并随时中断模型。
您可以在 Google AI Studio 中试用 Multimodal Live API。
开始使用
Multimodal Live API 是一种使用 WebSockets 的有状态 API。
本部分通过示例介绍了如何使用 Python 3.9 及更高版本的 Multimodal Live API 进行文本到文本生成。
安装 Gemini API 库
如需安装 google-genai
软件包,请使用以下 pip
命令:
!pip3 install google-genai
导入依赖项
如需导入依赖项,请执行以下操作:
from google import genai
发送和接收短信
import asyncio
from google import genai
client = genai.Client(api_key="GEMINI_API_KEY", http_options={'api_version': 'v1alpha'})
model_id = "gemini-2.0-flash-exp"
config = {"response_modalities": ["TEXT"]}
async def main():
async with client.aio.live.connect(model=model_id, config=config) as session:
while True:
message = input("User> ")
if message.lower() == "exit":
break
await session.send(message, end_of_turn=True)
async for response in session.receive():
if response.text is None:
continue
print(response.text, end="")
if __name__ == "__main__":
asyncio.run(main())
集成指南
本部分介绍了如何与 Multimodal Live API 集成。
会话
会话表示客户端与 Gemini 服务器之间的单个 WebSocket 连接。
客户端发起新连接后,会话可以与服务器交换消息,以执行以下操作:
- 向 Gemini 服务器发送文本、音频或视频。
- 接收 Gemini 服务器的音频、文本或函数调用响应。
会话配置会在连接后的首条消息中发送。会话配置包括模型、生成参数、系统说明和工具。
请参阅以下示例配置:
{
"model": string,
"generation_config": {
"candidate_count": integer,
"max_output_tokens": integer,
"temperature": number,
"top_p": number,
"top_k": integer,
"presence_penalty": number,
"frequency_penalty": number,
"response_modalities": string,
"speech_config":object
},
"system_instruction": "",
"tools":[]
}
如需了解详情,请参阅 BidiGenerateContentSetup。
发送消息
消息是通过 WebSocket 连接交换的 JSON 格式的字符串。
如需发送消息,客户端必须以 JSON 格式的字符串发送受支持的客户端消息,并通过打开的 WebSocket 连接之一发送消息。
支持的客户端消息
请参阅下表,了解支持的客户端消息:
消息 | 说明 |
---|---|
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
}
});
支持的服务器消息
请参阅下表中支持的服务器消息:
消息 | 说明 |
---|---|
BidiGenerateContentSetupComplete |
来自客户端的 BidiGenerateContentSetup 消息,在设置完成时发送 |
BidiGenerateContentServerContent |
模型为客户端消息生成的内容 |
BidiGenerateContentToolCall |
请求客户端运行函数调用并返回具有匹配 ID 的响应 |
BidiGenerateContentToolCallCancellation |
当函数调用因用户中断模型输出而被取消时发送 |
增量内容更新
使用增量更新发送文本输入、建立或恢复会话上下文。对于简短的情境,您可以发送精细互动来表示事件的确切顺序。对于较长的上下文,建议提供单个消息摘要,以便为后续互动腾出上下文窗口。
请参阅以下上下文消息示例:
{
"client_content": {
"turns": [
{
"parts":[
{
"text": ""
}
],
"role":"user"
},
{
"parts":[
{
"text": ""
}
],
"role":"model"
}
],
"turn_complete": true
}
}
请注意,虽然内容部分可以是 functionResponse
类型,但不应使用 BidiGenerateContentClientContent
来响应模型发出的函数调用。应改用 BidiGenerateContentToolResponse
。BidiGenerateContentClientContent
只能用于建立先前情境或向对话提供文本输入。
在线播放音频和视频
调用函数
必须在会话开始时声明所有函数,方法是将工具定义作为 BidiGenerateContentSetup
消息的一部分发送。
如需详细了解函数调用,请参阅函数调用教程。
从单个问题中,模型可以生成多个函数调用以及串联其输出所需的代码。此代码在沙盒环境中执行,并生成后续的 BidiGenerateContentToolCall
消息。执行会暂停,直到每个函数调用的结果都可用,以确保顺序处理。
客户端应返回 BidiGenerateContentToolResponse
响应。
音频输入和音频输出会对模型使用函数调用功能的能力产生负面影响。
音频格式
Multimodal Live API 支持以下音频格式:
- 输入音频格式:16kHz 小端字节序的原始 16 位 PCM 音频
- 输出音频格式:24kHz 小端字节序的原始 16 位 PCM 音频
系统指令
您可以提供系统指令,以更好地控制模型的输出,并指定语音回答的语气和情感。
系统说明会在互动开始之前添加到提示中,并在整个会话期间保持有效。
系统说明只能在会话开始时(即初始连接后立即)设置。如需在会话期间向模型提供更多输入,请使用增量内容更新。
中断
用户可以随时中断模型的输出。当语音活动检测 (VAD) 检测到中断时,系统会取消并舍弃正在生成的音频。只有已发送给客户端的信息会保留在会话历史记录中。然后,服务器会发送 BidiGenerateContentServerContent
消息来报告中断。
此外,Gemini 服务器会舍弃所有待处理的函数调用,并发送包含已取消调用的 ID 的 BidiGenerateContentServerContent
消息。
语音
Multimodal Live API 支持以下语音:Aoede、Charon、Fenrir、Kore 和 Puck。
如需指定语音,请在会话配置中,在 speech_config
对象中设置 voice_name
。
请参阅 speech_config
对象的以下 JSON 表示法:
{
"voice_config": {
"prebuilt_voice_config ": {
"voice_name": <var>VOICE_NAME</var>
}
}
}
限制
在规划项目时,请考虑 Multimodal Live API 和 Gemini 2.0 的以下限制。
客户端身份验证
Multimodal Live API 仅提供服务器到服务器身份验证,不建议直接供客户端使用。客户端输入应通过中间应用服务器路由,以便通过 Multimodal Live API 进行安全身份验证。
对于网站和移动应用,我们建议您使用 Daily 中合作伙伴提供的集成。
对话记录
虽然该模型会跟踪会话内互动,但不会存储对话记录。会话结束后,系统会清除相应上下文。
为了恢复之前的会话或向模型提供用户互动的历史上下文,应用应维护自己的对话日志,并在新的会话开始时使用 BidiGenerateContentClientContent
消息发送此信息。
会话时长上限
会话时长上限为 15 分钟(音频)或 2 分钟(音频和视频)。当会话时长超出限制时,连接会终止。
模型还受上下文大小的限制。将大量内容与视频和音频流一起发送可能会导致会话提前终止。
语音活动检测 (VAD)
该模型会自动对连续的音频输入流执行语音活动检测 (VAD)。VAD 始终处于启用状态,其参数不可配置。
令牌数
不支持令牌数。
速率限制
以下速率限制适用:
- 每个 API 密钥 3 个并发会话
- 每分钟 400 万个令牌
消息和事件
BidiGenerateContentClientContent
从客户端传送的当前对话的增量更新。此处的所有内容都会无条件附加到对话历史记录中,并作为向模型发出的提示的一部分来生成内容。
此处显示消息会中断任何当前的模型生成。
字段 | |
---|---|
turns[] |
可选。附加到与模型的当前对话的内容。 对于单轮询问,这是一个实例。对于多轮询问,此字段是重复字段,包含对话记录和最新请求。 |
turn_ |
可选。如果为 true,表示服务器内容生成应从当前累积的提示开始。否则,服务器会等待其他消息,然后再开始生成。 |
BidiGenerateContentRealtimeInput
实时发送的用户输入。
这与 BidiGenerateContentClientContent
在以下几个方面有所不同:
- 可以连续发送,不会中断模型生成。
- 如果需要混合在
BidiGenerateContentClientContent
和BidiGenerateContentRealtimeInput
中交错的数据,服务器会尝试进行优化以获得最佳响应,但无法保证。 - 未明确指定转换结束,而是从用户活动(例如语音结束)派生而来。
- 即使在对话结束之前,系统也会增量处理数据,以便优化模型快速开始回答。
- 始终是实时发送的直接用户输入。可以连续发送,不会中断。该模型会自动检测用户语音的开头和结尾,并相应地开始或终止流式传输响应。系统会在数据到达时逐步进行处理,从而最大限度地减少延迟时间。
字段 | |
---|---|
media_ |
可选。媒体输入的内嵌字节数据。 |
BidiGenerateContentServerContent
模型为响应客户端消息而生成的增量服务器更新。
内容会尽快生成,但不是实时生成。客户端可以选择缓冲并实时播放。
字段 | |
---|---|
turn_ |
仅限输出。如果为 true,则表示模型已生成完毕。系统仅会在响应其他客户端消息时开始生成。可与 |
interrupted |
仅限输出。如果为 true,则表示客户端消息中断了当前的模型生成。如果客户端正在实时播放内容,则表示可以停止并清空当前的播放队列。 |
grounding_ |
仅限输出。为生成的内容提供元数据依据。 |
model_ |
仅限输出。模型在与用户的当前对话中生成的内容。 |
BidiGenerateContentSetup
要在第一条(也是唯一一条)客户端消息中发送的消息。包含在流式传输会话期间应用的配置。
客户端应先等待 BidiGenerateContentSetupComplete
消息,然后才能发送任何其他消息。
字段 | |
---|---|
model |
必需。模型的资源名称。此 ID 将用作模型的 ID。 格式: |
generation_ |
可选。生成配置。 以下字段不受支持:
|
system_ |
可选。用户为模型提供的系统说明。 注意:部分中只能使用文本,并且每个部分的内容将位于单独的段落中。 |
tools[] |
可选。模型可能用于生成下一个回答的
|
BidiGenerateContentSetupComplete
此类型没有字段。
作为对客户端发送的 BidiGenerateContentSetup
消息的响应而发送。
BidiGenerateContentToolCall
请求客户端执行 function_calls
并返回包含匹配 id
的响应。
字段 | |
---|---|
function_ |
仅限输出。要执行的函数调用。 |
BidiGenerateContentToolCallCancellation
向客户端发送通知,告知之前针对指定 id
签发的 ToolCallMessage
不应执行,应予取消。如果这些工具调用产生了副作用,客户端可能会尝试撤消工具调用。只有在客户端中断服务器转换时,才会出现此消息。
字段 | |
---|---|
ids[] |
仅限输出。要取消的工具调用的 ID。 |
BidiGenerateContentToolResponse
客户端针对从服务器收到的 ToolCall
生成的响应。各个 FunctionResponse
对象会通过 id
字段与相应的 FunctionCall
对象进行匹配。
请注意,在单个调用和服务器流式 GenerateContent API 中,函数调用是通过交换 Content
部分进行的,而在双向 GenerateContent API 中,函数调用是通过这组专用消息进行的。
字段 | |
---|---|
function_ |
可选。对函数调用的响应。 |
详细了解常见类型
如需详细了解常用的 API 资源类型 Blob
、Content
、FunctionCall
、FunctionResponse
、GenerationConfig
、GroundingMetadata
和 Tool
,请参阅生成内容。