الانتقال إلى المحتوى الرئيسي

التنشيط الصوتي والضغط للتحدث

أوضاع

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

السلوك أثناء التشغيل (كلمة التنشيط)

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

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

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

نمط فشل «التراكب العالق» (سابقًا)

سابقًا، إذا علق التراكب مرئيًا وأغلقته يدويًا، قد يبدو التنشيط الصوتي «ميتًا» لأن محاولة إعادة التشغيل في وقت التشغيل يمكن أن تُحجب بسبب رؤية التراكب ولا تتم جدولة إعادة تشغيل لاحقة. التقوية:
  • لم تعد إعادة تشغيل وقت تشغيل التنشيط محجوبة برؤية التراكب.
  • يؤدي اكتمال إغلاق التراكب إلى إطلاق VoiceWakeRuntime.refresh(...) عبر VoiceSessionCoordinator، بحيث يضمن إغلاق X اليدوي استئناف الاستماع دائمًا.

خصوصيات الضغط للتحدث

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

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

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

سلوك إعادة التوجيه

  • عند تفعيل التنشيط الصوتي، تُعاد توجيه النصوص المُفرّغة إلى الـ gateway/الوكيل النشط (نفس وضع المحلي مقابل البعيد المستخدم في بقية تطبيق mac).
  • تُسلَّم الردود إلى آخر موفّر رئيسي مُستخدَم (WhatsApp/Telegram/Discord/WebChat). إذا فشل التسليم، يُسجَّل الخطأ وتظل العملية مرئية عبر WebChat/سجلات الجلسة.

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

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

تحقق سريع

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