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?