Nodes and media
حالت گفتوگو
حالت Talk دو شکل زماناجرایی دارد:
- Talk بومی macOS/iOS/Android از تشخیص گفتار محلی، چت Gateway، و TTS با
talk.speakاستفاده میکند. گرهها قابلیتtalkرا اعلام میکنند و فرمانهایtalk.*را که پشتیبانی میکنند مشخص میکنند. - iOS Talk برای پیکربندیهای بیدرنگ OpenAI که
webrtcرا انتخاب میکنند یا transport را حذف میکنند، از WebRTC تحت مالکیت کلاینت استفاده میکند. پیکربندیهای بیدرنگ صریحgateway-relay،provider-websocket، و غیر OpenAI روی رله تحت مالکیت Gateway میمانند؛ پیکربندیهای غیر بیدرنگ از حلقه گفتار بومی استفاده میکنند. - Browser Talk از
talk.client.createبرای نشستهایwebrtcوprovider-websocketتحت مالکیت کلاینت، یا ازtalk.session.createبرای نشستهایgateway-relayتحت مالکیت Gateway استفاده میکند.managed-roomبرای واگذاری Gateway و اتاقهای واکیتاکی رزرو شده است. - Android Talk میتواند با
talk.realtime.mode: "realtime"وtalk.realtime.transport: "gateway-relay"به نشستهای رله بیدرنگ تحت مالکیت Gateway وارد شود. در غیر این صورت روی تشخیص گفتار بومی، چت 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 را مثل نشستهای بیدرنگ و STT/TTS منتشر میکند، اما از mode: "transcription" و brain: "none" استفاده میکند. این برای زیرنویس، دیکته، و ضبط گفتار فقط-مشاهده است؛ یادداشتهای صوتی آپلودشده تکمرحلهای همچنان از مسیر رسانه/صدا استفاده میکنند.
رفتار (macOS)
- همپوشانی همیشه روشن تا زمانی که حالت Talk فعال است.
- گذارهای مرحلهای در حال گوش دادن → در حال فکر کردن → در حال صحبت کردن.
- در یک مکث کوتاه (پنجره سکوت)، رونویسی فعلی ارسال میشود.
- پاسخها در 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 در macOS و Android، 900 ms در iOS)provider: ارائهدهنده فعال Talk را انتخاب میکند. برای مسیرهای پخش محلی macOS ازelevenlabs،mlx، یاsystemاستفاده کنید.providers.<provider>.voiceId: برای ElevenLabs بهELEVENLABS_VOICE_ID/SAG_VOICE_IDبازمیگردد (یا وقتی کلید API در دسترس است، به نخستین صدای ElevenLabs).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: ارائهدهنده فعال صدای بیدرنگ را انتخاب میکند. برای WebRTC ازopenai، برای WebSocket ارائهدهنده ازgoogle، یا از یک ارائهدهنده فقط-پل از طریق رله Gateway استفاده کنید.realtime.providers.<provider>پیکربندی بیدرنگ تحت مالکیت ارائهدهنده را ذخیره میکند. مرورگر فقط اعتبارنامههای نشست موقت یا محدودشده را دریافت میکند، هرگز یک کلید API استاندارد.realtime.providers.openai.voice: شناسه صدای داخلی OpenAI Realtime. صداهای فعلیgpt-realtime-2عبارتاند ازalloy،ash،ballad،coral،echo،sage،shimmer،verse،marin، وcedar؛marinوcedarبرای بهترین کیفیت توصیه میشوند.realtime.transport:webrtcاز OpenAI WebRTC تحت مالکیت کلاینت در iOS و مرورگر استفاده میکند.provider-websocketدر مرورگر تحت مالکیت مرورگر است اما در iOS روی رله Gateway میماند.gateway-relayصدای ارائهدهنده را روی Gateway نگه میدارد؛ Android فقط برای این transport از بیدرنگ استفاده میکند و در غیر این صورت حلقه بومی STT/TTS خود را نگه میدارد.realtime.brain:agent-consultفراخوانیهای ابزار بیدرنگ را از طریق سیاست Gateway مسیریابی میکند؛direct-toolsرفتار سازگاری ابزار مستقیم legacy است؛noneبرای رونویسی یا هماهنگسازی خارجی است.realtime.consultRouting:provider-directوقتی ارائهدهنده ازopenclaw_agent_consultعبور میکند، پاسخ مستقیم ارائهدهنده را حفظ میکند؛force-agent-consultباعث میشود رله Gateway رونویسیهای نهاییشده کاربر را در عوض از طریق OpenClaw مسیریابی کند.realtime.instructions: دستورهای سیستمی روبهارائهدهنده را به پرامپت بیدرنگ داخلی OpenClaw اضافه میکند. از آن برای سبک و لحن صدا استفاده کنید؛ OpenClaw راهنمایی پیشفرضopenclaw_agent_consultرا نگه میدارد.talk.catalogشناسههای canonical ارائهدهنده و aliasهای رجیستری را در کنار حالتهای معتبر، transportها، راهبردهای brain، قالبهای صوتی بیدرنگ، پرچمهای قابلیت، و نتیجه آمادگی انتخابشده در زمان اجرا برای هر ارائهدهنده در معرض میگذارد. کلاینتهای Talk فرست-پارتی باید بهجای نگهداری aliasهای ارائهدهنده بهصورت محلی، از آن catalog استفاده کنند؛ Gateway قدیمیتری که آمادگی گروه را حذف میکند، بهجای قطعاً پیکربندینشده، تأییدنشده است.- ارائهدهندههای رونویسی جریانی از طریق
talk.catalog.transcriptionکشف میشوند. رله Gateway فعلی تا زمانی که سطح پیکربندی اختصاصی رونویسی Talk اضافه شود، از پیکربندی ارائهدهنده جریان Voice Call استفاده میکند. speechLocale: شناسه locale اختیاری BCP 47 برای تشخیص گفتار Talk روی دستگاه در iOS/macOS. برای استفاده از پیشفرض دستگاه، آن را تنظیمنشده بگذارید.outputFormat: در macOS/iOS بهطور پیشفرضpcm_44100و در Android بهطور پیشفرضpcm_24000است (برای اجبار به جریان MP3،mp3_*را تنظیم کنید)
رابط کاربری macOS
- کلید نوار منو: Talk
- زبانه پیکربندی: گروه حالت Talk (شناسه صدا + کلید وقفه)
- همپوشانی:
- در حال گوش دادن: ابر با سطح میکروفون تپش دارد
- در حال فکر کردن: انیمیشن فرورونده
- در حال صحبت کردن: حلقههای تابشی
- کلیک روی ابر: توقف صحبت
- کلیک روی X: خروج از حالت Talk
رابط کاربری Android
- کلید زبانه Voice: Talk
- Mic دستی و Talk حالتهای ضبط زماناجرایی ناسازگار با هم هستند.
- Mic دستی و Talk بیدرنگ، میکروفون هدست Bluetooth Classic یا BLE متصل را ترجیح میدهند. اگر قطع شود، برنامه ورودی هدست دیگری درخواست میکند یا اجازه میدهد Android از میکروفون پیشفرض استفاده کند؛ توقف ضبط ترجیح میکروفون پیشفرض را بازمیگرداند.
- Mic دستی وقتی برنامه از پیشزمینه خارج میشود یا کاربر زبانه Voice را ترک میکند، متوقف میشود.
- حالت Talk تا وقتی خاموش شود یا گره Android قطع شود به اجرا ادامه میدهد، و هنگام فعال بودن از نوع سرویس پیشزمینه میکروفون Android استفاده میکند.
یادداشتها
- به مجوزهای Speech + Microphone نیاز دارد.
- Talk بومی از نشست Gateway فعال استفاده میکند و فقط وقتی رویدادهای پاسخ در دسترس نباشند به polling تاریخچه بازمیگردد.
- Talk بیدرنگ تحت مالکیت کلاینت برای
openclaw_agent_consultبهجای در معرض گذاشتنchat.sendبرای نشستهای تحت مالکیت ارائهدهنده، ازtalk.client.toolCallاستفاده میکند. - Talk فقط رونویسی از
talk.session.create،talk.session.appendAudio،talk.session.cancelTurn، وtalk.session.closeاستفاده میکند؛ کلاینتها برای بهروزرسانیهای جزئی/نهایی رونویسی درtalk.eventمشترک میشوند. - gateway پخش Talk را از طریق
talk.speakبا استفاده از ارائهدهنده فعال Talk resolve میکند. Android فقط وقتی آن RPC در دسترس نباشد به TTS سیستم محلی بازمیگردد. - پخش محلی 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 پشتیبانی میکند.