リアルタイムプロバイダ

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-2.1",
));
モデル用途
gpt-realtime-2.1現在の本番用音声間モデルおよびデフォルトの選択肢。
gpt-realtime-translate専用の翻訳インタープリター(エンドポイントが異なります。ライブ翻訳の例を参照)。
  • トランスポート: WebSocket(openai機能)または WebRTC(openai-webrtccmakeが必要)。
  • オーディオ: 入出力ともに 24 kHz PCM16。
  • 音声: marin(自然な GA音声)、alloyなど。RealtimeConfig::with_voice("marin")で設定します。
  • 認証: 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-live-2.5-flash-native-audioネイティブ音声モデル — 最も自然な音声を備え、感情的な対話をサポートするモデルです。ツール呼び出しの性能は劣ります。
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では異なる 名前を使用します。crateのGeminiLiveBackend::studio(...)は、 v1alphaエンドポイント経由でAI Studioを対象とします (感情的な対話にも使用されるエンドポイントです)。

モデルの選択

  • 一般的な音声 + ツールgpt-realtime-2.1またはgemini-3.1-flash-live-preview。 どちらもツールを確実に呼び出します。継続的な動画にはGeminiのほうが適しています。
  • 最も自然な音声 / 感情認識感情的な対話を使用するGeminiネイティブ音声 (gemini-live-2.5-flash-native-audio)— ツール呼び出しの信頼性はある程度低下します。
  • 高度な推論gpt-realtime-2.1
  • 翻訳 → 専用の翻訳モデル(独自のプロトコル)。

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

アプリケーションでは通常、リクエストからプロバイダーを読み取り、対応する モデルを構築します。音声レートが異なるため、それらも公開します。

#[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-2.1")),
            "marin",
        ),
        Provider::Gemini => (
            Arc::new(GeminiRealtimeModel::new(
                GeminiLiveBackend::studio(std::env::var("GEMINI_API_KEY")?),
                "models/gemini-3.1-flash-live-preview",
            )),
            "Kore",
        ),
    })
}

例では、これらすべてを環境変数(OPENAI_REALTIME_MODELGEMINI_REALTIME_MODEL)で 上書きできるため、再コンパイルせずにモデルを固定できます。

機能マトリックス

OpenAI gpt-realtime-2.1Gemini 3.1-flash-liveGemini ネイティブ音声
音声(音声入力/出力)
ライブ文字起こし
サーバー側ツール✅ (信頼性が高い)✅ (信頼性が高い)⚠️ (弱い)
ビデオフレーム✅ (画像項目)✅ (連続)✅ (連続)
感情的な対話

次へ: ツール →

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

リアルタイムフレームには、文字起こし、ツール引数、ツール結果、識別子が含まれます。認識されたイベントのデシリアライズに失敗した場合 — プロバイダーのスキーマの不整合 — 警告にはフィールドに配慮した概要が報告され、フレームは破棄されます:

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

注: ダイジェストは 1 回の実行内でログ行をグループ化します。暗号学的ダイジェストではなく、 プロセス間で安定していません。

フレームを手元に置いてドリフトを診断するには、最初の 300 バイトを記録する adk-realtimerecord-payloads feature とともにコンパイルします。

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

この feature はデフォルトでは無効です。これはビルドごとの意図的な選択です。スキーマドリフトが発生するのは、 まさにオペレーターがログの収集範囲と保持期間を拡大するタイミングだからです。