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 را به کار می‌برند.

گفت‌وگوی بومی یک حلقه پیوسته مکالمه صوتی است:

  1. گوش دادن به گفتار
  2. ارسال رونویسی به مدل از طریق نشست فعال
  3. انتظار برای پاسخ
  4. خواندن آن از طریق ارائه‌دهنده گفت‌وگوی پیکربندی‌شده (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 / voiceId
  • model / model_id / modelId
  • speed, rate (WPM), stability, similarity, style, speakerBoost
  • seed, normalize, lang, output_format, latency_tier
  • once

پیکربندی (~/.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: true
  • silenceTimeoutMs: وقتی تنظیم نشده باشد، گفت‌وگو پیش از ارسال رونویسی، پنجره مکث پیش‌فرض پلتفرم را نگه می‌دارد (700 ms در macOS و Android، 900 ms در iOS)
  • provider: ارائه‌دهنده فعال گفت‌وگو را انتخاب می‌کند. برای مسیرهای پخش محلی 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).
  • realtime.provider: ارائه‌دهنده فعال صدای بلادرنگ مرورگر/سرور را انتخاب می‌کند. برای WebRTC از openai، برای WebSocket ارائه‌دهنده از google، یا برای ارائه‌دهنده فقط‌پل از طریق رله 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: در macOS/iOS به‌طور پیش‌فرض pcm_44100 و در Android به‌طور پیش‌فرض pcm_24000 است (برای اجبار جریانی‌سازی MP3، mp3_* را تنظیم کنید)

رابط کاربری macOS

  • کلید نوار منو: گفت‌وگو
  • زبانه پیکربندی: گروه حالت گفت‌وگو (شناسه صدا + کلید وقفه)
  • هم‌پوشانی:
    • در حال گوش دادن: ابر با سطح میکروفون می‌تپد
    • در حال فکر کردن: پویانمایی فرورونده
    • در حال صحبت کردن: حلقه‌های تابشی
    • کلیک روی ابر: توقف صحبت کردن
    • کلیک روی X: خروج از حالت گفت‌وگو

رابط کاربری Android

  • کلید زبانه صدا: گفت‌وگو
  • میکروفون دستی و گفت‌وگو حالت‌های ضبط اجرایی ناسازگار با هم هستند.
  • میکروفون دستی وقتی برنامه از پیش‌زمینه خارج شود یا کاربر زبانه صدا را ترک کند، متوقف می‌شود.
  • حالت گفت‌وگو تا زمان خاموش شدن از طریق کلید یا قطع اتصال گره Android به اجرا ادامه می‌دهد و در زمان فعال بودن از نوع سرویس پیش‌زمینه میکروفون Android استفاده می‌کند.

یادداشت‌ها

  • به مجوزهای گفتار + میکروفون نیاز دارد.
  • گفت‌وگوی بومی از نشست فعال Gateway استفاده می‌کند و فقط وقتی رویدادهای پاسخ در دسترس نباشند، به نظرسنجی تاریخچه بازمی‌گردد.
  • گفت‌وگوی بلادرنگ مرورگر به‌جای در معرض قرار دادن chat.send برای نشست‌های مرورگر متعلق به ارائه‌دهنده، از talk.client.toolCall برای openclaw_agent_consult استفاده می‌کند.
  • گفت‌وگوی فقط‌رونویسی از talk.session.create، talk.session.appendAudio، talk.session.cancelTurn، و talk.session.close استفاده می‌کند؛ کلاینت‌ها برای به‌روزرسانی‌های جزئی/نهایی رونویسی در talk.event مشترک می‌شوند.
  • Gateway پخش گفت‌وگو را از طریق talk.speak و با استفاده از ارائه‌دهنده فعال گفت‌وگو حل می‌کند. 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 با تاخیر کم پشتیبانی می‌کند.

مرتبط