تطبيق macOS المرافق
طبقة الصوت
الجمهور: مساهمو تطبيق macOS. الهدف: الحفاظ على طبقة الصوت متوقعة عند تداخل كلمة التنبيه والضغط للتحدث.
النية الحالية
- إذا كانت الطبقة مرئية بالفعل من كلمة التنبيه وقام المستخدم بالضغط على المفتاح السريع، فإن جلسة المفتاح السريع تتبنى النص الموجود بدلاً من إعادة تعيينه. تبقى الطبقة ظاهرة أثناء استمرار الضغط على المفتاح السريع. عند إفلات المستخدم: أرسل إذا كان هناك نص مقصوص، وإلا أغلق.
- كلمة التنبيه وحدها لا تزال ترسل تلقائياً عند الصمت؛ الضغط للتحدث يرسل فوراً عند الإفلات.
المنفذ (9 ديسمبر 2025)
- تحمل جلسات الطبقة الآن رمزاً مميزاً لكل عملية التقاط (كلمة التنبيه أو الضغط للتحدث). يتم تجاهل التحديثات الجزئية/النهائية/الإرسال/الإغلاق/مستوى الصوت عندما لا يتطابق الرمز المميز، مما يتجنب استدعاءات قديمة.
- يتبنى الضغط للتحدث أي نص مرئي في الطبقة كبادئة (لذا فإن الضغط على المفتاح السريع أثناء ظهور طبقة التنبيه يحافظ على النص ويضيف كلاماً جديداً). ينتظر حتى 1.5 ثانية للحصول على نسخة نهائية قبل التراجع إلى النص الحالي.
- يتم إصدار سجلات النغمة/الطبقة بمستوى
infoفي الفئاتvoicewake.overlay،voicewake.ptt، وvoicewake.chime(بداية الجلسة، جزئي، نهائي، إرسال، إغلاق، سبب النغمة).
الخطوات التالية
- VoiceSessionCoordinator (ممثل)
- يمتلك جلسة
VoiceSessionواحدة فقط في كل مرة. - واجهة برمجة التطبيقات (قائمة على الرموز المميزة):
beginWakeCapture،beginPushToTalk،updatePartial،endCapture،cancel،applyCooldown. - يتجاهل الاستدعاءات التي تحمل رموزاً مميزة قديمة (يمنع المعالجات القديمة من إعادة فتح الطبقة).
- يمتلك جلسة
- VoiceSession (نموذج)
- الحقول:
token،source(wakeWord|pushToTalk)، نص ثابت/متغير، أعلام النغمة، المؤقتات (إرسال تلقائي، خامل)،overlayMode(عرض|تحرير|إرسال)، موعد انتهاء فترة التهدئة.
- الحقول:
- ربط الطبقة
VoiceSessionPublisher(ObservableObject) يعكس الجلسة النشطة في SwiftUI.VoiceWakeOverlayViewيعرض فقط عبر الناشر؛ لا يعدل مباشرةً الكائنات المفردة العامة.- إجراءات المستخدم على الطبقة (
sendNow،dismiss،edit) تستدعي مرة أخرى إلى المنسق مع رمز الجلسة.
- مسار إرسال موحد
- عند
endCapture: إذا كان النص المقصوص فارغاً → أغلق؛ وإلاperformSend(session:)(يعزف نغمة الإرسال مرة واحدة، يمرر، يغلق). - الضغط للتحدث: لا تأخير؛ كلمة التنبيه: تأخير اختياري للإرسال التلقائي.
- تطبيق فترة تهدئة قصيرة على وقت تشغيل التنبيه بعد انتهاء الضغط للتحدث حتى لا تعيد كلمة التنبيه التشغيل فوراً.
- عند
- التسجيل
- يصدر المنسق سجلات
.infoفي النظام الفرعيai.openclaw، والفئاتvoicewake.overlayوvoicewake.chime. - الأحداث الرئيسية:
session_started،adopted_by_push_to_talk،partial،finalized،send،dismiss،cancel،cooldown.
- يصدر المنسق سجلات
قائمة التحقق للتصحيح
-
بث السجلات أثناء إعادة إنتاج طبقة عالقة:
نسخ
sudo log stream --predicate 'subsystem == "ai.openclaw" AND category CONTAINS "voicewake"' --level info --style compact -
التحقق من وجود رمز جلسة نشط واحد فقط؛ يجب أن يتجاهل المنسق الاستدعاءات القديمة.
-
التأكد من أن إفلات الضغط للتحدث يستدعي دائماً
endCaptureمع الرمز النشط؛ إذا كان النص فارغاً، توقعdismissبدون نغمة أو إرسال.
خطوات الهجرة (مقترحة)
- إضافة
VoiceSessionCoordinator، وVoiceSession، وVoiceSessionPublisher. - إعادة هيكلة
VoiceWakeRuntimeلإنشاء/تحديث/إنهاء الجلسات بدلاً من التعديل المباشر علىVoiceWakeOverlayController. - إعادة هيكلة
VoicePushToTalkلتبني الجلسات الموجودة واستدعاءendCaptureعند الإفلات؛ تطبيق فترة تهدئة وقت التشغيل. - توصيل
VoiceWakeOverlayControllerبالناشر؛ إزالة الاستدعاءات المباشرة من وقت التشغيل/الضغط للتحدث. - إضافة اختبارات تكامل لتبني الجلسات، فترة التهدئة، وإغلاق النص الفارغ.