リアルタイムプロバイダー

ADK-Rust は同じ RealtimeModel インターフェースの背後で 2 つのリアルタイムバックエンドを扱うため、アプリケーションは両方を提供し、セッションごとに切り替えられます。このページでは、モデル、音声、エンドポイント、認証、および選び方を扱います。

OpenAI リアルタイム (GA)

use adk_realtime::openai::OpenAIRealtimeModel;
use adk_realtime::model::BoxedModel;
use std::sync::Arc;

let model: BoxedModel = Arc::new(OpenAIRealtimeModel::new(
    std::env::var("OPENAI_API_KEY")?,
    "gpt-realtime",        // or "gpt-realtime-2" (reasoning)
));
モデル用途
gpt-realtimeGA の音声対音声モデル。高速で、ツール使用に優れています。既定の選択肢です。
gpt-realtime-2推論版 — 複雑な複数ステップのリクエストにより適しています。
gpt-realtime-translate専用の 翻訳 インタープリター(別のエンドポイント。 Live Translation example を参照)。
  • Transport: WebSocket(openai機能)またはWebRTC(openai-webrtccmakeが必要)。
  • Audio: 24 kHz PCM16 の入出力。
  • Voices: marin(自然なGA音声)、alloy、およびその他。RealtimeConfig::with_voice("marin")で設定します。
  • Auth: OPENAI_API_KEY。キーはサーバー上に置きます(ブラウザーには置かない)。

Gemini Live

use adk_realtime::gemini::{GeminiLiveBackend, GeminiRealtimeModel};

let model: BoxedModel = Arc::new(GeminiRealtimeModel::new(
    GeminiLiveBackend::studio(std::env::var("GEMINI_API_KEY")?),
    "models/gemini-3.1-flash-live-preview",
));
モデル用途
models/gemini-3.1-flash-live-preview半カスケードのライブモデル。ツールを確実に呼び出し、動画フレームを受け入れます。既定の選択肢です。
models/gemini-2.5-flash-native-audio-preview-12-2025ネイティブオーディオモデル — 最も自然な音声で、affective dialogue をサポートするモデルです。ツール呼び出しは弱めです。
models/gemini-3.5-live-translate-preview専用の翻訳モデル(翻訳例を参照)。
  • トランスポート: WebSocket (gemini 機能、AI Studio) または Vertex AI Live (vertex-live、OAuth2 / ADC — Realtime Agents を参照)。
  • オーディオ: 16 kHz PCM16 入力, 24 kHz PCM16 出力
  • ボイス: Kore など; with_voice("Kore")
  • 認証: GEMINI_API_KEY (または GOOGLE_API_KEY)。

モデル名はエンドポイントによって異なります。 AI Studio (API-key) では models/gemini-3.1-flash-live-preview のような名前を使用しますが、Vertex/Agent Platform では異なる 名前を使用します。クレートの GeminiLiveBackend::studio(...) は AI Studio を v1alpha エンドポイント経由で対象にしています(これは感情的対話にも必要です)。

モデルの選択

  • 一般的な音声 + ツールgpt-realtime または gemini-3.1-flash-live-preview。 どちらもツール呼び出しを安定して行えます。Gemini は 継続的な動画 により適しています。
  • 最も自然な音声 / 感情認識対応 → Gemini native-audio (gemini-2.5-flash-native-audio-*) を affective dialogue と併用 — ただし、ツール呼び出しの信頼性はある程度低下します。
  • 推論重視gpt-realtime-2
  • 翻訳 → 専用の translate モデル(独自プロトコル)。

セッションごとのプロバイダー選択

アプリケーションは通常、リクエストからプロバイダーを読み取り、それに一致する モデルを構築します。オーディオのレートも異なるため、それらも公開してください:

#[derive(Clone, Copy)]
enum Provider { OpenAI, Gemini }

impl Provider {
    fn audio_rates(self) -> (u32, u32) {   // (input, output)
        match self {
            Provider::OpenAI => (24_000, 24_000),
            Provider::Gemini => (16_000, 24_000),
        }
    }
}

fn build_model(p: Provider) -> anyhow::Result<(BoxedModel, &'static str)> {
    Ok(match p {
        Provider::OpenAI => (
            Arc::new(OpenAIRealtimeModel::new(std::env::var("OPENAI_API_KEY")?, "gpt-realtime")),
            "marin",
        ),
        Provider::Gemini => (
            Arc::new(GeminiRealtimeModel::new(
                GeminiLiveBackend::studio(std::env::var("GEMINI_API_KEY")?),
                "models/gemini-3.1-flash-live-preview",
            )),
            "Kore",
        ),
    })
}

この例では、これらすべてを env vars (OPENAI_REALTIME_MODEL, GEMINI_REALTIME_MODEL) で上書き可能にしているため、 再コンパイルせずにモデルを固定できます。

機能マトリクス

OpenAI gpt-realtimeGemini 3.1-flash-liveGemini ネイティブ音声
音声(入出力)
ライブ文字起こし
サーバー側ツール✅ (信頼性あり)✅ (信頼性あり)⚠️ (弱い)
動画フレーム✅ (画像アイテム)✅ (連続)✅ (連続)
感情的な対話

次へ: ツール →

診断とペイロードのプライバシー

リアルタイムフレームには、トランスクリプト、ツールの引数、ツールの結果、および識別子が含まれます。認識されたイベントのデシリアライズに失敗した場合 — プロバイダーのスキーマドリフト — 警告はフィールドに安全な要約を報告し、フレームを保留します:

フィールド内容
event_type失敗したプロバイダーイベントの型
errorデシリアライズエラー
payload.bytesバイト単位のフレームサイズ
payload.digest同じドリフトの繰り返しを関連付けるための短いダイジェスト
payload.rawペイロード記録がコンパイル時に組み込まれている場合を除き、<redacted>

注: digest は run 内のログ行をグループ化します。これは暗号学的な digest ではなく、プロセス間で安定ではありません。

手元にフレームがある状態で drift を診断するには、adk-realtimerecord-payloads feature 付きでコンパイルします。これは最初の 300 bytes を記録します:

[dependencies]
adk-realtime = { version = "2.0.0", features = ["openai", "record-payloads"] }

この feature はデフォルトでは off で、ビルドごとの意図的な選択です。なぜなら schema drift は、まさに operator が log collection と retention を拡大するタイミングだからです。