การปลุกด้วยเสียง & กดเพื่อพูด¶
โหมด¶
- โหมดคำปลุก (ค่าเริ่มต้น): ตัวรู้จำคำพูดที่เปิดตลอดเวลาจะรอโทเคนทริกเกอร์ (
swabbleTriggerWords). เมื่อจับคู่ได้จะเริ่มบันทึก แสดงโอเวอร์เลย์พร้อมข้อความบางส่วน และส่งอัตโนมัติหลังจากเงียบ - Push-to-talk (กดค้าง Option ขวา): กดค้างปุ่ม Option ขวาเพื่อเริ่มบันทึกทันที—ไม่ต้องใช้ทริกเกอร์ โอเวอร์เลย์จะแสดงระหว่างกดค้าง; เมื่อปล่อยจะสรุปและส่งต่อหลังดีเลย์สั้นๆ เพื่อให้ปรับข้อความได้ โอเวอร์เลย์จะปรากฏขณะกดค้าง; เมื่อปล่อยจะสรุปผลและส่งต่อหลังดีเลย์สั้น ๆ เพื่อให้คุณปรับแก้ข้อความได้
พฤติกรรมขณะรัน (โหมดคำปลุก)¶
- ตัวรู้จำคำพูดทำงานอยู่ใน
VoiceWakeRuntime. - ทริกเกอร์จะทำงานก็ต่อเมื่อมี ช่วงหยุดที่มีนัยสำคัญ ระหว่างคำปลุกกับคำถัดไป (~ช่องว่าง 0.55วินาที) โอเวอร์เลย์/เสียงเตือนอาจเริ่มที่ช่วงหยุดได้แม้ก่อนคำสั่งจะเริ่ม โอเวอร์เลย์/เสียงเตือนสามารถเริ่มได้ตั้งแต่ช่วงพัก แม้ก่อนที่คำสั่งจะเริ่ม
- หน้าต่างความเงียบ: 2.0วินาทีเมื่อมีการพูดต่อเนื่อง, 5.0วินาทีหากได้ยินเฉพาะทริกเกอร์
- หยุดแบบฮาร์ด: 120วินาทีเพื่อป้องกันเซสชันที่หลุดควบคุม
- ดีบาวซ์ระหว่างเซสชัน: 350มิลลิวินาที
- โอเวอร์เลย์ขับเคลื่อนผ่าน
VoiceWakeOverlayControllerพร้อมการไล่สีแบบ committed/volatile - หลังจากส่งแล้ว ตัวรู้จำจะรีสตาร์ตอย่างสะอาดเพื่อฟังทริกเกอร์ถัดไป
อินวาเรียนต์ของวงจรชีวิต¶
- หากเปิดใช้งาน Voice Wake และได้รับสิทธิ์แล้ว ตัวรู้จำคำปลุกควรอยู่ในสถานะฟัง (ยกเว้นระหว่างการบันทึกแบบ push-to-talk ที่สั่งชัดเจน)
- การมองเห็นของโอเวอร์เลย์ (รวมถึงการปิดด้วยปุ่ม X ด้วยตนเอง) ต้องไม่ขัดขวางการกลับมาทำงานของตัวรู้จำ
โหมดล้มเหลวของโอเวอร์เลย์ค้าง (ก่อนหน้า)¶
ก่อนหน้านี้ หากโอเวอร์เลย์ค้างแสดงอยู่และคุณปิดด้วยตนเอง Voice Wake อาจดูเหมือน “ตาย” เพราะความพยายามรีสตาร์ตของรันไทม์อาจถูกบล็อกโดยสถานะการมองเห็นของโอเวอร์เลย์ และไม่มีการตั้งเวลาการรีสตาร์ตถัดไป
การเสริมความทนทาน:
- การรีสตาร์ตรันไทม์ของคำปลุกจะไม่ถูกบล็อกด้วยการมองเห็นของโอเวอร์เลย์อีกต่อไป
- การปิดโอเวอร์เลย์เสร็จสิ้นจะทริกเกอร์
VoiceWakeRuntime.refresh(...)ผ่านVoiceSessionCoordinatorดังนั้นการกด X ปิดด้วยตนเองจะกลับมาฟังต่อเสมอ
รายละเอียดเฉพาะของ Push-to-talk¶
- การตรวจจับฮอตคีย์ใช้ตัวเฝ้าดู
.flagsChangedแบบโกลบอลสำหรับ Option ขวา (keyCode 61+.option). เราเพียงสังเกตอีเวนต์ (ไม่ดักกิน) - พายป์ไลน์การบันทึกอยู่ใน
VoicePushToTalk: เริ่ม Speech ทันที สตรีมข้อความบางส่วนไปยังโอเวอร์เลย์ และเรียกVoiceWakeForwarderเมื่อปล่อย - เมื่อเริ่ม push-to-talk เราจะพักรันไทม์คำปลุกเพื่อหลีกเลี่ยงการแย่งแท็ปเสียง; จะรีสตาร์ตอัตโนมัติหลังปล่อย
- สิทธิ์: ต้องการไมโครโฟน + Speech; การเห็นอีเวนต์ต้องได้รับการอนุญาต Accessibility/Input Monitoring
- คีย์บอร์ดภายนอก: บางรุ่นอาจไม่เปิดเผย Option ขวาตามที่คาด—ควรมีช็อตคัตสำรองหากผู้ใช้รายงานพลาด
การตั้งค่าที่ผู้ใช้เห็น¶
- Voice Wake สวิตช์: เปิดใช้งานรันไทม์คำปลุก
- Hold Cmd+Fn to talk: เปิดใช้งานตัวเฝ้าดู push-to-talk ปิดใช้งานบน macOS < 26 ปิดใช้งานบน macOS < 26
- ตัวเลือกภาษาและไมค์, มิเตอร์ระดับแบบสด, ตารางคำทริกเกอร์, ตัวทดสอบ (เฉพาะในเครื่อง; ไม่ส่งต่อ)
- ตัวเลือกไมค์จะจดจำการเลือกครั้งล่าสุดหากอุปกรณ์ตัดการเชื่อมต่อ แสดงคำใบ้ว่าอุปกรณ์ถูกตัด และจะสลับไปใช้ค่าเริ่มต้นของระบบชั่วคราวจนกว่าจะกลับมา
- เสียง: มีเสียงเตือนเมื่อพบการทริกเกอร์และเมื่อส่ง; ค่าเริ่มต้นคือเสียงระบบ macOS “Glass” Sounds: เสียงเตือนเมื่อพบทริกเกอร์และเมื่อส่ง ค่าเริ่มต้นคือเสียงระบบ macOS “Glass” คุณสามารถเลือกไฟล์ที่
NSSoundโหลดได้ (เช่น MP3/WAV/AIFF) สำหรับแต่ละอีเวนต์ หรือเลือก No Sound
พฤติกรรมการส่งต่อ¶
- เมื่อเปิดใช้งาน Voice Wake บทถอดเสียงจะถูกส่งต่อไปยัง Gateway/เอเจนต์ที่ใช้งานอยู่ (โหมดภายในเครื่อง vs ระยะไกลเดียวกับส่วนอื่นของแอปmac)
- คำตอบจะถูกส่งไปยัง ผู้ให้บริการหลักที่ใช้ล่าสุด (WhatsApp/Telegram/Discord/WebChat) หากการส่งล้มเหลว จะบันทึกข้อผิดพลาดและยังเห็นรันได้ผ่าน WebChat/บันทึกเซสชัน หากการส่งล้มเหลว จะบันทึกข้อผิดพลาดและการรันยังคงมองเห็นได้ผ่าน WebChat/บันทึกเซสชัน
เพย์โหลดการส่งต่อ¶
VoiceWakeForwarder.prefixedTranscript(_:)จะเติมคำใบ้ของเครื่องไว้ด้านหน้าก่อนส่ง ใช้ร่วมกันทั้งเส้นทางคำปลุกและ push-to-talk ใช้ร่วมกันระหว่างเส้นทาง wake-word และ push-to-talk
การตรวจสอบอย่างรวดเร็ว¶
- เปิด push-to-talk กดค้าง Cmd+Fn พูด แล้วปล่อย: โอเวอร์เลย์ควรแสดงข้อความบางส่วนแล้วส่ง
- ระหว่างกดค้าง ไอคอนหูที่แถบเมนูควรขยายอยู่ (ใช้
triggerVoiceEars(ttl:nil)); จะยุบหลังปล่อย