macOS companion app
بیدارسازی صوتی (macOS)
بیدارباش صوتی و فشار برای صحبت
حالتها
- حالت واژهٔ بیدارباش (پیشفرض): تشخیصگر گفتار همیشه روشن منتظر توکنهای محرک (
swabbleTriggerWords) میماند. در صورت تطابق، ضبط را شروع میکند، همپوشانی را با متن جزئی نشان میدهد، و پس از سکوت بهصورت خودکار ارسال میکند. - فشار برای صحبت (نگهداشتن Option راست): کلید Option راست را نگه دارید تا ضبط بلافاصله شروع شود، بدون نیاز به محرک. همپوشانی هنگام نگهداشتن ظاهر میشود؛ رها کردن، متن را نهایی میکند و پس از تأخیری کوتاه آن را ارسال میکند تا بتوانید متن را کمی اصلاح کنید.
رفتار زمان اجرا (واژهٔ بیدارباش)
- تشخیصگر گفتار در
VoiceWakeRuntimeقرار دارد. - محرک فقط وقتی فعال میشود که بین واژهٔ بیدارباش و واژهٔ بعدی یک مکث معنادار وجود داشته باشد (فاصلهٔ حدود 0.55 ثانیه). همپوشانی/زنگ میتواند در زمان مکث، حتی پیش از شروع فرمان، آغاز شود.
- پنجرههای سکوت: 2.0 ثانیه وقتی گفتار در جریان است، 5.0 ثانیه اگر فقط محرک شنیده شده باشد.
- توقف سخت: 120 ثانیه برای جلوگیری از نشستهای مهارنشده.
- حذف جهش بین نشستها: 350 میلیثانیه.
- همپوشانی از طریق
VoiceWakeOverlayControllerبا رنگبندی ثبتشده/ناپایدار کنترل میشود. - پس از ارسال، تشخیصگر بهصورت تمیز دوباره شروع میشود تا برای محرک بعدی گوش کند.
ناورداییهای چرخهٔ عمر
- اگر بیدارباش صوتی فعال باشد و مجوزها داده شده باشند، تشخیصگر واژهٔ بیدارباش باید در حال گوشدادن باشد (بهجز هنگام ضبط صریح فشار برای صحبت).
- نمایانبودن همپوشانی (از جمله بستن دستی با دکمهٔ X) هرگز نباید مانع از ازسرگیری تشخیصگر شود.
حالت خرابی همپوشانی چسبیده (قبلی)
پیشتر، اگر همپوشانی در حالت نمایان گیر میکرد و شما آن را دستی میبستید، بیدارباش صوتی ممکن بود «از کار افتاده» به نظر برسد، چون تلاش زمان اجرا برای راهاندازی مجدد میتوانست به دلیل نمایانبودن همپوشانی مسدود شود و راهاندازی مجدد بعدی هم زمانبندی نشده بود.
سختسازی:
- راهاندازی مجدد زمان اجرای بیدارباش دیگر با نمایانبودن همپوشانی مسدود نمیشود.
- تکمیل بستن همپوشانی از طریق
VoiceSessionCoordinatorیکVoiceWakeRuntime.refresh(...)را فعال میکند، بنابراین بستن دستی با X همیشه گوشدادن را از سر میگیرد.
جزئیات فشار برای صحبت
- تشخیص کلید میانبر از یک پایشگر سراسری
.flagsChangedبرای Option راست (keyCode 61+.option) استفاده میکند. ما فقط رویدادها را مشاهده میکنیم (بدون بلعیدن آنها). - خط لولهٔ ضبط در
VoicePushToTalkقرار دارد: گفتار را بلافاصله شروع میکند، بخشهای جزئی را به همپوشانی جریان میدهد، و هنگام رها کردنVoiceWakeForwarderرا فراخوانی میکند. - وقتی فشار برای صحبت شروع میشود، زمان اجرای واژهٔ بیدارباش را مکث میکنیم تا از رقابت tapهای صوتی جلوگیری شود؛ پس از رها کردن، بهصورت خودکار دوباره شروع میشود.
- مجوزها: به میکروفون + گفتار نیاز دارد؛ دیدن رویدادها به تأیید Accessibility/Input Monitoring نیاز دارد.
- صفحهکلیدهای خارجی: برخی ممکن است Option راست را مطابق انتظار ارائه نکنند؛ اگر کاربران از ازدسترفتن رویدادها گزارش دادند، یک میانبر جایگزین ارائه کنید.
تنظیمات روبهروی کاربر
- کلید بیدارباش صوتی: زمان اجرای واژهٔ بیدارباش را فعال میکند.
- برای صحبت، Cmd+Fn را نگه دارید: پایشگر فشار برای صحبت را فعال میکند. روی macOS < 26 غیرفعال است.
- انتخابگرهای زبان و میکروفون، سطحسنج زنده، جدول واژههای محرک، آزمایشگر (فقط محلی؛ ارسال نمیکند).
- انتخابگر میکروفون اگر دستگاهی قطع شود آخرین انتخاب را حفظ میکند، یک راهنمای قطعشده نشان میدهد، و تا زمان بازگشت دستگاه موقتاً به پیشفرض سیستم برمیگردد.
- صداها: هنگام تشخیص محرک و هنگام ارسال زنگ میزند؛ پیشفرض، صدای سیستمی «Glass» در macOS است. برای هر رویداد میتوانید هر فایل قابل بارگذاری با
NSSound(مثلاً MP3/WAV/AIFF) را انتخاب کنید یا بدون صدا را برگزینید.
رفتار ارسال
- وقتی بیدارباش صوتی فعال است، رونوشتها به Gateway/عامل فعال ارسال میشوند (همان حالت محلی در برابر راهدور که بقیهٔ برنامهٔ مک استفاده میکند).
- پاسخها به آخرین ارائهدهندهٔ اصلی استفادهشده (WhatsApp/Telegram/Discord/WebChat) تحویل داده میشوند. اگر تحویل ناموفق باشد، خطا ثبت میشود و اجرا همچنان از طریق WebChat/لاگهای نشست قابل مشاهده است.
محمولهٔ ارسال
VoiceWakeForwarder.prefixedTranscript(_:)پیش از ارسال، راهنمای ماشین را به ابتدای متن اضافه میکند. بین مسیرهای واژهٔ بیدارباش و فشار برای صحبت مشترک است.
راستیآزمایی سریع
- فشار برای صحبت را روشن کنید، Cmd+Fn را نگه دارید، صحبت کنید، رها کنید: همپوشانی باید بخشهای جزئی را نشان دهد و سپس ارسال کند.
- هنگام نگهداشتن، گوشهای نوار منو باید بزرگشده باقی بمانند (از
triggerVoiceEars(ttl:nil)استفاده میکند)؛ پس از رها کردن پایین میآیند.