Nodes and media
وضع التحدث
لدى وضع Talk شكلان تشغيليان وقت التشغيل:
- يستخدم Talk الأصلي على macOS/iOS/Android التعرف المحلي على الكلام، ودردشة Gateway، وTTS عبر
talk.speak. تعلن العُقد قدرةtalkوتصرّح بأوامرtalk.*التي تدعمها. - يستخدم Talk على iOS WebRTC المملوك للعميل لتكوينات OpenAI الفورية التي تختار
webrtcأو تحذف النقل. تبقى تكويناتgateway-relayوprovider-websocketالصريحة وتكوينات realtime غير التابعة لـ OpenAI على المرحّل المملوك لـ Gateway؛ وتستخدم التكوينات غير الفورية حلقة الكلام الأصلية. - يستخدم Talk في المتصفح
talk.client.createلجلساتwebrtcوprovider-websocketالمملوكة للعميل، أوtalk.session.createلجلساتgateway-relayالمملوكة لـ Gateway. إنmanaged-roomمحجوزة لتسليم Gateway وغرف أجهزة اللاسلكي. - يمكن لـ Talk على Android الاشتراك في جلسات المرحّل الفورية المملوكة لـ Gateway باستخدام
talk.realtime.mode: "realtime"وtalk.realtime.transport: "gateway-relay". وإلا يبقى على التعرف الأصلي على الكلام، ودردشة Gateway، وtalk.speak. - يستخدم العملاء المخصصون للتفريغ النصي فقط
talk.session.create({ mode: "transcription", transport: "gateway-relay", brain: "none" })، ثمtalk.session.appendAudioوtalk.session.cancelTurnوtalk.session.closeعندما يحتاجون إلى تسميات توضيحية أو إملاء من دون استجابة صوتية من المساعد.
Talk الأصلي هو حلقة محادثة صوتية مستمرة:
- الاستماع للكلام
- إرسال النص المفرغ إلى النموذج عبر الجلسة النشطة
- انتظار الاستجابة
- نطقها عبر مزود Talk المكوّن (
talk.speak)
يمرر Talk الفوري المملوك للعميل استدعاءات أدوات المزود عبر talk.client.toolCall؛ ولا يستدعي هؤلاء العملاء chat.send مباشرة للاستشارات الفورية.
أثناء نشاط استشارة فورية، يمكن لعملاء Talk استخدام talk.client.steer أو
talk.session.steer لتصنيف الإدخال المنطوق إلى status أو steer أو cancel أو
followup. تُضاف التوجيهات المقبولة إلى قائمة انتظار التشغيل المضمّن النشط؛ أما
التوجيهات المرفوضة فتعيد سببًا منظّمًا مثل no_active_run أو not_streaming
أو compacting.
يصْدر Talk المخصص للتفريغ النصي فقط غلاف أحداث Talk العام نفسه مثل جلسات realtime وSTT/TTS، لكنه يستخدم mode: "transcription" وbrain: "none". وهو مخصص للتسميات التوضيحية، والإملاء، والتقاط الكلام للمراقبة فقط؛ أما الملاحظات الصوتية المرفوعة لمرة واحدة فما زالت تستخدم مسار الوسائط/الصوت.
السلوك (macOS)
- تراكب دائم التشغيل أثناء تمكين وضع Talk.
- انتقالات المراحل Listening → Thinking → Speaking.
- عند توقف قصير (نافذة صمت)، يُرسل النص المفرغ الحالي.
- تُكتب الردود إلى WebChat (كما لو كانت كتابة).
- المقاطعة عند الكلام (مفعلة افتراضيًا): إذا بدأ المستخدم التحدث بينما يتكلم المساعد، نوقف التشغيل ونسجل الطابع الزمني للمقاطعة لاستخدامه في الموجه التالي.
توجيهات الصوت في الردود
يمكن للمساعد أن يسبق رده بـ سطر JSON واحد للتحكم في الصوت:
{ "voice": "<voice-id>", "once": true }القواعد:
- السطر الأول غير الفارغ فقط.
- تُتجاهل المفاتيح غير المعروفة.
- يطبق
once: trueعلى الرد الحالي فقط. - من دون
once، يصبح الصوت هو الافتراضي الجديد لوضع Talk. - يُزال سطر JSON قبل تشغيل TTS.
المفاتيح المدعومة:
voice/voice_id/voiceIdmodel/model_id/modelIdspeed,rate(WPM),stability,similarity,style,speakerBoostseed,normalize,lang,output_format,latency_tieronce
التكوين (~/.openclaw/openclaw.json)
{ talk: { provider: "elevenlabs", providers: { elevenlabs: { voiceId: "elevenlabs_voice_id", modelId: "eleven_v3", outputFormat: "mp3_44100_128", apiKey: "elevenlabs_api_key", }, mlx: { modelId: "mlx-community/Soprano-80M-bf16", }, system: {}, }, speechLocale: "ru-RU", silenceTimeoutMs: 1500, interruptOnSpeech: true, realtime: { provider: "openai", providers: { openai: { apiKey: "openai_api_key", model: "gpt-realtime-2", voice: "cedar", }, }, instructions: "Speak warmly and keep answers brief.", mode: "realtime", transport: "webrtc", brain: "agent-consult", }, },}القيم الافتراضية:
interruptOnSpeech: truesilenceTimeoutMs: عند عدم تعيينها، يحافظ Talk على نافذة التوقف الافتراضية للمنصة قبل إرسال النص المفرغ (700 ms on macOS and Android, 900 ms on iOS)provider: يحدد مزود Talk النشط. استخدمelevenlabsأوmlxأوsystemلمسارات التشغيل المحلية على macOS.providers.<provider>.voiceId: يرجع إلىELEVENLABS_VOICE_ID/SAG_VOICE_IDلـ ElevenLabs (أو أول صوت ElevenLabs عندما يكون مفتاح API متاحًا).providers.elevenlabs.modelId: القيمة الافتراضية هيeleven_v3عند عدم تعيينها.providers.mlx.modelId: القيمة الافتراضية هيmlx-community/Soprano-80M-bf16عند عدم تعيينها.providers.elevenlabs.apiKey: يرجع إلىELEVENLABS_API_KEY(أو ملف تعريف صدفة Gateway إذا كان متاحًا).consultThinkingLevel: تجاوز اختياري لمستوى التفكير لتشغيل وكيل OpenClaw الكامل خلف استدعاءاتopenclaw_agent_consultالفورية.consultFastMode: تجاوز اختياري للوضع السريع لاستدعاءاتopenclaw_agent_consultالفورية.realtime.provider: يحدد مزود الصوت الفوري النشط. استخدمopenaiلـ WebRTC، أوgoogleلـ WebSocket المزود، أو مزودًا مخصصًا للجسر فقط عبر مرحّل Gateway.realtime.providers.<provider>يخزن تكوين realtime المملوك للمزود. يتلقى المتصفح بيانات اعتماد جلسة مؤقتة أو مقيدة فقط، وليس مفتاح API قياسيًا أبدًا.realtime.providers.openai.voice: معرّف صوت OpenAI Realtime مدمج. أصواتgpt-realtime-2الحالية هيalloyوashوballadوcoralوechoوsageوshimmerوverseوmarinوcedar؛ ويوصى بـmarinوcedarللحصول على أفضل جودة.realtime.transport: يستخدمwebrtcWebRTC الخاص بـ OpenAI المملوك للعميل على iOS وفي المتصفح. إنprovider-websocketمملوك للمتصفح لكنه يبقى على مرحّل Gateway على iOS. يحافظgateway-relayعلى صوت المزود على Gateway؛ يستخدم Android realtime لهذا النقل فقط، وإلا يحافظ على حلقة STT/TTS الأصلية.realtime.brain: يوجّهagent-consultاستدعاءات الأدوات الفورية عبر سياسة Gateway؛ وdirect-toolsهو سلوك توافق قديم للأدوات المباشرة؛ وnoneمخصص للتفريغ النصي أو التنسيق الخارجي.realtime.consultRouting: يحافظprovider-directعلى الرد المباشر للمزود عندما يتخطىopenclaw_agent_consult؛ أماforce-agent-consultفيجعل مرحّل Gateway يوجّه النصوص المفرغة النهائية للمستخدم عبر OpenClaw بدلًا من ذلك.realtime.instructions: يضيف تعليمات نظام موجهة للمزود إلى موجه realtime المدمج في OpenClaw. استخدمه لأسلوب الصوت ونبرته؛ ويحافظ OpenClaw على إرشاداتopenclaw_agent_consultالافتراضية.- يعرض
talk.catalogمعرّفات المزودين القياسية وأسماء السجل البديلة إلى جانب الأوضاع ووسائل النقل واستراتيجيات الدماغ وتنسيقات الصوت الفورية ورايات القدرات ونتيجة الجاهزية المختارة وقت التشغيل لكل مزود. يجب على عملاء Talk من الطرف الأول استخدام ذلك الكتالوج بدلًا من الحفاظ على أسماء مزودين بديلة محليًا؛ أما Gateway الأقدم الذي يحذف جاهزية المجموعة فهو غير متحقق منه بدلًا من أن يكون غير مكوّن بشكل قاطع. - تُكتشف مزودات التفريغ النصي المتدفقة عبر
talk.catalog.transcription. يستخدم مرحّل Gateway الحالي تكوين مزود بث المكالمات الصوتية إلى أن تُضاف واجهة تكوين التفريغ النصي المخصصة لـ Talk. speechLocale: معرّف لغة BCP 47 اختياري للتعرف على الكلام على الجهاز في Talk على iOS/macOS. اتركه غير معيّن لاستخدام الإعداد الافتراضي للجهاز.outputFormat: القيمة الافتراضية هيpcm_44100على macOS/iOS وpcm_24000على Android (عيّنmp3_*لفرض بث MP3)
واجهة macOS
- تبديل شريط القائمة: Talk
- تبويب التكوين: مجموعة Talk Mode (معرّف الصوت + تبديل المقاطعة)
- التراكب:
- Listening: نبضات سحابة مع مستوى الميكروفون
- Thinking: حركة غوص
- Speaking: حلقات متشعة
- النقر على السحابة: إيقاف الكلام
- النقر على X: الخروج من وضع Talk
واجهة Android
- تبديل تبويب الصوت: Talk
- إن Mic وTalk اليدويين هما وضعا التقاط وقت تشغيل متنافيان.
- يفضل Mic اليدوي وTalk الفوري ميكروفون سماعة Bluetooth Classic أو BLE متصلة. إذا انقطع الاتصال، يطلب التطبيق إدخال سماعة آخر أو يتيح لـ Android استخدام الميكروفون الافتراضي؛ ويؤدي إيقاف الالتقاط إلى استعادة تفضيل الميكروفون الافتراضي.
- يتوقف Mic اليدوي عندما يغادر التطبيق الواجهة الأمامية أو يغادر المستخدم تبويب الصوت.
- يستمر Talk Mode في العمل إلى أن يُعطّل أو تنقطع عقدة Android، ويستخدم نوع خدمة المقدمة للميكروفون في Android أثناء نشاطه.
ملاحظات
- يتطلب أذونات الكلام + الميكروفون.
- يستخدم Talk الأصلي جلسة Gateway النشطة ولا يرجع إلى استطلاع السجل إلا عندما لا تكون أحداث الاستجابة متاحة.
- يستخدم Talk الفوري المملوك للعميل
talk.client.toolCallمن أجلopenclaw_agent_consultبدلًا من كشفchat.sendللجلسات المملوكة للمزود. - يستخدم Talk المخصص للتفريغ النصي فقط
talk.session.createوtalk.session.appendAudioوtalk.session.cancelTurnوtalk.session.close؛ ويشترك العملاء فيtalk.eventلتحديثات النص المفرغ الجزئية/النهائية. - يحل Gateway تشغيل Talk عبر
talk.speakباستخدام مزود Talk النشط. يرجع Android إلى TTS النظام المحلي فقط عندما لا يكون RPC ذلك متاحًا. - يستخدم تشغيل MLX المحلي على macOS المساعد المضمّن
openclaw-mlx-ttsعند وجوده، أو ملفًا تنفيذيًا علىPATH. عيّنOPENCLAW_MLX_TTS_BINللإشارة إلى ملف مساعد تنفيذي مخصص أثناء التطوير. - تُتحقق قيمة
stabilityلـeleven_v3لتكون0.0أو0.5أو1.0؛ وتقبل النماذج الأخرى0..1. - تُتحقق قيمة
latency_tierلتكون0..4عند تعيينها. - يدعم Android تنسيقات إخراج
pcm_16000وpcm_22050وpcm_24000وpcm_44100لبث AudioTrack منخفض الكمون.