livekit-plugins-openai مرحلتي STT و LLM عند توجيهه إلى عنوان Venice الأساسي. أما بالنسبة إلى TTS، فتستدعي فئة VeniceTTS قصيرة نقطة النهاية /audio/speech في Venice مباشرةً.
تتناسب Venice مع بنية خط أنابيب STT-LLM-TTS في LiveKit Agents. لا توفّر Venice واجهة WebSocket لـ OpenAI Realtime (الكلام إلى كلام)، لذا لا يتوفر مسار
RealtimeModel / الوسائط المتعددة. استخدم خط الأنابيب المكوّن الموضح أدناه — فهو يمنحك تحكمًا كاملًا في كل نموذج ويُبقي الاستدلال على البنية التحتية الخاصة بـ Venice.كيف تُقابل Venice مكونات LiveKit Agents
الإعداد
ثبّت الإطار والملحقات المستخدَمة أدناه:يعود ملحق OpenAI إلى
OPENAI_API_KEY عند حذف api_key. وبما أنك توجهه إلى Venice، مرّر دائمًا api_key صراحةً (وإلا سيُقرأ المفتاح من المتغيّر الخطأ). تقرأ الأمثلة أدناه VENICE_API_KEY.فئة Venice TTS
لا تستخدم فئةopenai.TTS من الملحق مع Venice. ترسل الإصدارات الحالية من livekit-plugins-openai الحقل stream_format مع كل طلب كلام، وترفضه نقطة النهاية /audio/speech في Venice بالخطأ 400. بدلًا من ذلك، احفظ هذه الفئة باسم venice_tts.py بجوار وكيلك. فهي تستدعي /audio/speech بالحقول التي تقبلها Venice فقط، وتسلّم الصوت إلى LiveKit فور وصوله.
venice_tts.py
response_format صيغةً يدعمها النموذج. تحقّق من model_spec.supported_formats في GET /models?type=tts. استخدم pcm مع tts-kokoro، إذ يشغّلها LiveKit دون خطوة فك ترميز. أما مع النماذج الأخرى، فمرّر mp3 أو wav وسيتولى LiveKit فك ترميز الصوت.
وكيل صوتي متكامل
هذا وكيل صوتي كامل يفرّغ الكلام باستخدام Venice STT، ويفكّر عبر Venice LLM، ويتحدث بواسطة Venice TTS من خلال فئةVeniceTTS أعلاه. يوفّر Silero كشفًا محليًا لنشاط الصوت حتى يعرف STT بوضع الدُفعات متى اكتمل الدور.
agent.py
إعداد كل مكوّن
LLM
يُعدّ ربط الـ LLM الأبسط — إذ يدعم/chat/completions من Venice تدفّق SSE واستدعاء الأدوات والرؤية، وكلها يستخدمها LiveKit مباشرة. يُبقي venice-uncensored-1-2 الاستدلال خاصًا وغير خاضع للرقابة بينما يغذّي خط أنابيب TTS؛ لا تلجأ إلى نموذج من فئة flash إلا إذا احتجت إلى تقليل زمن الوصول إلى أول رمز.
extra_body:
تحويل الكلام إلى نص
يستدعي OpenAI STT في LiveKit المسار/audio/transcriptions لكل مقطع كلامي، لذا يحتاج إلى VAD (مثل Silero أعلاه) للكشف عن انتهاء الدور. استبدل النموذج الافتراضي بنموذج STT من Venice. يُعدّ nvidia/parakeet-tdt-0.6b-v3 الخيار الأصغر والأقل تأخيرًا؛ بينما يمثّل stt-xai-v1 و elevenlabs/scribe-v2 بديلين أحدث إذا أردت دقة أعلى.
تحويل النص إلى كلام
تستدعيVeniceTTS المسار /audio/speech. الأصوات في Venice خاصة بكل نموذج — مرّر زوج model/voice من النموذج نفسه. يُبقي tts-kokoro مرحلة الصوت خاصة وغير خاضعة للرقابة حتى يستطيع نطق مخرجات الـ LLM حرفيًا، كما أن مخرجاته بصيغة pcm تتفادى خطوة فك ترميز MP3 وتوفّر قليلًا من زمن التأخير. قد تطبّق الأصوات الأسرع المدعومة من مزوّدين آخرين (مثل Gemini) تصفية للمحتوى، لذا تجنّبها إذا احتجت إلى كلام غير خاضع للرقابة.
النماذج الموصى بها
تتغيّر معرّفات النماذج بمرور الوقت — اكتشف الخيارات الحالية أثناء التشغيل عبرGET /models?type=... و GET /models/traits بدلًا من ترميزها بشكل ثابت. بالنسبة للوكلاء الصوتيين، أعطِ الأولوية للفئات منخفضة زمن التأخير (النماذج المسمّاة flash أو turbo أو mini، أو ذات أعداد المعاملات الصغيرة) لأن الاستجابة المُدركة تعتمد على زمن الوصول إلى أول رمز وسرعة TTS. نقاط انطلاق جيدة من الكتالوج الحالي:
تصفح جميع النماذج
تصفية حسب النص وتحويل الكلام إلى نص وتحويل النص إلى كلام مع التسعير والقدرات الحيّة.
زمن التأخير ونصائح للإنتاج
تهيمن مدة تبادل الأدوار على جودة الوكيل الصوتي — أي الزمن بين انتهاء المستخدم من جملته وبدء الوكيل بالتحدث. مع خط أنابيب Venice الكامل، خصّص تقريبًا:
توقّع ~0.8–1.5 ثانية للوصول إلى أول صوت — رائع لتبادل أدوار بأسلوب المساعد ومقاس بعناية. أما في المحادثات القابلة للمقاطعة والمتداخلة بشدة، فستشعر بالفجوة مقارنةً بنموذج كلام إلى كلام أصلي.
تقليل زمن التأخير
- استخدم
tts-kokoroمعresponse_format="pcm"، وهو الإعداد الافتراضي فيVeniceTTS، لتخطي خطوة فك ترميز MP3. - اضبط Silero VAD (
silero.VAD.load(min_silence_duration=0.4)) لتقصير كشف انتهاء الدور دون قطع الكلام. - فضّل الفئات منخفضة زمن التأخير لـ STT/TTS (مثل TTS
tts-kokoro، و STTnvidia/parakeet-tdt-0.6b-v3). أبقِvenice-uncensored-1-2كـ LLM للحفاظ على الخصوصية وعدم الخضوع للرقابة؛ ولا تنتقل إلى LLM من فئةflashإلا إذا احتجت إلى زمن أسرع للوصول إلى أول رمز. - اجعل الردود موجزة — فالجملة الأولى هي ما يحدد الاستجابة المُدركة.
الدمج بين المزوّدين
يتيح لك LiveKit اختيار كل مكوّن باستقلالية، فيمكنك الإبقاء على Venice حيث تهم أكثر خصوصيتها ونماذجها غير الخاضعة للرقابة، والاستعانة بمزوّد تدفّق حيث يكون زمن التأخير حرجًا. إعداد شائع لتفاعلية عالية يُبقي على Venice LLM (وربما STT) ويقرنه بـ TTS تدفّقي مخصّص:القيود والملاحظات
- لا يوجد Realtime API أو كلام إلى كلام. لا تمتلك Venice WebSocket لـ OpenAI Realtime، لذا فإن
openai.realtime.RealtimeModelومسار الوكيل متعدد الوسائط غير متاحين. استخدم خط أنابيب STT-LLM-TTS الموضّح أعلاه. - STT بوضع الدُفعات لا التدفّق. التفريغ الصوتي في Venice طلب/استجابة، لذا يلزم VAD (مثل Silero) لكشف انتهاء الدور. يضيف ذلك قدرًا يسيرًا من زمن التأخير مقارنةً بمقبس STT تدفّقي.
- يستخدم TTS فئة
VeniceTTSوليسopenai.TTS. ترسل الإصدارات الحالية منlivekit-plugins-openaiالحقلstream_formatفي طلبات الكلام، وهو ما ترفضه Venice بالخطأ 400. تُبلّغVeniceTTSبأنstreaming=False، لذا يُركّب LiveKit الرد جملةً تقريبًا في كل مرة، ولا تستخدم الفئة علامةstreamingفي Venice. يبقى زمن التأخير مناسبًا لمعظم الوكلاء؛ استخدمresponse_format="pcm"لتقليل تكلفة فك الترميز. - طابق الصوت مع النموذج. معرّفات
voiceفي TTS صالحة فقط معmodelالمطابق لها. راجع نماذج تحويل النص إلى كلام. - لا تُرمّز قوائم النماذج بشكل ثابت. يتم إهمال معرّفات نماذج Venice واستبدالها بانتظام — استعلم عن
GET /models/GET /models/traitsأثناء التشغيل. راجع الإهمالات.