リアルタイムプロバイダー
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-realtime | GA の音声対音声モデル。高速で、ツール使用に優れています。既定の選択肢です。 |
gpt-realtime-2 | 推論版 — 複雑な複数ステップのリクエストにより適しています。 |
gpt-realtime-translate | 専用の 翻訳 インタープリター(別のエンドポイント。 Live Translation example を参照)。 |
- Transport: WebSocket(
openai機能)またはWebRTC(openai-webrtc、cmakeが必要)。 - 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-realtime | Gemini 3.1-flash-live | Gemini ネイティブ音声 | |
|---|---|---|---|
| 音声(入出力) | ✅ | ✅ | ✅ |
| ライブ文字起こし | ✅ | ✅ | ✅ |
| サーバー側ツール | ✅ (信頼性あり) | ✅ (信頼性あり) | ⚠️ (弱い) |
| 動画フレーム | ✅ (画像アイテム) | ✅ (連続) | ✅ (連続) |
| 感情的な対話 | ❌ | ❌ | ✅ |
次へ: ツール →
診断とペイロードのプライバシー
リアルタイムフレームには、トランスクリプト、ツールの引数、ツールの結果、および識別子が含まれます。認識されたイベントのデシリアライズに失敗した場合 — プロバイダーのスキーマドリフト — 警告はフィールドに安全な要約を報告し、フレームを保留します:
| フィールド | 内容 |
|---|---|
event_type | 失敗したプロバイダーイベントの型 |
error | デシリアライズエラー |
payload.bytes | バイト単位のフレームサイズ |
payload.digest | 同じドリフトの繰り返しを関連付けるための短いダイジェスト |
payload.raw | ペイロード記録がコンパイル時に組み込まれている場合を除き、<redacted> |
注: digest は run 内のログ行をグループ化します。これは暗号学的な digest ではなく、プロセス間で安定ではありません。
手元にフレームがある状態で drift を診断するには、adk-realtime を
record-payloads feature 付きでコンパイルします。これは最初の 300 bytes を記録します:
[dependencies]
adk-realtime = { version = "2.0.0", features = ["openai", "record-payloads"] }
この feature はデフォルトでは off で、ビルドごとの意図的な選択です。なぜなら schema drift は、まさに operator が log collection と retention を拡大するタイミングだからです。