الصورة الرمزية الخاصة بـ Andres Marafioti


بعد إنشاء Reachy Mini الخاص بك، ستقوم بتثبيت تطبيق المحادثة والبدء في التحدث إليه. حتى الآن، كان عليك إرسال الصوت إلى الخادم. ولكن ليس بعد الآن. سنرشدك اليوم خلال عملية تشغيل المكدس بالكامل محليًا.

يتم تشغيل هذه المكدس بواسطة speech-to-speech، خط أنابيب VAD → STT → LLM → TTS المتتالي الذي يكشف عن توافق Realtime API /v1/realtime WebSocket. بمجرد تشغيل الواجهة الخلفية، قم بتوجيه الروبوت إليها من واجهة المستخدم.

تعد Cascades الخيار الأكثر مرونة في مجال المصادر المفتوحة اليوم، ومع القطع المناسبة تكون أيضًا الأسرع. سوف نوصي بالمكونات التي نفضلها أكثر، ولكن الهدف الأساسي من التتالي هو أنه يمكنك تبديلها. نماذج جديدة تسقط كل أسبوع.

ليرة تركية؛ د

  • قم بنشر الواجهة الخلفية للكلام المحلي لجهاز Reachy Mini الخاص بك.
  • نحن نستخدم لدينا speech-to-speech المكتبة، نهج تتالي.
  • مُستَحسَن: llama.cpp مع جيما 4, سيليرو فاد, ببغاء-TDT 0.6B v3 STT, Qwen3-TTS.

بداية سريعة

ترشدك هذه المدونة خلال إجراء المحادثات مع Reachy Mini محليًا بالكامل. لا توجد سحابة، ولا مفاتيح API، ولا توجد بيانات تغادر جهازك. إليكم مقطع فيديو يظهر هذا على الهواء مباشرة:

خدمة LLM محليًا

لخدمة LLM، سوف نستخدم Hugging Face’s llama.cpp. إذا كنت بحاجة إلى تثبيته، فإن أبسط طريقة هي brew install llama.cpp أو winget install llama.cppلمزيد من المساعدة، راجع المستندات. أولاً، سنقوم بتشغيل:

llama-server -hf ggml-org/gemma-4-E4B-it-GGUF -np 2 -c 65536 -fa on --swa-full

وانتهى! في المرة الأولى التي سيتم فيها تنزيل النموذج، تكون عمليات الإطلاق اللاحقة سريعة.

ماذا تفعل تلك الأعلام؟
  • -hf ggml-org/gemma-4-E4B-it-GGUF – يسحب النموذج مباشرة من المحور. يتم تنزيله أولاً، بينما تستخدم عمليات التشغيل اللاحقة ذاكرة التخزين المؤقت.
  • -np 2 – فتحتان متوازيتان. يتيح للخادم التعامل مع الطلب الثاني (على سبيل المثال، انقطاع سريع) دون حظر الطلب الأول.
  • -c 65536 — نافذة سياق بحجم 64 كيلو بايت، مشتركة عبر الفتحات. مساحة كبيرة للمحادثات الطويلة.
  • -fa on — فلاش الاهتمام. ذاكرة أسرع وأقل، وهي مجانية بشكل أساسي على الأجهزة الحديثة.
  • --swa-full – يحتفظ بذاكرة التخزين المؤقت الكاملة للنافذة المنزلقة بدلاً من إعادة حسابها. استبدل القليل من ذاكرة الوصول العشوائي (RAM) للحصول على معالجة سريعة بشكل ملحوظ على Gemma.

إعداد تحويل الكلام إلى كلام

سنبدأ بمجرد تثبيت المكتبة

uv pip install speech-to-speech

بعد ذلك، بينما نخدم LLM في محطة أخرى، يمكننا ببساطة تشغيل:

speech-to-speech --responses_api_base_url "http://127.0.0.1:8080" --responses_api_api_key "" --mode local

ويمكنك البدء في التحدث إلى العارضة من خلال جهازك الطرفي! في المرة الأولى، سيحتاج إلى تنزيل Parakeet-TDT 0.6B v3 وQwen3TTS، لكن عمليات الإطلاق اللاحقة تكون سريعة.

إليك مقطع فيديو يوضح وضع المحادثة المحلية:

والآن بعد أن جربته --mode local، يمكنك تشغيل الأمر مرة أخرى دون هذا الخيار لخدمة تحويل الكلام إلى كلام للروبوت.

ربط Reachy Mini بميزة تحويل الكلام إلى كلام

بمجرد تشغيل llama.cpp وتحويل الكلام إلى كلام، يمكنك تشغيل الروبوت باستخدام تطبيق سطح المكتب وتشغيل تطبيق المحادثة. في واجهة المستخدم من تطبيق المحادثة، تحتاج إلى اختيار الوضع المحلي من خلال النقر على “تحرير الاتصال” في الواجهة الخلفية لـ HF. إليك مقطع فيديو يوضح كيفية القيام بذلك:

لقد انتهيت. يمكنك البدء في التحدث إلى الروبوت الخاص بك. كل مرحلة من مراحل خط الأنابيب عبارة عن مقايضة: هناك نماذج TTS أسرع بجودة أقل، ونماذج STT أبطأ بجودة أعلى. لقد قمنا بالتحسين للغة متعددة، وقد ترغب في التحسين للغة واحدة. يغطي باقي المدونة كيفية التخصيص.

الذهاب أعمق

لماذا تقوم بتشغيل خادم تحويل الكلام إلى كلام الخاص بك؟

تعد الواجهات الخلفية المستضافة في الوقت الفعلي ملائمة، ولكن تشغيل المحرك الخاص بك يفتح ثلاثة أشياء:

  • خصوصية. لا يغادر الصوت شبكتك أبدًا، بل يتم تشغيل المسار بالكامل على الأجهزة التي تتحكم فيها.
  • لا توجد تكاليف API. لا توجد رسوم لكل دقيقة أو لكل رمز.
  • السيطرة الكاملة على خط الأنابيب. قم بتبديل أي قطعة: VAD، STT، LLM، TTS. كلما وصل شيء أفضل إلى المركز 🤗.

ال speech-to-speech يمنحك الريبو كل ذلك في سطر أوامر واحد. يقوم بتشغيل خادم WebSocket في /v1/realtime الذي يتحدث نفس البروتوكول الذي يعرفه Reachy Mini بالفعل كيفية التحدث إليه.

الإعدادات الافتراضية لدينا: VAD، STT، TTS

يتكون خط أنابيب الصوت المتتالي من أربع مراحل: VAD، وSTT، وLLM، وTTS. بالنسبة لثلاثة منها، نختار الإعدادات الافتراضية الصلبة حتى تتمكن من التركيز على ماجستير إدارة الأعمال:

منصة خيار لماذا
مساعدة القيمة المضافة سيليرو فاد v5 صغير ودقيق ويعمل على وحدة المعالجة المركزية. الافتراضي الفعلي في عالم الوكيل الصوتي مفتوح المصدر.
ست ببغاء-TDT 0.6B v3 سهل البث وسريع جدًا وجودة رائعة باللغة الإنجليزية.
تحويل النص إلى كلام Qwen3-TTS معبر، منخفض الكمون، متعدد اللغات، يدعم الأصوات المخصصة.

نحن لدينا آراء بشأن هذه الاختيارات، فلا تتردد في استبدالها باختياراتك الخاصة إذا كان لديك تفضيل.

اختيار LLM الخاص بك

LLM هي الطبقة ذات التأثير الأكبر على زمن الوصول والأداء العام للنظام. نحن نؤيد خيارين: تشغيل النموذج محليًا (llama.cpp، MLX، المحولات، vLLM)، أو استخدم خادمًا مزودًا بواجهة برمجة تطبيقات الردود (OpenAI، وGemini، ونقاط نهاية استدلال HF، وllama.cpp، وvLLM، وما إلى ذلك).

واجهة برمجة تطبيقات الردود: فصل الدماغ عن الحلقة الصوتية

عنق الزجاجة الرئيسي في النظام هو زمن استدلال LLM. ولمعالجة ذلك، نحن ندعم محركات الاستدلال الخارجية التي يتم الكشف عنها من خلال بروتوكول Responses API.

ال speech-to-speech لذلك يدعم المحرك الوضع الثاني حيث تعيش LLM في عملية منفصلة طالما أنها تتحدث عن بروتوكول Responses API. يمكنك تشغيل خادم النموذج الخاص بك في محطة واحدة، وتشغيل الحلقة الصوتية في محطة طرفية أخرى، ويتحدث الاثنان عبر HTTP.

الخيار 1: llama.cpp في أحد الطرفين، وتحويل الكلام إلى كلام في الطرف الآخر

المحطة 1: خادم llama.cpp:

llama-server -hf ggml-org/gemma-4-E4B-it-GGUF -np 2 -c 65536 -fa on --swa-full

المحطة 2: عميل تحويل الكلام إلى كلام:

speech-to-speech \
  --mode realtime \
  --stt parakeet-tdt \
  --tts qwen3 \
  --llm_backend responses-api \
  --model_name "ggml-org/gemma-4-E4B-it-GGUF" \
  --responses_api_base_url "http://127.0.0.1:8080/v1"

الخيار 2: vLLM في محطة واحدة، وتحويل الكلام إلى كلام في الطرف الآخر

يتطلب vLLM ≥ 0.21.0. الدعم الكامل لبروتوكول Responses API، بما في ذلك تدفق استدعاءات الأداة الذي تستخدمه الواجهة الخلفية لتحويل الكلام إلى كلام، وصل إلى vLLM 0.21.0. سيتم تشغيل الإصدارات الأقدم ولكنها تتعثر بمجرد أن يحاول المساعد استدعاء الأداة.

عند تقديم نموذج من خلال vLLM لخط الأنابيب هذا، يلزم وجود ثلاث علامات بشكل فعال:

  • --enable-auto-tool-choice
  • --tool-call-parser <tool_parser_name> – يختار المحلل اللغوي لكل عائلة الذي يحول المخرجات الأولية للنموذج إلى استدعاءات أدوات منظمة (على سبيل المثال qwen3_coder لنماذج تعليمات Qwen3، llama3_json للاما 3, hermes لنماذج هيرميس، …).
  • --default-chat-template-kwargs '{"enable_thinking":false}' : تعطيل <think> قناة المنطق للنماذج التي تدعمها. بالنسبة للمهام الوكيلة الأصعب، يمكنك قلب هذا إلى true ودع النموذج يفكر، ولكن بالنسبة للمحادثة ذات الشعور الطبيعي، نوصي بشدة بإيقاف تشغيلها: كل رمز تفكير مميز هو زمن الاستجابة الذي يسمعه المستخدم كصمت قبل أن يبدأ الروبوت في التحدث.

المحطة 1: خادم الاستدلال vLLM (Qwen/Qwen3-4B-Instruct-2507):

vllm serve Qwen/Qwen3-4B-Instruct-2507 \
  --port 8000 \
  --host 127.0.0.1 \
  --max-model-len 32768 \
  --enable-auto-tool-choice \
  --tool-call-parser qwen3_coder \
  --default-chat-template-kwargs '{"enable_thinking":false}' \
  --speculative-config '{"method":"qwen3_next_mtp","num_speculative_tokens":1}'

ال --speculative-config يتيح الخط إمكانية التنبؤ بالرموز المتعددة (MTP). إنها خياري، ولكن له تأثير كبير على زمن الوصول الشامل. اتركه عندما يدعمه النموذج.

المحطة 2: عميل تحويل الكلام إلى كلام:

speech-to-speech \
  --mode realtime \
  --stt parakeet-tdt \
  --tts qwen3 \
  --llm_backend responses-api \
  --model_name "Qwen/Qwen3-4B-Instruct-2507" \
  --responses_api_base_url "http://127.0.0.1:8000/v1"

الخيار 3: معانقة الوجه استنتاج نقاط النهاية

نفس البروتوكول، ولكن النموذج يعمل على وحدة معالجة الرسومات المُدارة على Hugging Face. انشر أي نموذج دردشة كنقطة نهاية للاستدلال، ثم قم بتوجيه الحلقة الصوتية إلى عنوان URL لنقطة النهاية:

speech-to-speech \
  --mode realtime \
  --stt parakeet-tdt \
  --tts qwen3 \
  --llm_backend responses-api \
  --model_name "Qwen/Qwen3-4B-Instruct-2507" \
  --responses_api_base_url "https://<your-endpoint>.endpoints.huggingface.cloud/v1" \
  --responses_api_api_key "$HF_TOKEN"

الخيار 4: معانقة موفري استدلال الوجه

إذا كنت لا تريد إدارة نقطة النهاية الخاصة بك، فاستخدم موفر الاستدلال. يقوم Hugging Face بتوجيه طلبك إلى واجهة خلفية خارجية (على سبيل المثال، Together، Fireworks، Replicate) باستخدام عنوان URL واحد:

speech-to-speech \
  --mode realtime \
  --stt parakeet-tdt \
  --tts qwen3 \
  --llm_backend responses-api \
  --model_name "Qwen/Qwen3.6-35B-A3B:deepinfra" \
  --responses_api_base_url "https://router.huggingface.co/v1" \
  --responses_api_api_key "$HF_TOKEN"

الخيار 5: OpenAI (أو أي مزود متوافق مع OpenAI)

عندما تريد الاختبار مقابل نموذج حدودي بدون أشعة تحت الحمراء، قم بتوجيه نفس العلامة إلى OpenAI:

speech-to-speech \
  --mode realtime \
  --stt parakeet-tdt \
  --tts qwen3 \
  --llm_backend responses-api \
  --model_name "gpt-5.4" \
  --responses_api_api_key "$OPENAI_API_KEY"

ال --responses_api_* تعمل العلامات بنفس الطريقة بالنسبة لأي مزود ينفذ البروتوكول (OpenRouter، Together، Fireworks، …). قم بتبديل عنوان URL الأساسي ومفتاح واجهة برمجة التطبيقات، وحافظ على تطابق بقية المسار.


تشغيل LLM قيد التشغيل

الخيار 1: LLM محلي في MLX (Apple Silicon)

إذا كنت تستخدم جهاز Mac، فإن MLX هي الطريقة الأقل احتكاكًا لتشغيل نموذج حقيقي بزمن انتقال معقول. نحن نوصي Qwen3-4B-Instruct-2507، وهو صغير بما يكفي ليشعر باللحظة على شرائح سلسلة M وقادر بما يكفي لإجراء محادثة.

speech-to-speech \
  --llm_backend mlx-lm \
  --model_name "mlx-community/Qwen3-4B-Instruct-2507-bf16"

الخادم يستمع ws://127.0.0.1:8765/v1/realtime بشكل افتراضي. اتركه قيد التشغيل، وقم بتوصيل تطبيق المحادثة بالواجهة الخلفية المحلية، وستتحدث إلى الروبوت الخاص بك.

الخيار 2: ماجستير محلي في المحولات (CUDA / CPU / MPS)

نفس الفكرة لكن باستخدام الفانيليا transformers. استخدم هذا إذا كنت تستخدم صندوق CUDA، أو Linux، أو إذا كنت تريد تبديل النماذج بحرية دون إعادة تحويل الأوزان لـ MLX.

speech-to-speech \
  --llm_backend transformers \
  --model_name "Qwen/Qwen3-4B-Instruct-2507"

نصيحة. Qwen3-4B-Instruct-2507 يعد خيارًا جيدًا آخر لـ LLM لأنه يوفر توازنًا جيدًا بين السرعة والجودة على وحدة معالجة الرسومات الخاصة بالمستهلك الواحد. يمكنك الإشارة --model_name في أي طراز HF تدعم الواجهة الخلفية – على سبيل المثال Gemma أو Qwen أو Mistral الأكبر.

تشغيل المحرك على الكمبيوتر المحمول الخاص بك، التطبيق على الروبوت

إذا كنت تقوم بتشغيل المحرك الصوتي على الكمبيوتر المحمول الخاص بك وتطبيق المحادثة على Reachy Mini Wireless، فإن الشيء الوحيد الذي يتغير هو عنوان URL. تأكد من أن المحرك يرتبط بعنوان LAN (وليس فقط 127.0.0.1) واستخدم عنوان IP الخاص بالكمبيوتر المحمول من الروبوت عند تحديد IP في واجهة المستخدم.

إذا كنت لا تعرف عنوان IP الخاص بك، فإليك كيفية العثور عليه:

ماك
ipconfig getifaddr en0    
ipconfig getifaddr en1    
لينكس
hostname -I
ويندوز
ipconfig

ابحث عن “عنوان IPv4” ضمن المحول النشط.

تريد 192.168.x.x أو 10.x.x.x واحد. إذا رأيت 169.254.x.x، فأنت لست موجودًا فعليًا على الشبكة.


اختتم

لديك الآن حلقة صوتية محلية بالكامل:

  • روبوت يستمع مع سيليرو,
  • النسخ مع ببغاء-TDT 0.6B v3,
  • التفكير في أي LLM تختاره، سواء كان ذلك MLX محليًا، أو Transformers محليًا، أو خادم vLLM أو llama.cpp المجاور، أو نقطة نهاية Responses API المستضافة،
  • والرد ب Qwen3-TTS.

نجم huggingface/speech-to-speech و pollen-robotics/reachy_mini_conversation_app، وتعال وأخبرنا في المناقشات عن السلسلة مفتوحة المصدر التي انتهى بك الأمر إلى تشغيلها على الروبوت الخاص بك.

شاركها.
اترك تعليقاً