Nodes and media
وضع التحدث
وضع التحدث له شكلان وقت التشغيل:
- يستخدم التحدث الأصلي على macOS/iOS/Android التعرف المحلي على الكلام، ودردشة Gateway، وTTS عبر
talk.speak. تعلن العُقد عن قدرةtalkوتصرّح بأوامرtalk.*التي تدعمها. - يستخدم التحدث في المتصفح
talk.client.createلجلساتwebrtcوprovider-websocketالمملوكة للعميل، أوtalk.session.createلجلساتgateway-relayالمملوكة لـ Gateway. أماmanaged-roomفهو محجوز لتسليم Gateway وغرف الضغط للتحدث. - يستخدم عملاء التفريغ النصي فقط
talk.session.create({ mode: "transcription", transport: "gateway-relay", brain: "none" })، ثمtalk.session.appendAudio، وtalk.session.cancelTurn، وtalk.session.closeعندما يحتاجون إلى تسميات توضيحية أو إملاء من دون استجابة صوتية من المساعد.
التحدث الأصلي هو حلقة محادثة صوتية مستمرة:
- الاستماع للكلام
- إرسال التفريغ النصي إلى النموذج عبر الجلسة النشطة
- انتظار الاستجابة
- نطقها عبر موفر التحدث المُعد (
talk.speak)
يمرر التحدث الفوري في المتصفح استدعاءات أدوات الموفر عبر talk.client.toolCall؛ لا يستدعي عملاء المتصفح chat.send مباشرة للاستشارات الفورية.
يبث التحدث المخصص للتفريغ النصي فقط غلاف أحداث التحدث الشائع نفسه كما في جلسات الوقت الفعلي وSTT/TTS، لكنه يستخدم mode: "transcription" وbrain: "none". وهو مخصص للتسميات التوضيحية والإملاء والتقاط الكلام للمراقبة فقط؛ أما الملاحظات الصوتية المرفوعة لمرة واحدة فلا تزال تستخدم مسار الوسائط/الصوت.
السلوك (macOS)
- طبقة علوية تعمل دائمًا أثناء تمكين وضع التحدث.
- انتقالات المراحل: الاستماع ← التفكير ← التحدث.
- عند توقف قصير (نافذة صمت)، يُرسل التفريغ النصي الحالي.
- تُكتب الردود إلى WebChat (تمامًا مثل الكتابة).
- المقاطعة عند الكلام (مفعّلة افتراضيًا): إذا بدأ المستخدم بالتحدث أثناء تحدث المساعد، نوقف التشغيل ونسجل الطابع الزمني للمقاطعة للمطالبة التالية.
توجيهات الصوت في الردود
قد يسبق المساعد رده بـ سطر JSON واحد للتحكم في الصوت:
{ "voice": "<voice-id>", "once": true }
القواعد:
- أول سطر غير فارغ فقط.
- يتم تجاهل المفاتيح غير المعروفة.
- ينطبق
once: trueعلى الرد الحالي فقط. - بدون
once، يصبح الصوت هو الافتراضي الجديد لوضع التحدث. - يُزال سطر 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",
voice: "alloy",
},
},
mode: "realtime",
transport: "webrtc",
brain: "agent-consult",
},
},
}
القيم الافتراضية:
interruptOnSpeech: truesilenceTimeoutMs: عند عدم ضبطه، يحتفظ وضع التحدث بنافذة التوقف الافتراضية للمنصة قبل إرسال التفريغ النصي (700 ms on macOS and Android, 900 ms on iOS)provider: يحدد موفر التحدث النشط. استخدم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 إذا كان متاحًا).realtime.provider: يحدد موفر الصوت الفوري النشط للمتصفح/الخادم. استخدمopenaiلـ WebRTC، أوgoogleلـ WebSocket الموفر، أو موفرًا مخصصًا للجسر فقط عبر ترحيل Gateway.- يخزن
realtime.providers.<provider>إعداد الوقت الفعلي المملوك للموفر. لا يتلقى المتصفح إلا بيانات اعتماد جلسة مؤقتة أو مقيّدة، ولا يتلقى أبدًا مفتاح API قياسيًا. - يمرر
realtime.brain:agent-consultاستدعاءات الأدوات الفورية عبر سياسة Gateway؛ وdirect-toolsسلوك توافق مخصص للمالك فقط؛ وnoneمخصص للتفريغ النصي أو التنسيق الخارجي. - يعرض
talk.catalogالأوضاع الصالحة لكل موفر، ووسائل النقل، واستراتيجيات الدماغ، وتنسيقات الصوت الفورية، وأعلام القدرات، حتى يتمكن عملاء التحدث من الطرف الأول من تجنب التركيبات غير المدعومة. - تُكتشف موفرو التفريغ النصي المتدفق عبر
talk.catalog.transcription. يستخدم ترحيل Gateway الحالي إعداد موفر بث المكالمات الصوتية إلى أن يُضاف سطح إعداد التفريغ النصي المخصص للتحدث. speechLocale: معرّف لغة BCP 47 اختياري للتعرف على الكلام في وضع التحدث على الجهاز في iOS/macOS. اتركه غير مضبوط لاستخدام القيمة الافتراضية للجهاز.outputFormat: تكون قيمته الافتراضيةpcm_44100على macOS/iOS وpcm_24000على Android (اضبطmp3_*لفرض بث MP3)
واجهة macOS
- تبديل شريط القوائم: التحدث
- تبويب الإعداد: مجموعة وضع التحدث (معرّف الصوت + تبديل المقاطعة)
- الطبقة العلوية:
- الاستماع: نبضات سحابية مع مستوى الميكروفون
- التفكير: حركة غوص
- التحدث: حلقات مشعة
- النقر على السحابة: إيقاف التحدث
- النقر على X: الخروج من وضع التحدث
واجهة Android
- تبديل تبويب الصوت: التحدث
- وضعي الالتقاط وقت التشغيل الميكروفون اليدوي والتحدث متنافيان.
- يتوقف الميكروفون اليدوي عندما يغادر التطبيق الواجهة الأمامية أو يغادر المستخدم تبويب الصوت.
- يستمر وضع التحدث في العمل حتى يتم إيقافه أو تنفصل عقدة Android، ويستخدم نوع خدمة المقدمة لميكروفون Android أثناء نشاطه.
ملاحظات
- يتطلب أذونات الكلام + الميكروفون.
- يستخدم التحدث الأصلي جلسة Gateway النشطة ولا يعود إلى استطلاع السجل إلا عندما تكون أحداث الاستجابة غير متاحة.
- يستخدم التحدث الفوري في المتصفح
talk.client.toolCallمن أجلopenclaw_agent_consultبدلًا من كشفchat.sendلجلسات المتصفح المملوكة للموفر. - يستخدم التحدث المخصص للتفريغ النصي فقط
talk.session.createوtalk.session.appendAudioوtalk.session.cancelTurnوtalk.session.close؛ يشترك العملاء فيtalk.eventلتحديثات التفريغ النصي الجزئية/النهائية. - يحل Gateway تشغيل التحدث عبر
talk.speakباستخدام موفر التحدث النشط. يعود 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 منخفض زمن الاستجابة.