Multimodal Live API

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 来响应模型发出的函数调用。应改用 BidiGenerateContentToolResponseBidiGenerateContentClientContent 只能用于建立先前情境或向对话提供文本输入。

在线播放音频和视频

调用函数

必须在会话开始时声明所有函数,方法是将工具定义作为 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[]

Content

可选。附加到与模型的当前对话的内容。

对于单轮询问,这是一个实例。对于多轮询问,此字段是重复字段,包含对话记录和最新请求。

turn_complete

bool

可选。如果为 true,表示服务器内容生成应从当前累积的提示开始。否则,服务器会等待其他消息,然后再开始生成。

BidiGenerateContentRealtimeInput

实时发送的用户输入。

这与 BidiGenerateContentClientContent 在以下几个方面有所不同:

  • 可以连续发送,不会中断模型生成。
  • 如果需要混合在 BidiGenerateContentClientContentBidiGenerateContentRealtimeInput 中交错的数据,服务器会尝试进行优化以获得最佳响应,但无法保证。
  • 未明确指定转换结束,而是从用户活动(例如语音结束)派生而来。
  • 即使在对话结束之前,系统也会增量处理数据,以便优化模型快速开始回答。
  • 始终是实时发送的直接用户输入。可以连续发送,不会中断。该模型会自动检测用户语音的开头和结尾,并相应地开始或终止流式传输响应。系统会在数据到达时逐步进行处理,从而最大限度地减少延迟时间。
字段
media_chunks[]

Blob

可选。媒体输入的内嵌字节数据。

BidiGenerateContentServerContent

模型为响应客户端消息而生成的增量服务器更新。

内容会尽快生成,但不是实时生成。客户端可以选择缓冲并实时播放。

字段
turn_complete

bool

仅限输出。如果为 true,则表示模型已生成完毕。系统仅会在响应其他客户端消息时开始生成。可与 content 一起设置,表示 content 是轮次中的最后一个。

interrupted

bool

仅限输出。如果为 true,则表示客户端消息中断了当前的模型生成。如果客户端正在实时播放内容,则表示可以停止并清空当前的播放队列。

grounding_metadata

GroundingMetadata

仅限输出。为生成的内容提供元数据依据。

model_turn

Content

仅限输出。模型在与用户的当前对话中生成的内容。

BidiGenerateContentSetup

要在第一条(也是唯一一条)客户端消息中发送的消息。包含在流式传输会话期间应用的配置。

客户端应先等待 BidiGenerateContentSetupComplete 消息,然后才能发送任何其他消息。

字段
model

string

必需。模型的资源名称。此 ID 将用作模型的 ID。

格式:models/{model}

generation_config

GenerationConfig

可选。生成配置。

以下字段不受支持:

  • response_logprobs
  • response_mime_type
  • logprobs
  • response_schema
  • stop_sequence
  • routing_config
  • audio_timestamp
system_instruction

Content

可选。用户为模型提供的系统说明。

注意:部分中只能使用文本,并且每个部分的内容将位于单独的段落中。

tools[]

Tool

可选。模型可能用于生成下一个回答的 Tools 列表。

Tool 是一段代码,可让系统与外部系统进行交互,以在模型知识和范围之外执行操作或一组操作。

BidiGenerateContentSetupComplete

此类型没有字段。

作为对客户端发送的 BidiGenerateContentSetup 消息的响应而发送。

BidiGenerateContentToolCall

请求客户端执行 function_calls 并返回包含匹配 id 的响应。

字段
function_calls[]

FunctionCall

仅限输出。要执行的函数调用。

BidiGenerateContentToolCallCancellation

向客户端发送通知,告知之前针对指定 id 签发的 ToolCallMessage 不应执行,应予取消。如果这些工具调用产生了副作用,客户端可能会尝试撤消工具调用。只有在客户端中断服务器转换时,才会出现此消息。

字段
ids[]

string

仅限输出。要取消的工具调用的 ID。

BidiGenerateContentToolResponse

客户端针对从服务器收到的 ToolCall 生成的响应。各个 FunctionResponse 对象会通过 id 字段与相应的 FunctionCall 对象进行匹配。

请注意,在单个调用和服务器流式 GenerateContent API 中,函数调用是通过交换 Content 部分进行的,而在双向 GenerateContent API 中,函数调用是通过这组专用消息进行的。

字段
function_responses[]

FunctionResponse

可选。对函数调用的响应。

详细了解常见类型

如需详细了解常用的 API 资源类型 BlobContentFunctionCallFunctionResponseGenerationConfigGroundingMetadataTool,请参阅生成内容