macOS companion app
โอเวอร์เลย์เสียง
วงจรการทำงานของโอเวอร์เลย์เสียง (macOS)
กลุ่มเป้าหมาย: ผู้ร่วมพัฒนาแอป macOS เป้าหมาย: รักษาพฤติกรรมของโอเวอร์เลย์เสียงให้คาดการณ์ได้เมื่อการปลุกด้วยคำปลุกและการกดเพื่อพูดทำงานทับซ้อนกัน
พฤติกรรม
- หากโอเวอร์เลย์แสดงอยู่แล้วจากคำปลุกและผู้ใช้กดปุ่มลัด เซสชันของปุ่มลัดจะรับข้อความที่มีอยู่มาใช้แทนการรีเซ็ต โอเวอร์เลย์จะแสดงอยู่ตลอดเวลาที่กดปุ่มลัดค้างไว้ เมื่อปล่อยปุ่ม: ส่งหากมีข้อความหลังตัดช่องว่างแล้ว มิฉะนั้นให้ปิด
- การใช้คำปลุกเพียงอย่างเดียวยังคงส่งอัตโนมัติเมื่อตรวจพบความเงียบ ส่วนการกดเพื่อพูดจะส่งทันทีเมื่อปล่อยปุ่ม
การนำไปใช้
VoiceSessionCoordinator(apps/macos/Sources/OpenClaw/VoiceSessionCoordinator.swift) เป็นเจ้าของเพียงรายเดียวของเซสชันเสียงที่กำลังใช้งาน โดยเป็นซิงเกิลตัน@MainActor @Observableไม่ใช่ actor API ได้แก่startSession,updatePartial,finalize,sendNow,dismiss,updateLevel,snapshotแต่ละเซสชันมีโทเค็นUUIDการเรียกที่ใช้โทเค็นเก่าหรือไม่ตรงกันจะถูกละทิ้งVoiceWakeOverlayController(VoiceWakeOverlayController+Session.swift) แสดงผลโอเวอร์เลย์และส่งต่อการกระทำของผู้ใช้ (requestSend,dismiss) กลับไปยังตัวประสานงานผ่านโทเค็นของเซสชัน โดยไม่ถือครองสถานะเซสชันเอง- การกดเพื่อพูด (
VoicePushToTalk.begin()) จะรับข้อความใด ๆ ที่มองเห็นในโอเวอร์เลย์มาเป็นadoptedPrefix(ผ่านVoiceSessionCoordinator.shared.snapshot()) เพื่อให้การกดปุ่มลัดขณะโอเวอร์เลย์คำปลุกแสดงอยู่คงข้อความเดิมไว้และต่อท้ายด้วยคำพูดใหม่ เมื่อปล่อยปุ่ม ระบบจะรอข้อความถอดเสียงฉบับสมบูรณ์สูงสุด 1.5 วินาที ก่อนกลับไปใช้ข้อความปัจจุบัน - เมื่อ
dismissโอเวอร์เลย์จะเรียกVoiceSessionCoordinator.overlayDidDismissซึ่งเรียกVoiceWakeRuntime.refresh(state:)เพื่อให้การปิดด้วยปุ่ม X ด้วยตนเอง การปิดเมื่อข้อความว่าง และการปิดหลังส่ง กลับมารอฟังคำปลุกทั้งหมด - เส้นทางการส่งแบบรวมศูนย์: หากข้อความหลังตัดช่องว่างว่างเปล่า ให้ปิด มิฉะนั้น
sendNowจะเล่นเสียงแจ้งการส่งหนึ่งครั้ง ส่งต่อผ่านVoiceWakeForwarderแล้วจึงปิด
การบันทึก日志
ระบบย่อยเสียงคือ ai.openclaw โดยแต่ละองค์ประกอบบันทึกภายใต้หมวดหมู่ของตนเอง:
| หมวดหมู่ | องค์ประกอบ |
|---|---|
voicewake.coordinator |
VoiceSessionCoordinator |
voicewake.overlay |
VoiceWakeOverlayController/VoiceWakeOverlay |
voicewake.ptt |
ปุ่มลัดและการบันทึกเสียงสำหรับการกดเพื่อพูด |
voicewake.runtime |
รันไทม์คำปลุก |
voicewake.chime |
การเล่นเสียงแจ้งเตือน |
voicewake.sync |
การซิงค์การตั้งค่าส่วนกลาง |
voicewake.forward |
การส่งต่อข้อความถอดเสียง |
voicewake.meter |
ตัวตรวจสอบระดับไมโครโฟน |
รายการตรวจสอบการแก้จุดบกพร่อง
-
สตรีมบันทึกขณะทำซ้ำปัญหาโอเวอร์เลย์ค้าง:
bash sudo log stream --predicate 'subsystem == "ai.openclaw" AND category CONTAINS "voicewake"' --level info --style compact -
ตรวจสอบว่ามีโทเค็นเซสชันที่ใช้งานอยู่เพียงรายการเดียว การเรียกกลับที่ล้าสมัยจะถูกตัวประสานงานละทิ้ง
-
ยืนยันว่าการปล่อยปุ่มกดเพื่อพูดเรียก
end()พร้อมโทเค็นที่ใช้งานอยู่เสมอ หากข้อความว่าง ควรปิดโดยไม่มีเสียงแจ้งเตือนหรือการส่ง
เนื้อหาที่เกี่ยวข้อง
Was this useful?