Gemini 3.8 Live 开发者指南

Gemini 3.8 Live 是一种实时对话模型,专为低延迟双向语音和视频互动以及面对面的 Live Avatar 合成而打造。3.8 Live 专为连续对话工作流而设计,提供默认启用的共情对话、主动音频过滤、自动取消屏蔽工具和动态多语言切换功能。

本文档介绍了以下主题:

  • 3.8 Live 在 Gemini 模型系列中的定位。
  • 3.8 Live 的主要功能。
  • 与 Google Gen AI SDK 集成。
  • 必需的 API 规则和惯例。
  • 从之前的 Gemini Live API 模型迁移。

在 Gemini 系列中的角色

3.8 Live 专为实时流式互动 而设计。它通过双向 WebSocket 运行,以亚秒级延迟处理语音、实时摄像头馈送和屏幕广播,同时生成 24 kHz 音频和同步的 24 FPS 视频虚拟形象。

模型规范和比较

下表比较了 3.8 Live 与之前的 Gemini Live API 模型之间的规范:

属性 Gemini 3.8 Live Gemini 2.5 Flash Live API 原生音频(正式版基准)
模型 ID gemini-3.8-live gemini-live-2.5-flash-native-audio
发布阶段 正式版 (GA) 正式版 (GA)
输入模态 音频(16 kHz PCM)、视频(1 FPS JPEG)、文本 音频(16 kHz PCM)、视频(1 FPS JPEG)、文本
输出模态 音频(24 kHz PCM)、视频(24 FPS MP4 实时虚拟形象)、文本 音频(24 kHz PCM)、文本
实时虚拟形象合成 24 FPS 同步视频输出 不支持
共情对话 默认处于启用状态 需要显式配置
主动音频 默认处于启用状态 需要显式配置
函数调用执行 异步非阻塞和自动取消阻塞 (behavior="BLOCKING") 异步和同步
抢占处理 礼貌中断降级(用户说话时等待) 立即中断(可以与用户音频重叠)
语言支持 在支持的语言之间动态切换 支持的语言
网域偏向 支持 AudioTranscriptionConfig 中的 custom_vocabulary 标准基准转录
视觉 token 控制 可配置的 media_resolution(LOW、MEDIUM、HIGH) 每个帧的固定 token 预算

何时使用 Gemini 3.8 Live

在以下场景中使用 3.8 Live:

  • 您需要低对话延迟、自然轮流,以及在用户中断(抢占)时快速恢复。
  • 您的应用调用外部工具,并且需要非阻塞执行,以便在后端系统处理请求时继续输出音频。
  • 您希望以 24 FPS 的速度呈现会说话的数字虚拟形象,并同步面部动画和对口型,而无需外部渲染流水线。
  • 您的用户使用多种语言进行对话,需要会话中语言检测和在支持的语言之间切换。
  • 您需要针对技术术语、SKU 或品牌名称的特定领域词汇偏向。

如需了解完整规范和配额限制,请参阅 3.8 Live 模型页面。

Gemini 3.8 Live 的主要功能

3.8 Live 引入了以下功能:

  • 24 FPS 实时虚拟形象视频合成:3.8 Live 直接从模型输出生成同步的 24 FPS MP4 视频流 (response_modalities=["VIDEO"])。生成的面部表情和嘴唇动作与合成语音实时对齐。

    您可以使用预构建的库存虚拟形象,也可以提供自定义参考图片来构建数字礼宾、客服人员、虚拟导师或互动角色。如需了解设置详情,请参阅配置 Live Avatar。

  • 默认启用的共情对话和主动音频:

    • 共情对话:在 3.8 Live 中默认处于启用状态。该模型会处理用户音频输入中的声学韵律、语音提示、停顿和语音语调,以调整语音语调和对话节奏。
    • 主动音频:在 3.8 Live 中默认处于启用状态。该模型会过滤环境噪音和背景语音,仅在用户寻址时生成音频回答。
  • 异步和自动取消屏蔽函数调用: 3.8 Live 提供专为 实时语音设计的工具调用行为:

    • 非阻塞异步执行:当模型生成工具 调用时,音频会话保持活动状态,以便智能体可以流式传输 对话确认("让我调出您的账号 详细信息…")并在客户端应用调用 后端 API 时处理后续输入。
    • 自动取消阻塞调用 (behavior="BLOCKING"):当 函数声明设置 behavior="BLOCKING" 时,生成会暂停,直到 工具响应到达。如果在阻塞调用运行时有新的用户输入到达,Gemini Live API 服务器会取消待处理的调用。
    • 礼貌中断处理:在之前的模型中,当用户说话时返回带有 scheduling="INTERRUPT" 的工具 响应会与用户音频重叠。在 3.8 Live 中,当用户语音处于活动状态时,服务器会将调度降级为 WHEN_IDLE,并在用户说完话后播放响应。
  • 动态多语言切换和自定义词汇:

    • 多语言支持:在会话中检测并切换支持的 语言,而无需重启或重新配置连接。
    • 自定义词汇偏向:使用 custom_vocabulary 接受 AudioTranscriptionConfig (通过 input_audio_transcription)中的特定领域关键字、专有名词、医学术语和产品代码,以提高转录准确率。
  • 使用 media_resolution 控制的多模态视觉接地:接受 实时视频流(1 FPS JPEG 帧,建议分辨率 768x768),并允许您配置 media_resolution (MEDIA_RESOLUTION_LOW、MEDIA_RESOLUTION_MEDIUM、 MEDIA_RESOLUTION_HIGH),以平衡每帧 token 使用量和视觉细节。

快速入门

在开始之前,请使用应用默认 凭证 (ADC) 向 Cloud de Confiance by S3NS 进行身份验证。

在以下代码示例中,请将 PROJECT_ID 替换为 您的 Cloud de Confiance 项目 ID。

安装 SDK

安装或更新 Google Gen AI SDK 和音频依赖项:

pip install --upgrade google-genai websockets numpy

使用异步工具调用启动双向会话

以下示例使用 gemini-3.8-live 建立实时会话,配置自定义词汇偏向,并运行非阻塞异步函数调用:

import asyncio
from google import genai
from google.genai import types

PROJECT_ID = "PROJECT_ID"
LOCATION = "us-central1"
MODEL_ID = "gemini-3.8-live"

# Initialize the Gen AI client for enterprise.
client = genai.Client(enterprise=True, project=PROJECT_ID, location=LOCATION)

# Define a tool for asynchronous execution.
order_lookup_tool = types.FunctionDeclaration(
    name="lookup_order_status",
    description="Fetches real-time shipping status for a customer order ID.",
    parameters=types.Schema(
        type="OBJECT",
        properties={
            "order_id": types.Schema(
                type="STRING",
                description="The order ID, for example, ORD-8472",
            ),
        },
        required=["order_id"],
    ),
)

# Configure the live connection.
config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    system_instruction=types.Content(
        parts=[
            types.Part.from_text(
                text=(
                    "You are an enterprise concierge. When you call a tool, "
                    "briefly acknowledge the request and tell the user what you're doing. "
                    "If a tool returns no results, inform the user before trying again. "
                    "Never issue more than two consecutive tool calls without speaking."
                )
            )
        ]
    ),
    speech_config=types.SpeechConfig(
        voice_config=types.VoiceConfig(
            prebuilt_voice_config=types.PrebuiltVoiceConfig(voice_name="Aoede")
        ),
    ),
    input_audio_transcription=types.AudioTranscriptionConfig(
        custom_vocabulary=["ORD-8472", "Gemini Live", "Express Shipping"]
    ),
    output_audio_transcription=types.AudioTranscriptionConfig(),
    tools=[types.Tool(function_declarations=[order_lookup_tool])],
)

async def handle_tool_call(session, function_call):
    """Executes backend calls asynchronously without blocking incoming audio."""
    order_id = function_call.args.get("order_id", "")
    await asyncio.sleep(2.0)  # Simulate backend API latency.

    if not order_id.startswith("ORD-"):
        result = {
            "status": "invalid_argument",
            "retryable": False,
            "message": f"Order ID '{order_id}' is invalid. Ask the user to verify.",
        }
    else:
        result = {
            "status": "ok",
            "retryable": False,
            "order_id": order_id,
            "shipping_status": "Out for delivery by 4:00 PM",
        }

    # Send tool response matching the call ID.
    await session.send_tool_response(
        function_responses=[
            types.FunctionResponse(
                id=function_call.id,
                name=function_call.name,
                response=result,
            )
        ]
    )

async def main():
    async with client.aio.live.connect(model=MODEL_ID, config=config) as session:
        print(f"Connected to {MODEL_ID}")

        # Send initial text or stream 16 kHz PCM audio chunks.
        await session.send_realtime_input(
            text="Hi! Can you check the status of order ORD-8472?"
        )

        async for message in session.receive():
            # Handle asynchronous tool calls.
            if message.tool_call:
                for call in message.tool_call.function_calls:
                    asyncio.create_task(handle_tool_call(session, call))

            # Process audio output chunks and transcriptions.
            if message.server_content:
                if (
                    message.server_content.output_transcription
                    and message.server_content.output_transcription.text
                ):
                    print(
                        f"Agent: {message.server_content.output_transcription.text}",
                        end="",
                        flush=True,
                    )

if __name__ == "__main__":
    asyncio.run(main())

必需的 API 规则和惯例

使用 3.8 Live 进行构建时,请遵循以下 API 惯例:

  • 信息丰富的函数响应:请勿从工具处理程序返回空字典 ({}) 或 None 从工具处理程序返回。当工具返回错误或空载荷时,3.8 Live 可能会生成带有修改后的参数的重复函数调用,除非响应包含状态字段。在每个工具响应中返回结构化字段:
    • status:机器可读的状态字符串,例如 "ok"、 "no_results" 或 "invalid_argument"。
    • retryable:当重复调用返回相同结果时,设置为 false。
    • message 或 guidance:指定要向用户报告的状态的文本。
  • 提示级工具重试限制:在 system_instruction中添加重试限制。例如:“如果工具调用未返回任何结果, 请通知用户,而不是使用参数变体重复搜索。 切勿在不与用户交谈的情况下连续运行超过两个工具调用。 用户。”
  • 严格的 FunctionResponse 匹配:
    • 每个 FunctionResponse 轮次都必须提供前一个 FunctionCall 中的确切 id。
    • 直接在 FunctionResponse.response 中传递响应对象。
  • 流式音频格式:
    • 输入音频:16 kHz、16 位、小端序、单声道 PCM (audio/pcm;rate=16000),以 20 毫秒到 100 毫秒的数据块流式传输。
    • 输出音频:24 kHz 单声道 PCM。
  • 已移除旧版参数:请勿在配置中传递 enable_affective_dialog 或 proactivity;这些功能在 3.8 Live 中默认处于启用状态。
  • 植入对话历史记录:如果您使用 send_client_content植入多轮历史记录,请等待客户端应用收到 setup_complete服务器帧,并配置 HistoryConfig(initial_history_in_client_content=True)。

迁移到 Gemini 3.8 Live

如需详细了解如何从 gemini-live-2.5-flash-native-audio迁移到 gemini-3.8-live,请参阅从 Gemini 2.5 Flash Live API 原生音频迁移到 Gemini 3.8 Live。

开发者核对清单

在部署应用之前,请验证以下各项:

其他资源

如需了解详情,请参阅以下资源: