النقاط الرئيسية
- خط الأنابيب متعدد الوسائط المحلي هو أربعة نماذج تُنسَّق بشكل منفصل — وليس نموذجًا واحدًا مثل GPT-5.5. يتولى whisper.cpp الصوت، ويتولى VLM (LLaVA أو Llama 3.2 Vision) الصور، ويتولى LLM الاستدلال النصي، ويتولى برنامج Piper إخراج الصوت. يوجه المنسِّق المدخلات إلى النموذج الصحيح ويجمع المخرجات.
- يمكن لـ Llama 3.2 Vision 11B أن يحل محل كل من VLM وLLM النصي في نموذج واحد. يقبل النص والصور في آنٍ واحد ويتولى كلًا من الوصف والاستدلال في خطوة واحدة — مما يقلل VRAM من ~15 غيغابايت (نماذج منفصلة) إلى ~8 غيغابايت (Llama 3.2 Vision 11B منفردًا).
- الحد الأدنى من الأجهزة للمجموعة الكاملة: RTX 4070 12 غيغابايت أو Apple M5 Pro 36 غيغابايت. يمكن لـ RTX 3060 12 غيغابايت تشغيل نسخة مقيدة (Phi-4 بدلًا من Llama 3.3 8B، أو تحميل النماذج بشكل متسلسل) — صالحة للاستخدام لكن أبطأ.
- خمس حالات استخدام عملية تبرر التعقيد: تحليل المستندات بالتحكم الصوتي، والأسئلة والأجوبة البصرية مع التفاعل الصوتي، ونسخ الاجتماعات مع تحليل الشرائح، وأدوات إمكانية الوصول بقارئ الشاشة المحلي، وتحليل كاميرا الأمان المحلية.
- التنسيق غير المتزامن ضروري لأداء مقبول. يمكن لـ STT والرؤية العمل بشكل متوازٍ عند توفر كلٍّ من مدخلات الصوت والصورة — يانتظر LLM النصي كليهما ثم يُنشئ استجابة مجمّعة.
- يُقلل بث مخرجات LLM إلى TTS من التأخير المُدرَك بمقدار 0.3–0.7 ثانية. ابدأ في توليد الصوت من الجملة الأولى المكتملة بينما لا يزال LLM يكتب بقية الاستجابة.
- هذا ليس GPT-5.5. تُنتج النماذج المنفصلة "درزات" — يُمرَّر وصف نموذج الرؤية نصًا إلى LLM، مما يفقد بعض الاستدلال متعدد الوسائط. جودة المهام المعقدة متعددة الوسائط أدنى من النماذج الحدية المغلقة، لكنها كافية للمستندات المنظمة والمهام ذات الصور الواضحة.
حقائق سريعة
- إجمالي VRAM للمجموعة الكاملة: ~15 غيغابايت (Whisper 3 غيغابايت + LLaVA 7B 6 غيغابايت + Llama 3.3 8B 6 غيغابايت). يعمل برنامج Piper على وحدة المعالجة المركزية.
- المجموعة المبسطة (Llama 3.2 Vision 11B): ~8 غيغابايت VRAM — يتولى الرؤية والاستدلال النصي معًا في نموذج واحد.
- تأخير الصوت (Whisper small، RTX 4070): ~200–500 مللي ثانية STT. 500–1500 مللي ثانية أول رمز LLM. 100 مللي ثانية Piper TTS.
- تأخير معالجة الصورة (LLaVA 7B، RTX 4070): ~2–5 ثوانٍ لكل صورة تبعًا للدقة والمطالبة.
- لا فيديو في الوقت الفعلي: تعالج VLMs الإطارات الفردية، وليس تدفقات الفيديو المستمرة. للفيديو، استخرج الإطارات بمعدل 1 إطار في الثانية وعالج كل منها.
- نفس مثيل Ollama لـ VLM + LLM: يمكن لـ Ollama تشغيل Llama 3.2 Vision كنموذج رؤية ونموذج نصي في آنٍ واحد، مما يوفر VRAM.
- جميع المكونات مرخصة بموجب MIT أو Apache 2.0 (whisper.cpp MIT، LLaVA MIT، Llama 3.3 8B Llama 3 Community License، Piper MIT).
ما هو خط الأنابيب متعدد الوسائط للذكاء الاصطناعي؟
يقبل نظام الذكاء الاصطناعي متعدد الوسائط أنواعًا متعددة من المدخلات (الصوت، الصور، النص) ويُنتج أنواعًا متعددة من المخرجات (نص، كلام). المعادل السحابي هو GPT-5.5 — نموذج واحد يقبل الصوت والصور والنص بأي تركيبة.
- النهج السحابي (GPT-5.5): نموذج ضخم مدرَّب على جميع الوسائط في آنٍ واحد. يُكتسب الاستدلال متعدد الوسائط أثناء التدريب — يمكن للنموذج الاستدلال أصليًا على العلاقة بين محتوى الصورة واستفسارات الصوت.
- النهج المحلي (هذا الدليل): نماذج متخصصة مستقلة لكل وسيط، تُربط بواسطة منسِّق. أكثر نمطية وأقل تكلفة في التشغيل، لكنه يُنتج "درزات" — تُسلسَل مخرجات نموذج الرؤية إلى نص قبل تمريرها إلى LLM.
- لماذا البناء محليًا: الخصوصية (الصور الطبية، المستندات المملوكة، لقطات الشاشة السرية)، التكلفة (صفر رسوم لكل استعلام)، القدرة على العمل دون اتصال (لا حاجة للإنترنت بعد تنزيل النموذج)، التخصيص (استبدال أي مكوِّن).
- ميزة النمطية: يمكنك ترقية أي مكوِّن بشكل مستقل. عند ظهور نموذج STT محلي أفضل، استبدل طبقة STT فقط. عند ظهور VLM أفضل، استبدل نموذج الرؤية فقط — يبقى باقي خط الأنابيب دون تغيير.
التكلفة: خط الأنابيب المحلي مقابل واجهات برمجة التطبيقات السحابية (شهريًا)
عند الاستخدام المعتدل (أكثر من 100 استعلام/يوم)، يستعيد خط الأنابيب متعدد الوسائط المحلي تكلفته في 3–6 أشهر. عند الاستخدام الخفيف (10 استعلامات/يوم)، يمتد نقطة التعادل إلى 12–18 شهرًا.
📍 في جملة واحدة
يكلف خط الأنابيب متعدد الوسائط المحلي 0 دولار/شهريًا في رسوم API بعد الاستثمار الأولي في الأجهزة (600–3,500 دولار)، مع تعادل مقابل تكاليف API لـ GPT-5.5 (135–225 دولار/شهر) في غضون 3–18 شهرًا حسب حجم الاستعلامات.
| الاستخدام | GPT-5.5 API | Google Cloud | محلي |
|---|---|---|---|
| 100 استعلام صوتي/يوم | $90–150/شهر | $60–120/شهر | $0 |
| 50 تحليل صورة/يوم | $45–75/شهر | $30–60/شهر | $0 |
| مجمَّع (نموذجي) | $135–225/شهر | $90–180/شهر | $0 |
| الأجهزة (مرة واحدة) | $0 | $0 | $600–3,500 |
| نقطة التعادل | — | — | 3–18 شهرًا |
يستعيد خط الأنابيب المحلي تكلفته في 3–6 أشهر عند الاستخدام المعتدل (أكثر من 100 استعلام/يوم). عند الاستخدام الخفيف (10 استعلامات/يوم)، يمتد نقطة التعادل إلى 12–18 شهرًا.
نظرة عامة على البنية المعمارية
يستخدم خط الأنابيب متعدد الوسائط المحلي نمط الموجِّه-المنسِّق: تُصنَّف المدخلات عند الحد، وتُوجَّه إلى النموذج المناسب، وتُجمع المخرجات بواسطة المنسِّق قبل توليد الاستجابة النهائية.
- أنواع المدخلات: صوت الميكروفون (كلام)، صورة الكاميرا أو الملف (رؤية)، نص لوحة المفاتيح (نص).
- منطق التوجيه: اكتشف نوع المدخل عند الحد. الصوت ← نموذج STT. الصورة ← VLM. النص ← مباشرةً إلى LLM. إذا وصل الصوت والصورة معًا، عالج بشكل متوازٍ واجمع.
- سجل النماذج: يُعيَّن كل نوع مدخل إلى دالة معالج تستدعي النموذج المناسب وتُعيد وصفًا نصيًا/نصًا مفرَّغًا.
- المنسِّق: يجمع جميع مخرجات النماذج، يجمعها في مطالبة واحدة لـ LLM النصي، يحصل على استجابة LLM، ويوجهها إلى TTS للإخراج الصوتي أو إلى الشاشة كنص.
- أنواع المخرجات: استجابة صوتية (Piper TTS)، نص على الشاشة، أو بيانات منظمة (JSON) للتكامل مع أنظمة أخرى.
- المعالجة المتوازية: يمكن لـ STT وVLM المعالجة في آنٍ واحد — يمكن لاستعلام صوتي حول صورة معالجة كليهما بالتوازي، مما يقلل إجمالي التأخير بنسبة 40–60% مقارنةً بالمعالجة المتسلسلة.
مجموعة المكونات
المجموعة الكاملة مع متطلبات VRAM ودور كل مكوِّن.
📍 في جملة واحدة
تستخدم مجموعة الوسائط المتعددة المحلية الكاملة ~15 غيغابايت VRAM: Whisper large-v3 (3 غيغابايت) + LLaVA 1.6 7B (6 غيغابايت) + Llama 3.3 8B (6 غيغابايت)؛ يعمل Piper TTS على وحدة المعالجة المركزية دون تكلفة VRAM.
💬 بعبارات بسيطة
يمكنك خفض VRAM إلى 8 غيغابايت باستخدام Llama 3.2 Vision 11B كنموذج للرؤية والنص معًا — يتولى الصور والمحادثة في نموذج واحد، بينما يظل برنامج Whisper يتولى الصوت وبرنامج Piper يتولى الإخراج الصوتي.
| الطبقة | الأداة | النموذج | VRAM | الدور |
|---|---|---|---|---|
| STT | whisper.cpp | Whisper large-v3 | ~3 غيغابايت | الصوت ← نص مفرَّغ |
| الرؤية | Ollama | LLaVA 1.6 7B | ~6 غيغابايت | الصورة ← وصف نصي |
| الاستدلال | Ollama | Llama 3.3 8B Q4 | ~6 غيغابايت | نص ← استجابة نصية |
| TTS | Piper | en_US-lessac-medium | وحدة المعالجة المركزية فقط | نص ← إخراج صوتي |
| المجموع (نماذج منفصلة) | ~15 غيغابايت | خط الأنابيب الكامل |
💡Tip: استخدم Llama 3.2 Vision 11B بدلًا من LLaVA + Llama 3.3 8B المنفصلَين لخفض VRAM إلى ~8 غيغابايت. يتولى Llama 3.2 Vision وصف الصور والاستدلال النصي معًا في نموذج واحد، مما يلغي الحاجة إلى VLM منفصل.
💡Tip: VLM بديل: Qwen2-VL 7B (~6 غيغابايت VRAM) — أقوى من LLaVA في التعرف البصري على الحروف متعدد اللغات وفهم المستندات. مُوصى به عند معالجة المستندات الصينية أو اليابانية أو الكورية.
مستويات الأجهزة لمتعدد الوسائط
خمس تكوينات أجهزة مُرتَّبة حسب القدرة وحجم VRAM. كل منها يدعم مجموعة فرعية مختلفة من المجموعة متعددة الوسائط الكاملة.
| المستوى | وحدة معالجة الرسومات | الذاكرة العشوائية | يمكن تشغيله | التأخير (استعلام صوتي + صورة) |
|---|---|---|---|---|
| أساسي | RTX 3060 12 غيغابايت | 16 غيغابايت | STT + Phi-4 (الرؤية بشكل منفصل، متسلسل) | 5–10 ثوانٍ |
| متوسط | RTX 4070 12 غيغابايت | 32 غيغابايت | المجموعة الكاملة مع نماذج 7B (LLaVA 7B + Llama 3.3 8B، ملاءمة ضيقة) | 3–6 ثوانٍ |
| عالي | RTX 4090 24 غيغابايت | 64 غيغابايت | المجموعة الكاملة مع VLM 13B + LLM 8B في آنٍ واحد | 2–4 ثوانٍ |
| Apple متوسط | M5 Pro 36 غيغابايت | 36 غيغابايت موحدة | المجموعة الكاملة مع نماذج 8B عبر Metal (مُوصى به). يتناسب Qwen2-VL 7B + Llama 3.3 8B بشكل مريح في 36 غيغابايت مع مساحة لـ Whisper large-v3. | 2–4 ثوانٍ |
| Apple عالي | M5 Max 128 غيغابايت | 128 غيغابايت موحدة | المجموعة الكاملة مع نماذج 70B — أفضل جودة محلية | 1–3 ثوانٍ |
يُقاس التأخير من نهاية الاستعلام الصوتي حتى بدء تشغيل TTS، بما في ذلك معالجة الصورة إذا كانت موجودة.
💡Tip: يُعدّ M5 Max بذاكرة موحدة 128 غيغابايت المنصة المثلى لمتعدد الوسائط محليًا. يمكنه تشغيل Whisper large-v3 (3 غيغابايت) + Llama 3.2 Vision 90B (~64 غيغابايت) + Piper TTS في آنٍ واحد — يُعدّ نموذج الرؤية 90B أعلى جودة VLM محلي متاح، يقترب من GPT-5.5 في مهام المستندات والصور. لا يمكن لأي إعداد GPU منفصل مجاراة ذلك دون تكوينات متعددة GPU تكلف 2–3 أضعاف أكثر.
حالة الاستخدام 1: محلل المستندات بالتحكم الصوتي
انطق بسؤال حول صورة مستند؛ يُفرِّغ خط الأنابيب صوتك، ويعالج المستند بصريًا، ويقرأ الإجابة بصوت عالٍ. هذه حالة الاستخدام الأساسية لدمج STT + VLM + LLM + TTS.
- مثال: التقط صورة لفاتورة وقل "ما المبلغ الإجمالي المستحق وما الموعد النهائي للدفع؟"
- خط الأنابيب: يُفرِّغ Whisper السؤال ← تُرسل الصورة إلى LLaVA أو Llama 3.2 Vision ← يستخرج VLM نص الفاتورة وبنيتها ← يجمع LLM السؤال + مخرجات VLM ← يقرأ Piper الإجابة بصوت عالٍ.
- المطالبة: "إليك صورة: [وصف VLM]. يسأل المستخدم: [النص المفرَّغ]. أجب على السؤال استنادًا إلى محتوى الصورة."
- أفضل VLM: MiniCPM-V 2.6 أو Llama 3.2 Vision 11B لدقة التعرف البصري على الحروف في الفواتير والمستندات.
- قيمة الخصوصية: السجلات الطبية، الوثائق القانونية، البيانات المالية — تُعالَج محليًا بالكامل دون خروج أي بيانات من الجهاز.
حالة الاستخدام 2: مساعد الأسئلة والأجوبة البصري
وجِّه الكاميرا نحو كائن أو مشهد، اطرح سؤالًا شفهيًا، واستلم إجابة منطوقة. هذه حالة الاستخدام الأقرب محليًا إلى Google Lens مع التفاعل الصوتي.
- التطبيقات: جرد المستودعات (التقط صورة لرف، اسأل "كم عدد وحدات SKU-4429 الموجودة؟")، التفتيش الميداني (التقط صورة لتلف الآلات، اسأل "هل هذا آمن للتشغيل؟")، إمكانية الوصول (وصف الأشياء للمستخدمين ضعاف البصر).
- التنفيذ: التقط إطار كاميرا (OpenCV
cv2.VideoCapture(0).read())، احفظه بصيغة JPEG، مرره إلى VLM مع النص المفرَّغ من Whisper. - أفضل النماذج: LLaVA 1.6 7B أو Llama 3.2 Vision 11B لفهم الكائنات والمشاهد العامة.
- التأخير: 3–6 ثوانٍ لالتقاط الصورة + معالجة VLM + LLM + TTS على RTX 4070. قلله باستخدام VLM أصغر (Moondream 2 لتحديد الكائنات البسيطة).
حالة الاستخدام 3: نسخ الاجتماعات + تحليل الشرائح
شغِّل Whisper باستمرار خلال الاجتماع لبناء نص مفرَّغ، مع التقاط لقطات شاشة للشرائح بصفة دورية لتحليل VLM. في النهاية، ادمج النص المفرَّغ + محتوى الشرائح للحصول على ملخص محلي وبنود عمل — صفر سحابة، صفر تعرض للبيانات.
- STT: شغِّل faster-whisper في وضع البث خلال الاجتماع. اجمع المقاطع في مخزن مؤقت للنص المفرَّغ.
- الرؤية: في كل مرة تظهر شريحة جديدة (اكتشف بالتفاضل بين لقطات الشاشة)، التقط لقطة شاشة ومررها إلى LLaVA للوصف.
- الدمج: في نهاية الاجتماع (أو عند الطلب)، مرر النص المفرَّغ + أوصاف الشرائح إلى Llama 3.3 8B: "لخِّص هذا الاجتماع وسرد بنود العمل. إليك النص المفرَّغ: [...]. إليك محتوى الشرائح: [...]."
- المخرجات: ملخص يُقرأ بصوت عالٍ (Piper TTS) + ملف نصي محفوظ محليًا.
- قيمة اللائحة العامة لحماية البيانات: معالجة الاجتماع بالكامل محلية. لا يُرسَل صوت أو نص مفرَّغ أو شرائح إلى أي خدمة سحابية. متوافق مع السياقات القانونية والطبية والمؤسسية.
حالة الاستخدام 4: أداة إمكانية الوصول المحلية
يمكن لخط الأنابيب متعدد الوسائط المحلي أن يعمل كقارئ شاشة ومساعد واجهة مستخدم بالتحكم الصوتي للمستخدمين ذوي الإعاقات البصرية أو الحركية — يعمل دون اتصال بدون مخاوف خصوصية خدمات إمكانية الوصول السحابية.
- قارئ الشاشة: التقط لقطة شاشة كل ثانيتين ← يصف LLaVA محتوى الشاشة ← يقرؤها Piper بصوت عالٍ. أضف أوامر صوتية (Whisper) للتحكم في ما يُوصَف تاليًا.
- التنقل الصوتي: يُفرِّغ Whisper الأوامر الصوتية ← يفسر LLM القصد ← ينفذ إجراءات لوحة المفاتيح/الفأرة عبر pyautogui. لا يتطلب إنترنت.
- ميزة الخصوصية: يستخدم المستخدمون ذوو الإعاقات أدوات إمكانية الوصول في سياقات حساسة (بوابات طبية، حسابات مالية). تضمن الأداة المحلية عدم إرسال محتوى الشاشة إلى أطراف ثالثة.
- الاستخدام في ظل محدودية الاتصال: يعمل في المستشفيات والمباني الحكومية والمناطق ذات الإنترنت المقيد — مهم للنشر المؤسسي لإمكانية الوصول.
- اختيار النموذج لإمكانية الوصول: Moondream 2 لأوصاف الشاشة السريعة (2 غيغابايت VRAM، ~1 ثانية/إطار). LLaVA 7B لأوصاف أغنى (6 غيغابايت VRAM، ~3 ثوانٍ/إطار).
حالة الاستخدام 5: تحليل كاميرا الأمان المحلية
التقط إطارات من كاميرا IP، شغِّل كشف الحركة محليًا، وفعِّل تحليل VLM فقط عند اكتشاف الحركة — دون خدمات كاميرا سحابية أو تخزين فيديو تابع لطرف ثالث.
- التقاط الإطارات: استخدم OpenCV لالتقاط إطار كل 5–10 ثوانٍ من كاميرا IP عبر RTSP (
cv2.VideoCapture("rtsp://camera-ip:554/stream")). للكاميرات USB، استخدم فهرس الجهاز 0. - كشف الحركة: احسب الفرق بين الإطارات المتتالية باستخدام
cv2.absdiff(). تجاهل الإطارات التي تقل عن حد الحركة — هذا يتجنب استدعاءات VLM غير الضرورية على المشاهد الساكنة. - تحليل VLM: عند اكتشاف الحركة، أرسل الإطار إلى VLM: "صف ما يحدث. هل يوجد شخص؟ ماذا يفعل؟"
- مخرجات التنبيه: إذا أشارت الاستجابة إلى شخص أو خلل، فعِّل إشعار سطح المكتب المحلي وإعلان Piper TTS ("تم اكتشاف شخص عند الباب الأمامي"). لا تتطلب خدمة إشعارات سحابية.
- ميزة الخصوصية: ترسل Ring وNest مقاطع الفيديو إلى خوادم AWS وGoogle على التوالي. يحتفظ هذا الإعداد بجميع اللقطات على أجهزتك — بدون اشتراك، بدون تخزين فيديو تابع لطرف ثالث، بدون مشاركة بيانات مع خدمات خارجية.
- أفضل VLM للسرعة: Moondream 2 لمعالجة الإطارات السريعة (~1 ثانية/إطار، ~2 غيغابايت VRAM) أو LLaVA 7B لأوصاف مشهد أغنى (~3 ثوانٍ/إطار، ~6 غيغابايت VRAM).
- ملاحظة الأجهزة: يستهلك Mac Mini M5 مخصص (~600 دولار) يُشغِّل هذه المجموعة 24/7 ما بين ~15–25 واط في وضع الخمول — أقل كهرباءً سنويًا من اشتراك Ring Doorbell Pro.
بناء منسِّق Python
يوجِّه منسِّق Python غير متزامن المدخلات إلى النموذج الصحيح ويجمع المخرجات. يتيح استخدام asyncio تشغيل STT ومعالجة الرؤية بشكل متوازٍ.
#!/usr/bin/env python3
"""Local multimodal orchestrator: voice + vision + text, all offline."""
import asyncio
import base64
import subprocess
import tempfile
import sounddevice as sd
import soundfile as sf
import numpy as np
import requests
OLLAMA_URL = "http://localhost:11434/api/generate"
WHISPER_BIN = "./whisper.cpp/main"
WHISPER_MODEL = "./whisper.cpp/models/ggml-small.bin"
VISION_MODEL = "llava:7b" # or "llama3.2-vision" for combined VLM+LLM
TEXT_MODEL = "llama3.1:8b"
PIPER_VOICE = "voices/en_US-lessac-medium.onnx"
SAMPLE_RATE = 16000
async def transcribe_audio(audio: np.ndarray) -> str:
"""Convert audio array to text using whisper.cpp."""
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:
sf.write(f.name, audio, SAMPLE_RATE)
loop = asyncio.get_event_loop()
result = await loop.run_in_executor(None, lambda: subprocess.run(
[WHISPER_BIN, "-m", WHISPER_MODEL, "-f", f.name, "--no-timestamps", "--no-prints"],
capture_output=True, text=True
))
return result.stdout.strip()
async def describe_image(image_path: str) -> str:
"""Get text description of an image using local VLM via Ollama."""
with open(image_path, "rb") as f:
image_b64 = base64.b64encode(f.read()).decode("utf-8")
loop = asyncio.get_event_loop()
response = await loop.run_in_executor(None, lambda: requests.post(
OLLAMA_URL,
json={
"model": VISION_MODEL,
"prompt": "Describe the content of this image in detail, including any text visible.",
"images": [image_b64],
"stream": False,
},
))
return response.json()["response"]
async def reason(transcript: str, image_description: str | None = None) -> str:
"""Generate a response combining transcript and optional image description."""
if image_description:
prompt = (
f"The user asked (via voice): {transcript}\n\n"
f"The image shows: {image_description}\n\n"
"Answer the question based on the image content. Be concise — 2-3 sentences."
)
else:
prompt = transcript
# Note: /api/generate is for single-turn queries.
# For multi-turn conversation with context, use
# /api/chat with a messages array instead.
loop = asyncio.get_event_loop()
response = await loop.run_in_executor(None, lambda: requests.post(
OLLAMA_URL,
json={"model": TEXT_MODEL, "prompt": prompt, "stream": False},
))
return response.json()["response"]
async def speak(text: str) -> None:
"""Convert text to speech using Piper TTS."""
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:
await asyncio.get_event_loop().run_in_executor(None, lambda: subprocess.run(
f'echo "{text}" | piper --model {PIPER_VOICE} --output_file {f.name}',
shell=True, check=True
))
data, sr = sf.read(f.name)
sd.play(data, sr)
sd.wait()
async def process_query(audio: np.ndarray, image_path: str | None = None) -> None:
"""Process a multimodal query: transcribe audio and optionally describe image in parallel."""
if image_path:
# Run STT and vision in parallel
transcript, image_desc = await asyncio.gather(
transcribe_audio(audio),
describe_image(image_path),
)
else:
transcript = await transcribe_audio(audio)
image_desc = None
if not transcript or len(transcript) < 3:
return
print(f"You: {transcript}")
if image_desc:
print(f"Image: {image_desc[:100]}...")
response = await reason(transcript, image_desc)
print(f"Assistant: {response}")
await speak(response)
async def main():
print("Multimodal assistant ready. Ctrl+C to stop.")
while True:
audio = sd.rec(int(5 * SAMPLE_RATE), samplerate=SAMPLE_RATE, channels=1, dtype="int16")
sd.wait()
await process_query(audio) # Pass image_path="photo.jpg" for image queries
if __name__ == "__main__":
asyncio.run(main())تحسين الأداء
التحسينات الرئيسية لتحقيق تأخير مقبول على المجموعة متعددة الوسائط الكاملة:
📍 في جملة واحدة
أكبر تحسينَين: (1) تشغيل STT وVLM بالتوازي باستخدام asyncio عند توفر كلٍّ من الصوت والصورة، و(2) بث مخرجات LLM إلى TTS جملةً جملة حتى يبدأ الصوت قبل أن ينتهي LLM.
💬 بعبارات بسيطة
بدون تعددية: STT (0.5 ث) + VLM (3 ث) + LLM (1 ث) + TTS (0.1 ث) = 4.6 ث إجمالًا. مع STT + VLM متوازيَين: max(0.5 ث، 3 ث) + LLM (1 ث) + TTS (0.1 ث) = 4.1 ث. أضف بث TTS ويسمع المستخدم الصوت عند 3.5 ث بدلًا من 4.6 ث.
- STT + VLM متوازيَان: استخدم
asyncio.gather(transcribe_audio(), describe_image())لتشغيل كليهما في آنٍ واحد. يوفر 0.3–2 ثانية حسب حجم نموذج STT. - أبقِ النماذج دافئة: يحتفظ Ollama بالنماذج تلقائيًا في VRAM بين الطلبات. يبقى whisper.cpp في وضع البث محمَّلًا. لا تُعد التحميل بين الاستعلامات أبدًا.
- ابث LLM ← TTS: اكتشف حدود الجمل في مخرجات LLM المُبثَّثة (
.،!،?). مرر كل جملة مكتملة إلى Piper بينما يواصل LLM التوليد. - إدارة VRAM: إذا كانت إجمالي VRAM ضيقة، ألغِ تحميل VLM بعد معالجة الصورة (نقطة نهاية HTTP الحذف في Ollama) قبل تحميل LLM النصي. يضيف ~2–3 ثوانٍ لكن يتيح لـ GPU بسعة 8 غيغابايت التعامل مع المجموعة الكاملة.
- استخدم Llama 3.2 Vision كـ VLM + LLM مدمجَين: يلغي عبء التبديل بين النماذج كليًا — نموذج واحد يتولى وصف الرؤية والاستدلال النصي معًا. المقايضة: أداء أضعف قليلًا في الاستدلال النصي الخالص مقارنةً بـ Llama 3.3 8B المخصص.
- هدف أول صوت TTS: يُولِّد Piper أول صوت في غضون 50–100 مللي ثانية من استلام النص. ابث جملة واحدة في كل مرة لتأخير TTS مُدرَك دون ثانية.
القيود والتقييم الصادق
خط الأنابيب متعدد الوسائط المحلي ليس GPT-5.5. الوضوح بشأن الفجوات يمنع الإحباط ويساعد في التصميم حول القيود.
- درزات الوسائط: تُسلسَل مخرجات الرؤية إلى نص قبل تمريرها إلى LLM النصي. لا يمكن لـ LLM الاستدلال مباشرةً على ميزات الصورة — يستدل على وصف نصي للصورة. يفقد هذا معلومات للمهام التي تتطلب استدلالًا بصريًا دقيقًا.
- لا فيديو في الوقت الفعلي: تعالج VLMs المحلية الإطارات الفردية، وليس الفيديو المستمر. للفيديو، استخرج الإطارات بمعدل 0.5–2 إطار/ثانية وعالجها بشكل متسلسل. هذا يعني أنك لا تستطيع السؤال "ماذا حدث للتو في آخر 5 ثوانٍ من هذا الفيديو".
- فجوة جودة VLM: نماذج الرؤية المحلية (LLaVA 7B، Llama 3.2 Vision 11B) متأخرة عن GPT-5.5 Vision في الرسوم البيانية المعقدة والنص المكتوب بخط اليد والمشاهد الغامضة والمهام التي تتطلب معرفة واسعة بالعالم إلى جانب فهم الرؤية.
- ضغط VRAM: تشغيل ثلاثة نماذج في آنٍ واحد على GPU واحدة يتطلب إدارة دقيقة لـ VRAM. على وحدات GPU بسعة 12 غيغابايت أنت عند الحد — يجب اختيار أحجام النماذج بعناية لتجنب أخطاء OOM (نفاد الذاكرة).
- التأخير مقابل السحابة: تستغرق استدعاء متعدد الوسائط السحابي (GPT-5.5) 1–3 ثوانٍ للصوت + الصورة + النص. يستغرق خط الأنابيب المحلي 3–8 ثوانٍ على أجهزة مماثلة — أبطأ، لكن مع خصوصية كاملة وتكلفة صفر لكل استعلام.
- الاتساق: تُنتج النماذج المحلية جودة مخرجات أكثر تفاوتًا من النماذج السحابية ذات RLHF الموسّع. توقع هلوسات عرضية في كلٍّ من أوصاف الرؤية واستجابات LLM.
الأسئلة الشائعة
هل يمكنني استخدام نموذج واحد لكلٍّ من الرؤية والاستدلال النصي؟
نعم. يتولى Llama 3.2 Vision 11B فهم الصور والاستدلال النصي معًا في نموذج واحد — يمكنك تخطي إعداد LLaVA + Llama 3.3 8B المنفصل. يقلل هذا VRAM من ~15 غيغابايت إلى ~8 غيغابايت ويلغي استدعاء Ollama API إضافيًا. المقايضة هي أداء أضعف قليلًا في مهام الاستدلال النصي الخالص مقارنةً بـ Llama 3.3 8B المخصص.
كيف أتعامل مع إدخال الفيديو في خط الأنابيب متعدد الوسائط المحلي؟
استخرج الإطارات من الفيديو باستخدام OpenCV (cv2.VideoCapture) وعالج كل إطار بشكل فردي عبر VLM. لفيديو مدته دقيقة واحدة بمعدل 1 إطار/ثانية، تحصل على 60 إطارًا — كل منها يستغرق 2–5 ثوانٍ للمعالجة، لذا سيستغرق الفيديو الكامل 2–5 دقائق للتحليل. لمراقبة الفيديو في الوقت الفعلي، عالج إطارًا واحدًا فقط كل 2–3 ثوانٍ واستخدم كشف الحركة لتخطي الإطارات الساكنة. فهم الفيديو الكامل (تتبع الكائنات عبر الإطارات، فهم التسلسلات الزمنية) يتجاوز قدرات VLMs المحلية الحالية.
ما هو الحد الأدنى من VRAM في GPU للمجموعة متعددة الوسائط الكاملة؟
في إعداد VRAM مشترك (جميع النماذج في VRAM في آنٍ واحد)، يُطلب 15 غيغابايت لـ Whisper large-v3 + LLaVA 7B + Llama 3.3 8B. مع Llama 3.2 Vision 11B الذي يحل محل كلٍّ من VLM وLLM النصي، تكفي 8 غيغابايت VRAM. على GPU بسعة 12 غيغابايت (RTX 4070)، يمكنك تشغيل مجموعة النماذج المنفصلة الكاملة بـ VRAM ضيقة جدًا مع تكميم صغير، أو استخدام Llama 3.2 Vision 11B للنهج المدمج. على 8 غيغابايت VRAM (RTX 4060)، استخدم Llama 3.2 Vision 11B مع تكميم مكثف (Q3_K) أو تبادل النماذج بين استعلامات الرؤية والنص.
هل يمكن لخط الأنابيب متعدد الوسائط معالجة ملفات PDF؟
ليس مباشرةً — تقبل VLMs المحلية إدخال الصور، وليس ملفات PDF. حوِّل صفحات PDF إلى صور أولًا باستخدام pdf2image (pip install pdf2image) أو pypdfium2 (pip install pypdfium2). ثم مرر كل صورة صفحة إلى VLM بشكل منفصل. لملف PDF من 10 صفحات، تُولِّد 10 أوصاف صور منفصلة، ثم تمرر جميع الأوصاف إلى LLM النصي للتحليل أو الملخص المدمج. هذا أبطأ من دعم PDF الأصلي لكن يُنتج نتائج جيدة على المستندات المنظمة.
هل خط الأنابيب متعدد الوسائط المحلي متوافق مع اللائحة العامة لحماية البيانات للاستخدام الطبي أو القانوني؟
خط الأنابيب متعدد الوسائط المحلي الذي يُولِّد حركة مرور شبكية صفرية أثناء التشغيل متوافق بطبيعة تصميمه لحالات الاستخدام الداخلية — لا تتطلب اتفاقية معالجة بيانات لأنه لا تغادر بيانات شخصية أنظمتك. للتحقق من التوافق: شغِّل Wireshark أثناء التشغيل وتأكد من وجود صفر حزم صادرة من عملية خط الأنابيب. يُعدّ التخزين مهمًا أيضًا — إذا خزَّن منسِّقك سجلات المحادثات أو ملفات الصور، فإن تلك المخازن تخضع لمتطلبات الاحتفاظ بالبيانات. استخدم تخزينًا مؤقتًا في الذاكرة أو تخزينًا محليًا مشفرًا مع سياسات احتفاظ مناسبة.
هل يمكنني إضافة بحث على الويب إلى خط الأنابيب متعدد الوسائط؟
نعم. أضف خطوة بحث بين المنسِّق وLLM النصي. استخدم DuckDuckGo API أو نظام RAG محلي (AnythingLLM، PrivateGPT) لاسترداد السياق قبل خطوة استدلال LLM. يستدل LLM بعد ذلك على النص المفرَّغ + وصف الصورة + نتائج البحث مجتمعةً. يضيف هذا 0.5–2 ثانية إلى التأخير لكنه يتيح الإجابة على أسئلة الأحداث الراهنة إلى جانب التحليل البصري.
كم تستهلك المجموعة متعددة الوسائط الكاملة من الكهرباء عند التشغيل 24/7؟
في وضع الخمول مع النماذج الدافئة في VRAM: ~50–80 واط (GPU سطح المكتب)، ~15–25 واط (Mac Mini M5 Pro). المعالجة النشطة: ~150–300 واط (GPU سطح المكتب)، ~30–60 واط (Mac Mini M5 Pro). التكلفة الشهرية بسعر $0.15/كيلوواط ساعة: تقريبًا $5–15 (Mac Mini) أو $15–35 (سطح المكتب). هذا أقل من تشغيل API سحابية بأحجام استعلامات مماثلة — Mac Mini يُشغِّل المجموعة الكاملة 24/7 يكلف كهرباءً أقل شهريًا من يومَين باستخدام API لـ GPT-5.5 بمعدل 100 استعلام/يوم.
المصادر
- whisper.cpp على GitHub — مصدر مكوِّن STT وتوثيقه.
- faster-whisper على GitHub — بديل STT بلغة Python مع VAD مدمج للبث.
- صفحة مشروع LLaVA — بنية نموذج الرؤية وبطاقات النموذج.
- بطاقة نموذج Llama 3.2 Vision — النموذج متعدد الوسائط من Meta الذي يدعم استدلال الصورة + النص.
- توثيق Ollama — API نماذج الرؤية، تنسيق الطلبات متعددة الوسائط.
- Piper TTS على GitHub — مكوِّن إخراج TTS، مكتبة حزم الأصوات.
- Coqui TTS على GitHub — TTS بديل مع دعم استنساخ الصوت.