開發人員適用的 Gemini 3.8 Live 指南

Gemini 3.8 Live 是即時對話模型,專為低延遲雙向語音和影片互動,以及面對面即時虛擬化身合成而設計。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 標準基準轉錄
視覺化權杖控制項 可設定的 media_resolution (LOW、MEDIUM、HIGH) 每個影格的固定權杖額度

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"])。生成的臉部表情和嘴唇動作會與合成語音即時同步。

    您可以使用預先建立的現成虛擬化身,或提供自訂參考圖像,打造數位服務專員、客服專員、虛擬家教或互動角色。如需設定詳細資料,請參閱「設定即時虛擬化身」。

  • 預設啟用情緒感知對話和主動判斷式語音:

    • 情緒感知對話:在 3.8 Live 版中預設為啟用。模型會處理使用者音訊輸入中的聲學韻律、語音提示、停頓和語音語調,調整語音語調和對話節奏。
    • 主動判斷式語音:3.8 Live 預設啟用。模型會過濾環境噪音和背景語音,只有在使用者說話時才會生成音訊回覆。
  • 非同步和自動取消的封鎖函式呼叫:3.8 Live 提供專為即時語音設計的工具呼叫行為:

    • 非封鎖非同步執行:模型產生工具呼叫時,音訊工作階段會保持啟用狀態,因此代理程式可以串流對話確認訊息 (例如「讓我調出你的帳戶詳細資料...」),並在用戶端應用程式呼叫後端 API 時處理後續輸入內容。
    • 自動取消封鎖呼叫 (behavior="BLOCKING"):當函式宣告設定 behavior="BLOCKING" 時,生成作業會暫停,直到工具回覆為止。如果封鎖呼叫正在執行時收到新的使用者輸入內容,Gemini Live API 伺服器會取消待處理的呼叫。
    • 禮貌中斷處理:在早期模型中,如果使用者說話時,系統使用 scheduling="INTERRUPT" 傳回工具回應,會與使用者音訊重疊。在 3.8 Live 中,當使用者說話時,伺服器會將排程降級為 WHEN_IDLE,並在使用者說完後播放回覆。
  • 動態切換語言和自訂詞彙:

    • 多語言支援:在工作階段中偵測並切換支援的語言,不需重新啟動或重新設定連線。
    • 自訂詞彙偏誤:接受 AudioTranscriptionConfig 中的特定領域關鍵字、專有名詞、醫療術語和產品代碼 (透過 input_audio_transcription),並使用 custom_vocabulary 提高轉錄準確率。
  • 使用 media_resolution 控制項的多模態視覺基準:接受即時影片串流 (1 FPS JPEG 影格,建議解析度 768x768),並可設定 media_resolution (MEDIA_RESOLUTION_LOW、MEDIA_RESOLUTION_MEDIUM、MEDIA_RESOLUTION_HIGH),平衡每個影格的權杖用量和視覺細節。

快速入門導覽課程

開始之前,請使用應用程式預設憑證 (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 中加入重試次數限制。例如:「如果工具呼叫未傳回任何結果,請通知使用者,不要使用不同的參數重複搜尋。Never run more than two consecutive tool calls without speaking to the user."
  • 嚴格 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」。

開發人員檢查清單

部署應用程式前,請先確認下列事項:

其他資源

詳情請參閱下列資源: