التطبيق المصاحب لنظام macOS

Voice Wake

الأوضاع

  • وضع الكلمة التنبيهية (الافتراضي): يعمل مُعرِّف الكلام دائمًا في انتظار كلمات التشغيل (swabbleTriggerWords). عند التطابق، يبدأ بالتقاط الصوت، ويعرض الطبقة الشفافة مع النص الجزئي، ويرسله تلقائيًا بعد الصمت.
  • الضغط للتحدث (الضغط على مفتاح Option الأيمن): اضغط باستمرار على مفتاح Option الأيمن للبدء في الالتقاط فورًا — دون الحاجة إلى كلمة تنبيهية. تظهر الطبقة الشفافة أثناء الضغط؛ يؤدي تحرير المفتاح إلى إنهاء العملية وتوجيه النص بعد تأخير قصير حتى تتمكن من تعديل النص.

سلوب التشغيل (الكلمة التنبيهية)

  • يعمل مُعرِّف الكلام داخل VoiceWakeRuntime.
  • يتم تنشيط الكلمة التنبيهية فقط عند وجود فاصل زمني ذي معنى بين الكلمة التنبيهية والكلمة التالية (حوالي 0.55 ثانية). يمكن أن تبدأ الطبقة الشفافة/النغمة خلال هذا الفاصل حتى قبل بدء الأمر.
  • فترات الصمت: 2.0 ثانية عند تدفق الكلام، 5.0 ثانية إذا تم سماع الكلمة التنبيهية فقط.
  • إيقاف قسري: 120 ثانية لمنع جلسات التشغيل الطويلة غير المنضبطة.
  • منع الارتداد بين الجلسات: 350 مللي ثانية.
  • يتم التحكم في الطبقة الشفافة عبر VoiceWakeOverlayController مع تلوين ثابت/متغير.
  • بعد الإرسال، يعيد مُعرِّف الكلام التشغيل من جديد للاستماع إلى الكلمة التنبيهية التالية.

الثوابت في دورة الحياة

  • إذا كان Voice Wake مفعلًا وتم منح الأذونات، يجب أن يكون مُعرِّف الكلمة التنبيهية في حالة استماع (باستثناء أثناء عملية التقاط صريحة بواسطة وضع الضغط للتحدث).
  • يجب ألا تمنع رؤية الطبقة الشفافة (بما في ذلك الإغلاق اليدوي عبر زر X) مُعرِّف الكلام من استئناف العمل مطلقًا.

وضع فشل الطبقة الشفافة العالقة (سابقًا)

سابقًا، إذا علقت الطبقة الشفافة ظاهرة وقمت بإغلاقها يدويًا، فقد يبدو Voice Wake "معطلاً" لأن محاولة إعادة تشغيل VoiceWakeRuntime قد يتم حظرها بسبب رؤية الطبقة الشفافة ولم يتم جدولة إعادة تشغيل لاحقة. تم تعزيز النظام:

  • لم تعد إعادة تشغيل Voice Wake محجوبة بسبب رؤية الطبقة الشفافة.
  • يؤدي اكتمال إغلاق الطبقة الشفافة إلى تشغيل VoiceWakeRuntime.refresh(...) عبر VoiceSessionCoordinator، لذا فإن الإغلاق اليدوي بـ X يستأنف الاستماع دائمًا.

تفاصيل الضغط للتحدث

  • يستخدم كشف الاختصار مراقبًا عامًا .flagsChanged لمفتاح Option الأيمن (keyCode 61 + .option). نحن نراقب الأحداث فقط (لا نقوم بحظرها).
  • يعمل خط أنابيب الالتقاط داخل VoicePushToTalk: يبدأ التعرف على الكلام فورًا، ويوجه النصوص الجزئية إلى الطبقة الشفافة، ويستدعي VoiceWakeForwarder عند تحرير المفتاح.
  • عند بدء الضغط للتحدث، نقوم بإيقاف تشغيل Voice Wake لتجنب تضارب مصادر الصوت؛ يستأنف التشغيل تلقائيًا بعد التحرير.
  • الأذونات: يتطلب الميكروفون + التعرف على الكلام؛ يحتاج رؤية الأحداث إلى موافقة إمكانية الوصول/مراقبة الإدخال.
  • لوحات المفاتيح الخارجية: قد لا يعرض بعضها مفتاح Option الأيمن كما هو متوقع — قدم اختصارًا بديلاً إذا أبلغ المستخدمون عن عدم عمل الاختصار.

الإعدادات الموجهة للمستخدم

  • مفتاح تشغيل Voice Wake: يُفعِّل تشغيل Voice Wake.
  • الضغط على Cmd+Fn للتحدث: يُفعِّل مراقب الضغط للتحدث. معطل على أنظمة macOS الأقدم من الإصدار 26.
  • منتقي اللغة والميكروفون، عداد مستوى الصوت المباشر، جدول كلمات التشغيل، أداة الاختبار (محلي فقط؛ لا يقوم بالتوجيه).
  • يحفظ منتقي الميكروفون آخر اختيار إذا تم فصل الجهاز، ويعرض تلميحًا للجهاز المفصول، ويعود مؤقتًا إلى الإعداد الافتراضي للنظام حتى يعود الجهاز.
  • الأصوات: نغمات عند اكتشاف الكلمة التنبيهية وعند الإرسال؛ الافتراضي هو صوت النظام "Glass" الخاص بـ macOS. يمكنك اختيار أي ملف قابل للتحميل بواسطة NSSound (مثل MP3/WAV/AIFF) لكل حدث أو اختيار بدون صوت.

سلوك التوجيه

  • عندما يكون Voice Wake مفعلًا، يتم توجيه النصوص إلى البوابة/الوكيل النشط (نفس وضع التشغيل المحلي مقابل البعيد المستخدم من قبل بقية تطبيق mac).
  • يتم تسليم الردود إلى مزود الخدمة الرئيسي الأخير المستخدم (WhatsApp/Telegram/Discord/WebChat). إذا فشل التسليم، يتم تسجيل الخطأ ولا يزال من الممكن رؤية الجلسة عبر سجلات WebChat/الجلسات.

حمولة التوجيه

  • تقوم VoiceWakeForwarder.prefixedTranscript(_:) بإضافة تلميح الجهاز قبل الإرسال. مشتركة بين مساري الكلمة التنبيهية والضغط للتحدث.

التحقق السريع

  • شغّل وضع الضغط للتحدث، اضغط باستمرار على Cmd+Fn، تحدث، حرر المفتاح: يجب أن تعرض الطبقة الشفافة النصوص الجزئية ثم ترسلها.
  • أثناء الضغط، يجب أن تبقى أيقونات الأذن في شريط القائمة مكبرة (تستخدم triggerVoiceEars(ttl:nil))؛ تعود إلى حجمها الطبيعي بعد التحرير.

شريط القائمةالطبقة الصوتية الشفافة