リアルタイムプロバイダ
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-webrtc、cmakeが必要)。 - オーディオ: 入出力ともに 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_MODEL、GEMINI_REALTIME_MODEL)で
上書きできるため、再コンパイルせずにモデルを固定できます。
機能マトリックス
OpenAI gpt-realtime-2.1 | Gemini 3.1-flash-live | Gemini ネイティブ音声 | |
|---|---|---|---|
| 音声(音声入力/出力) | ✅ | ✅ | ✅ |
| ライブ文字起こし | ✅ | ✅ | ✅ |
| サーバー側ツール | ✅ (信頼性が高い) | ✅ (信頼性が高い) | ⚠️ (弱い) |
| ビデオフレーム | ✅ (画像項目) | ✅ (連続) | ✅ (連続) |
| 感情的な対話 | ❌ | ❌ | ✅ |
次へ: ツール →
診断情報とペイロードのプライバシー
リアルタイムフレームには、文字起こし、ツール引数、ツール結果、識別子が含まれます。認識されたイベントのデシリアライズに失敗した場合 — プロバイダーのスキーマの不整合 — 警告にはフィールドに配慮した概要が報告され、フレームは破棄されます:
| 項目 | 内容 |
|---|---|
event_type | 失敗したプロバイダーイベントの種類 |
error | デシリアライズエラー |
payload.bytes | フレームサイズ(バイト単位) |
payload.digest | 同じドリフトの繰り返しを関連付けるための短いダイジェスト |
payload.raw | ペイロード記録がコンパイルに組み込まれていない場合は <redacted> |
注: ダイジェストは 1 回の実行内でログ行をグループ化します。暗号学的ダイジェストではなく、 プロセス間で安定していません。
フレームを手元に置いてドリフトを診断するには、最初の 300 バイトを記録する
adk-realtime を record-payloads feature とともにコンパイルします。
[dependencies]
adk-realtime = { version = "2.1.0", features = ["openai", "record-payloads"] }
この feature はデフォルトでは無効です。これはビルドごとの意図的な選択です。スキーマドリフトが発生するのは、 まさにオペレーターがログの収集範囲と保持期間を拡大するタイミングだからです。