موفرو الوقت الفعلي
يدعم ADK-Rust واجهتَي خلفية للوقت الفعلي من خلال واجهة RealtimeModel نفسها، لذا يمكن للتطبيق توفير كليهما والتبديل بينهما لكل جلسة. تغطي هذه الصفحة النماذج والأصوات ونقاط النهاية والمصادقة وكيفية الاختيار.
الوقت الفعلي لـ 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). - الصوت: PCM16 بتردد 24 kHz للإدخال والإخراج.
- الأصوات:
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 — راجع الوكلاء الآنيين). - الصوت: PCM16 بتردد 16 kHz للإدخال، وPCM16 بتردد 24 kHz للإخراج.
- الأصوات:
Koreوغيرها؛with_voice("Kore"). - المصادقة:
GEMINI_API_KEY(أوGOOGLE_API_KEY).
تختلف أسماء النماذج حسب نقطة النهاية. يستخدم AI Studio (مفتاح API) أسماءً مثل
models/gemini-3.1-flash-live-preview؛ بينما تستخدم Vertex/Agent Platform أسماءً مختلفة. يستهدفGeminiLiveBackend::studio(...)الخاص بـ crate واجهة AI Studio عبر نقطة النهايةv1alpha(وهي أيضًا ما يتطلبه الحوار العاطفي).
اختيار نموذج
- الصوت العام + الأدوات →
gpt-realtime-2.1أوgemini-3.1-flash-live-preview. يستدعي كلاهما الأدوات بشكل موثوق. يُعد Gemini الخيار الأنسب لـ الفيديو المستمر. - الصوت الأكثر طبيعية / الوعي بالعاطفة → Gemini native-audio
(
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 native-audio | |
|---|---|---|---|
| الصوت (إدخال/إخراج صوتي) | ✅ | ✅ | ✅ |
| النصوص الحية | ✅ | ✅ | ✅ |
| الأدوات من جانب الخادم | ✅ (موثوقة) | ✅ (موثوقة) | ⚠️ (أضعف) |
| إطارات الفيديو | ✅ (عناصر الصور) | ✅ (مستمرة) | ✅ (مستمرة) |
| الحوار العاطفي | ❌ | ❌ | ✅ |
التالي: الأدوات →
التشخيص وخصوصية الحمولة
تحمل إطارات الوقت الفعلي النصوص المفرغة، ووسيطات الأدوات، ونتائج الأدوات، والمعرّفات. وعندما يفشل حدث تم التعرّف عليه في إلغاء تسلسله — بسبب انجراف مخطط المزوّد — يعرض التحذير ملخصًا آمنًا للحقول ويحجب الإطار:
| الحقل | المحتوى |
|---|---|
event_type | نوع حدث المزوّد الذي فشل |
error | خطأ إلغاء التسلسل |
payload.bytes | حجم الإطار بالبايتات |
payload.digest | ملخص قصير لمطابقة تكرارات الانحراف نفسه |
payload.raw | <redacted> ما لم يُضمَّن تسجيل الحمولة أثناء الترجمة البرمجية |
ملاحظة: يجمع الملخص أسطر السجل ضمن عملية تشغيل واحدة. وهو ليس ملخصًا تشفيريًا، ولا يكون ثابتًا بين العمليات.
لتشخيص الانحراف مع توفر الإطار، قم بترجمة adk-realtime باستخدام ميزة
record-payloads، التي تسجل أول 300 بايت:
[dependencies]
adk-realtime = { version = "2.1.0", features = ["openai", "record-payloads"] }
تكون الميزة معطلةً افتراضيًا، وهذا اختيار مقصود لكل عملية بناء، لأن انحراف المخطط يحدث بالضبط عندما يوسّع المشغّلون نطاق جمع السجلات والاحتفاظ بها.