Gemini 3.8 Live Avatar 正式可用:如何构建能看、能说、还能办事的实时智能体

2026-09-24 18 预计阅读时间: 1 分钟
来源: cloud.google.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:12 分钟

Gemini 3.8 Live with Live Avatar 已在 Gemini Enterprise 中正式可用。它不只是给语音助手加上一张会动的脸,而是把原生语音对话、实时视频理解、工具调用和数字人输出放进同一条双向流式链路。对客服、导购、保险报案和交互式终端而言,这意味着智能体可以一边和用户交谈,一边理解摄像头或屏幕内容,并在后台完成业务操作。

从语音机器人升级为多模态事务入口

传统语音系统通常要串联语音转文字、语言模型、工具服务和文字转语音。每多一层处理,就会增加延迟,也会让打断恢复、情绪表达和上下文保持变得更困难。

Gemini 3.8 Live 使用原生 speech-to-speech 交互,重点不只是缩短响应时间,还包括更自然地处理用户插话。用户在模型说话时补充条件,系统可以继续保留对话上下文以及已经发起的后台事务,而不是重新开始整轮问答。

Live Avatar 在此基础上增加了带唇形同步的视频形象,可用于 Web、移动应用和交互式自助终端。当前企业客户可以从经过筛选的预置形象库部署数字人;自定义形象仍需要加入许可名单并完成验证,不能把任意照片直接变成可公开部署的数字人。

这套能力组合包括:

  • 实时双向语音:支持自然打断和连续上下文。
  • 视频数字人:生成与语音同步的头像视频。
  • 后台工具调用:对话可以继续进行,查询保单、库存或订单等任务在后台完成。
  • 多语言交互:可自动检测并理解、使用 97 种语言。
  • 视觉理解:同时处理摄像头画面、屏幕共享和音频。
  • 企业部署能力:提供美国和欧盟端点、预置吞吐量、合规与数据治理选项。

需要注意,Gemini 3.8 Live Extended Thinking 仍处于私有预览阶段,不应把它和已经正式可用的 Live Avatar 混为一谈。

真正关键的是“边聊边办”,而不是头像本身

实时数字人的产品价值往往来自工具调用。以保险报案为例,用户可以对着摄像头展示车辆损伤,同时口述事故经过。前台智能体负责追问缺失信息,后台智能体则可以并行执行:

  1. 查询保单是否有效;
  2. 根据画面和用户陈述填充报案记录;
  3. 应用受理规则;
  4. 整理供理赔员审核的材料包。

工具调用不应阻塞整段会话。更合理的交互是,智能体先说“我正在核对保单,您可以继续展示车辆右侧”,等后台返回后再补充结果。这样既能掩盖外部 API 的延迟,也能避免用户面对沉默的数字人。

生产架构可以按以下边界拆分:

浏览器 / App / 交互终端
        │ 音频、视频、屏幕共享、控制事件
        ▼
实时会话网关
        │ 身份认证、限流、区域路由、会话恢复
        ▼
Gemini Live 会话 ──────► Live Avatar 输出
        │
        ├──► 订单 / 保单 / 库存 API
        ├──► Agent Development Kit 工作流
        └──► 审计、指标与人工接管系统

会话网关尤其重要。它不应该只做透明转发,还要负责短期凭证、租户隔离、媒体流生命周期、工具权限和断线恢复。浏览器端不应持有可直接访问企业后端或模型服务的长期密钥。

可运行示例:模拟不阻塞对话的后台工具调用

由于摘要没有给出正式 Live API 的请求字段,下面示例不是 Gemini 官方接口代码,而是一个可以本地运行的最小 WebSocket 编排器。它演示了生产集成中最重要的并发模式:先确认用户请求,在后台执行工具,完成后再把结果送回实时会话。

创建项目:

mkdir live-agent-demo && cd live-agent-demo
cat > requirements.txt <<'EOF'
fastapi==0.115.12
uvicorn[standard]==0.34.0
websockets==15.0.1
EOF

cat > app.py <<'PY'
import asyncio
import uuid
from fastapi import FastAPI, WebSocket, WebSocketDisconnect

app = FastAPI()

async def check_policy(policy_id: str) -> dict:
    # 替换为真实的保单、订单或库存 API。
    await asyncio.sleep(2)
    return {
        "policy_id": policy_id,
        "active": True,
        "coverage": "collision"
    }

@app.websocket("/live")
async def live_session(ws: WebSocket):
    await ws.accept()
    send_lock = asyncio.Lock()
    background_tasks = set()

    async def send(event: dict):
        async with send_lock:
            await ws.send_json(event)

    async def run_policy_tool(task_id: str, policy_id: str):
        result = await check_policy(policy_id)
        await send({
            "type": "tool.result",
            "task_id": task_id,
            "tool": "check_policy",
            "result": result,
            "assistant_text": "保单有效,已确认包含碰撞保障。"
        })

    try:
        while True:
            event = await ws.receive_json()

            if event.get("type") == "claim.start":
                task_id = str(uuid.uuid4())

                # 立即响应,不等待后台工具完成。
                await send({
                    "type": "assistant.message",
                    "text": "我正在核对保单。您可以继续描述事故经过。",
                    "task_id": task_id
                })

                task = asyncio.create_task(
                    run_policy_tool(task_id, event["policy_id"])
                )
                background_tasks.add(task)
                task.add_done_callback(background_tasks.discard)
            else:
                await send({
                    "type": "assistant.message",
                    "text": "已收到当前会话事件。"
                })
    except WebSocketDisconnect:
        for task in background_tasks:
            task.cancel()

PY

cat > client.py <<'PY'
import asyncio
import json
import websockets

async def main():
    async with websockets.connect("ws://127.0.0.1:8000/live") as ws:
        await ws.send(json.dumps({
            "type": "claim.start",
            "policy_id": "POLICY-2026-001"
        }))

        # 第一条是即时确认,第二条是稍后返回的工具结果。
        for _ in range(2):
            print(json.loads(await ws.recv()))

asyncio.run(main())
PY

在第一个终端启动服务:

python -m pip install -r requirements.txt
uvicorn app:app --reload

在第二个终端运行客户端:

python client.py

接入真实 Gemini Live API 时,可以保留这种任务并发结构,但需要按照官方集成文档替换会话协议,并补上四类能力:

  • 把文本事件扩展为双向音频、视频和屏幕帧;
  • 将工具结果写回模型会话,而不只是直接返回客户端;
  • 增加用户取消、超时、幂等键和工具重试;
  • 根据数据驻留要求选择美国或欧盟端点,并配置企业身份认证。

身份、数据和水印必须进入设计评审

数字人比纯文本机器人更容易造成身份误认。官方方案通过预置形象库、严格限制自定义形象,以及在生成的音频和视频流中加入不可感知的 SynthID 水印来降低滥用风险。但水印不能替代应用层的明确告知。

界面仍应清楚标注“这是 AI 生成的数字人”,并为高风险业务提供人工接管。保险理赔、金融申请、医疗咨询等场景还应保存工具调用记录、用户授权状态和关键决策依据,而不是只保存最终对话文本。

视觉理解也会扩大数据边界。摄像头可能拍到人脸、车牌、家庭环境或身份证件,屏幕共享则可能暴露密码和其他应用的数据。上线前至少应确认:

  • 哪些媒体帧会被发送、缓存或持久化;
  • 是否在采集前取得了明确同意;
  • 工具是否遵循最小权限原则;
  • 会话终止后多久删除音视频和派生数据;
  • 不同地区的流量是否被路由到正确端点;
  • 数字人能否随时转接人工并停止采集。

上线顺序:先验证任务完成率,再追求视觉效果

适合的第一批场景通常具有明确流程、可验证结果和有限工具权限,例如报案信息收集、车辆导购、设备安装指导或门店自助咨询。不要一开始就让数字人拥有退款、批量修改账户或批准理赔等不可逆权限。

建议按以下顺序推进:

  1. 用纯语音和沙箱工具验证打断恢复、会话记忆与任务完成率;
  2. 增加摄像头或屏幕共享,并建立敏感信息遮挡规则;
  3. 接入预置 Avatar,测量口型同步、首帧时间和弱网表现;
  4. 加入人工接管、审计日志、限流和区域路由;
  5. 只有在品牌形象确有必要时,再申请自定义 Avatar 的许可名单。

Live Avatar 最醒目的部分是视频形象,但企业落地的核心仍是实时编排:对话不能被慢工具拖住,视觉输入不能越过数据边界,数字人也不能掩盖自己是 AI。把这三件事处理好,它才会从演示效果变成可靠的业务入口。


相关推荐