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.5 ثانية للحصول على نص نهائي قبل الرجوع إلى النص الحالي. - عند
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?