macOS companion app

پوشش صوتی

چرخهٔ عمر هم‌پوشان صوتی (macOS)

مخاطبان: مشارکت‌کنندگان برنامهٔ macOS. هدف: حفظ رفتار پیش‌بینی‌پذیر هم‌پوشان صوتی هنگام هم‌زمانی واژهٔ بیدارباش و فشردن برای صحبت.

رفتار

  • اگر هم‌پوشان از طریق واژهٔ بیدارباش از قبل قابل مشاهده باشد و کاربر کلید میان‌بر را فشار دهد، نشست کلید میان‌بر به‌جای بازنشانی، متن موجود را به کار می‌گیرد. تا زمانی که کلید میان‌بر نگه داشته شود، هم‌پوشان باز می‌ماند. هنگام رها کردن: اگر متن پس از حذف فاصله‌های ابتدا و انتها خالی نباشد، ارسال می‌شود؛ در غیر این صورت، هم‌پوشان بسته می‌شود.
  • واژهٔ بیدارباش به‌تنهایی همچنان هنگام سکوت به‌طور خودکار ارسال می‌کند؛ فشردن برای صحبت بلافاصله پس از رها کردن ارسال می‌کند.

پیاده‌سازی

  • VoiceSessionCoordinator (apps/macos/Sources/OpenClaw/VoiceSessionCoordinator.swift) تنها مالک نشست صوتی فعال است. این یک تک‌نمونهٔ @MainActor @Observable است، نه یک actor. API: startSession، updatePartial، finalize، sendNow، dismiss، updateLevel، snapshot. هر نشست یک توکن UUID دارد؛ فراخوانی‌هایی با توکن قدیمی یا ناسازگار نادیده گرفته می‌شوند.
  • VoiceWakeOverlayController (VoiceWakeOverlayController+Session.swift) هم‌پوشان را رندر می‌کند و کنش‌های کاربر (requestSend، dismiss) را از طریق توکن نشست به هماهنگ‌کننده بازمی‌گرداند. این مؤلفه هرگز مالک وضعیت نشست نیست.
  • فشردن برای صحبت (VoicePushToTalk.begin()) هر متن قابل مشاهدهٔ هم‌پوشان را به‌عنوان adoptedPrefix (از طریق VoiceSessionCoordinator.shared.snapshot()) به کار می‌گیرد؛ بنابراین فشردن کلید میان‌بر هنگام نمایش هم‌پوشان بیدارباش، متن را حفظ می‌کند و گفتار جدید را به آن می‌افزاید. هنگام رها کردن، پیش از بازگشت به متن فعلی، حداکثر 1.5s برای رونوشت نهایی منتظر می‌ماند.
  • در dismiss، هم‌پوشان VoiceSessionCoordinator.overlayDidDismiss را فراخوانی می‌کند که VoiceWakeRuntime.refresh(state:) را فعال می‌کند؛ در نتیجه، بستن دستی با X، بستن به‌دلیل خالی بودن متن و بستن پس از ارسال، همگی گوش‌دادن به واژهٔ بیدارباش را از سر می‌گیرند.
  • مسیر یکپارچهٔ ارسال: اگر متن پس از حذف فاصله‌های ابتدا و انتها خالی باشد، هم‌پوشان بسته می‌شود؛ در غیر این صورت، sendNow صدای ارسال را یک‌بار پخش می‌کند، از طریق VoiceWakeForwarder ارسال می‌کند و سپس هم‌پوشان را می‌بندد.

ثبت گزارش

زیرسیستم صوتی ai.openclaw است؛ هر مؤلفه در دستهٔ مختص خود گزارش ثبت می‌کند:

دسته مؤلفه
voicewake.coordinator VoiceSessionCoordinator
voicewake.overlay VoiceWakeOverlayController/VoiceWakeOverlay
voicewake.ptt کلید میان‌بر و ضبط فشردن برای صحبت
voicewake.runtime زمان‌اجرای واژهٔ بیدارباش
voicewake.chime پخش صدا
voicewake.sync همگام‌سازی تنظیمات سراسری
voicewake.forward ارسال رونوشت
voicewake.meter پایشگر سطح میکروفون

فهرست بررسی اشکال‌زدایی

  • هنگام بازتولید هم‌پوشان گیرکرده، گزارش‌ها را به‌صورت جریانی مشاهده کنید:

    bash
    sudo log stream --predicate 'subsystem == "ai.openclaw" AND category CONTAINS "voicewake"' --level info --style compact
  • بررسی کنید که فقط یک توکن نشست فعال وجود دارد؛ فراخوان‌های بازگشتی قدیمی توسط هماهنگ‌کننده نادیده گرفته می‌شوند.

  • تأیید کنید که رها کردن فشردن برای صحبت همیشه end() را با توکن فعال فراخوانی می‌کند؛ اگر متن خالی باشد، انتظار می‌رود هم‌پوشان بدون پخش صدا یا ارسال بسته شود.

مرتبط

Was this useful?
On this page

On this page