Gemini 3.8 Live のデベロッパー ガイド

Gemini 3.8 Live は、低レイテンシの双方向音声および動画インタラクションと、対面でのライブ アバター合成用に構築されたリアルタイム会話モデルです。続けて会話ワークフロー向けに設計された 3.8 Live には、デフォルトで有効になっているアフェクティブ ダイアログ、プロアクティブ音声フィルタリング、自動キャンセル ブロッキング ツール、動的な多言語切り替えが用意されています。

このドキュメントでは、次のトピックについて説明します。

  • Gemini モデル ファミリーにおける 3.8 Live の位置付け。
  • 3.8 Live の主な機能。
  • Google Gen AI SDK との統合。
  • 必要な API のルールと規約。
  • 以前の Gemini Live API モデルからの移行。

Gemini ファミリーにおける役割

3.8 Live は、リアルタイム ストリーミング インタラクション 向けに設計されています。双方向 WebSocket を介して動作し、音声、ライブカメラ フィード、画面ブロードキャストを 1 秒未満のレイテンシで処理しながら、24 kHz の音声と同期された 24 FPS の動画アバターを生成します。

モデルの仕様と比較

次の表に、3.8 Live と以前の Gemini Live API モデルの仕様を比較します。

属性 Gemini 3.8 Live Live API ネイティブ音声を使用した Gemini 2.5 Flash(GA ベースライン)
モデル 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 にダウングレードし、ユーザーが話し終えた後にレスポンスを再生します。
  • 動的な多言語切り替えとカスタム語彙:

    • 多言語サポート: 接続を再起動または再構成せずに、セッション中にサポートされている 言語を検出して切り替えます。
    • カスタム語彙バイアス: custom_vocabulary を使用して、AudioTranscriptionConfig (input_audio_transcription 経由)でドメイン固有のキーワード、固有名詞、医療用語、商品コードを受け入れ、文字起こしの精度を向上させます。
  • 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に再試行上限を含めます。例: 「ツール呼び出しで結果が返されない場合は、 パラメータのバリエーションで繰り返し検索するのではなく、ユーザーに通知してください。 ユーザーに話しかけずに、2 回以上連続してツール呼び出しを実行しないでください。」 ユーザー。"
  • 厳密な 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 への移行について詳しくは、Live API ネイティブ音声を使用した Gemini 2.5 Flash から Gemini 3.8 Live に移行するをご覧ください。

デベロッパー向けチェックリスト

アプリをデプロイする前に、次の項目を確認してください。

参考情報

詳しくは、次のリソースをご覧ください。