macOS companion app

การปลุกด้วยเสียง (macOS)

การปลุกด้วยเสียงและการกดเพื่อพูด

โหมด

  • โหมดคำปลุก (ค่าเริ่มต้น): ตัวรู้จำเสียงพูดที่เปิดตลอดเวลาจะรอโทเค็นกระตุ้น (swabbleTriggerWords) เมื่อตรงกันจะเริ่มบันทึกเสียง แสดงโอเวอร์เลย์พร้อมข้อความบางส่วน และส่งอัตโนมัติหลังจากเงียบ
  • กดเพื่อพูด (กด Option ขวาค้าง): กดปุ่ม Option ขวาค้างเพื่อบันทึกเสียงทันที โดยไม่ต้องมีคำกระตุ้น โอเวอร์เลย์จะปรากฏระหว่างกดค้าง; เมื่อปล่อยจะสรุปผลและส่งต่อหลังจากหน่วงเวลาสั้น ๆ เพื่อให้คุณปรับแก้ข้อความได้

พฤติกรรมรันไทม์ (คำปลุก)

  • ตัวรู้จำเสียงพูดอยู่ใน VoiceWakeRuntime
  • คำกระตุ้นจะทำงานเฉพาะเมื่อมี จังหวะหยุดที่มีนัยสำคัญ ระหว่างคำปลุกกับคำถัดไป (ช่วงห่างประมาณ 0.55 วินาที) โอเวอร์เลย์/เสียงกระดิ่งสามารถเริ่มตอนจังหวะหยุดได้ แม้ก่อนคำสั่งจะเริ่ม
  • หน้าต่างความเงียบ: 2.0 วินาทีเมื่อยังมีการพูดต่อเนื่อง, 5.0 วินาทีหากได้ยินเฉพาะคำกระตุ้น
  • หยุดแบบบังคับ: 120 วินาทีเพื่อป้องกันเซสชันค้างไม่หยุด
  • ดีบาวซ์ระหว่างเซสชัน: 350 มิลลิวินาที
  • โอเวอร์เลย์ถูกขับเคลื่อนผ่าน VoiceWakeOverlayController พร้อมการลงสีแบบ committed/volatile
  • หลังส่งแล้ว ตัวรู้จำเสียงพูดจะเริ่มใหม่อย่างสะอาดเพื่อฟังคำกระตุ้นถัดไป

ค่าคงที่ของวงจรชีวิต

  • หากเปิดใช้การปลุกด้วยเสียงและได้รับสิทธิ์แล้ว ตัวรู้จำคำปลุกควรกำลังฟังอยู่ (ยกเว้นระหว่างการบันทึกแบบกดเพื่อพูดอย่างชัดเจน)
  • การมองเห็นของโอเวอร์เลย์ (รวมถึงการปิดเองด้วยปุ่ม X) ต้องไม่ขัดขวางไม่ให้ตัวรู้จำเสียงพูดกลับมาทำงานต่อ

โหมดความล้มเหลวที่โอเวอร์เลย์ค้าง (ก่อนหน้า)

ก่อนหน้านี้ หากโอเวอร์เลย์ค้างอยู่ในสถานะมองเห็นได้และคุณปิดเอง การปลุกด้วยเสียงอาจดูเหมือน "ตาย" เพราะความพยายามเริ่มใหม่ของรันไทม์อาจถูกบล็อกโดยการมองเห็นของโอเวอร์เลย์ และไม่มีการกำหนดเวลาเริ่มใหม่ครั้งถัดไป

การทำให้แข็งแรงขึ้น:

  • การเริ่มใหม่ของรันไทม์คำปลุกจะไม่ถูกบล็อกโดยการมองเห็นของโอเวอร์เลย์อีกต่อไป
  • เมื่อการปิดโอเวอร์เลย์เสร็จสิ้น จะกระตุ้น VoiceWakeRuntime.refresh(...) ผ่าน VoiceSessionCoordinator ดังนั้นการปิดด้วย X เองจะกลับมาฟังต่อเสมอ

รายละเอียดเฉพาะของการกดเพื่อพูด

  • การตรวจจับฮอตคีย์ใช้ตัวตรวจสอบ .flagsChanged แบบโกลบอลสำหรับ Option ขวา (keyCode 61 + .option) เราสังเกตเหตุการณ์เท่านั้น (ไม่กลืนเหตุการณ์)
  • ไปป์ไลน์การบันทึกอยู่ใน VoicePushToTalk: เริ่ม Speech ทันที สตรีมผลลัพธ์บางส่วนไปยังโอเวอร์เลย์ และเรียก VoiceWakeForwarder เมื่อปล่อยปุ่ม
  • เมื่อการกดเพื่อพูดเริ่ม เราจะหยุดรันไทม์คำปลุกชั่วคราวเพื่อหลีกเลี่ยงการแตะเสียงซ้อนกัน; รันไทม์จะเริ่มใหม่อัตโนมัติหลังปล่อยปุ่ม
  • สิทธิ์: ต้องใช้ไมโครโฟน + Speech; การเห็นเหตุการณ์ต้องได้รับอนุมัติ Accessibility/Input Monitoring
  • คีย์บอร์ดภายนอก: บางรุ่นอาจไม่เปิดเผย 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)); หูจะลดลงหลังปล่อย

ที่เกี่ยวข้อง