वॉइस ओवरले लाइफसाइकल (macOS)
लक्षित पाठक: macOS ऐप योगदानकर्ता। लक्ष्य: वेक-वर्ड और पुश-टू-टॉक के ओवरलैप होने पर वॉइस ओवरले को पूर्वानुमेय बनाए रखना।मौजूदा इरादा
- यदि ओवरले पहले से वेक-वर्ड से दिख रहा है और उपयोगकर्ता हॉटकी दबाता है, तो हॉटकी सेशन मौजूदा टेक्स्ट को रीसेट करने के बजाय उसे अपना लेता है। हॉटकी दबाए रखने तक ओवरले दिखता रहता है। जब उपयोगकर्ता छोड़ता है: यदि ट्रिम किया हुआ टेक्स्ट है तो भेजें, अन्यथा खारिज करें।
- केवल वेक-वर्ड अब भी मौन पर अपने आप भेजता है; पुश-टू-टॉक छोड़ते ही तुरंत भेजता है।
लागू किया गया (9 दिसंबर, 2025)
- ओवरले सेशन अब हर कैप्चर (वेक-वर्ड या पुश-टू-टॉक) के लिए एक टोकन रखते हैं। टोकन मेल न खाने पर partial/final/send/dismiss/level अपडेट छोड़ दिए जाते हैं, जिससे पुराने कॉलबैक से बचा जाता है।
- पुश-टू-टॉक किसी भी दिख रहे ओवरले टेक्स्ट को उपसर्ग के रूप में अपना लेता है (इसलिए वेक ओवरले दिखते समय हॉटकी दबाने पर टेक्स्ट बना रहता है और नई स्पीच जुड़ जाती है)। यह मौजूदा टेक्स्ट पर वापस जाने से पहले अंतिम ट्रांसक्रिप्ट के लिए 1.5s तक प्रतीक्षा करता है।
- चाइम/ओवरले लॉगिंग
voicewake.overlay,voicewake.ptt, औरvoicewake.chimeश्रेणियों मेंinfoपर उत्सर्जित की जाती है (सेशन शुरू, partial, final, send, dismiss, chime reason)।
अगले चरण
- VoiceSessionCoordinator (actor)
- एक समय में ठीक एक
VoiceSessionका मालिक होता है। - API (टोकन-आधारित):
beginWakeCapture,beginPushToTalk,updatePartial,endCapture,cancel,applyCooldown। - पुराने टोकन वाले कॉलबैक छोड़ देता है (पुराने रिकग्नाइज़र को ओवरले फिर से खोलने से रोकता है)।
- एक समय में ठीक एक
- VoiceSession (model)
- फ़ील्ड:
token,source(wakeWord|pushToTalk), committed/volatile टेक्स्ट, चाइम फ़्लैग, टाइमर (auto-send, idle),overlayMode(display|editing|sending), कूलडाउन डेडलाइन।
- फ़ील्ड:
- ओवरले बाइंडिंग
VoiceSessionPublisher(ObservableObject) सक्रिय सेशन को SwiftUI में मिरर करता है।VoiceWakeOverlayViewकेवल पब्लिशर के माध्यम से रेंडर करता है; यह ग्लोबल सिंगलटन को सीधे कभी म्यूटेट नहीं करता।- ओवरले उपयोगकर्ता कार्रवाइयां (
sendNow,dismiss,edit) सेशन टोकन के साथ कोऑर्डिनेटर में वापस कॉल करती हैं।
- एकीकृत भेजने का पथ
endCaptureपर: यदि ट्रिम किया हुआ टेक्स्ट खाली है → खारिज करें; अन्यथाperformSend(session:)(सेंड चाइम एक बार बजाता है, आगे भेजता है, खारिज करता है)।- पुश-टू-टॉक: कोई देरी नहीं; वेक-वर्ड: auto-send के लिए वैकल्पिक देरी।
- पुश-टू-टॉक समाप्त होने के बाद वेक रनटाइम पर छोटा कूलडाउन लागू करें ताकि वेक-वर्ड तुरंत फिर से ट्रिगर न हो।
- लॉगिंग
- कोऑर्डिनेटर
ai.openclawसबसिस्टम मेंvoicewake.overlayऔरvoicewake.chimeश्रेणियों के साथ.infoलॉग उत्सर्जित करता है। - मुख्य इवेंट:
session_started,adopted_by_push_to_talk,partial,finalized,send,dismiss,cancel,cooldown।
- कोऑर्डिनेटर
डीबगिंग चेकलिस्ट
-
अटके हुए ओवरले को पुन: उत्पन्न करते समय लॉग स्ट्रीम करें:
- सत्यापित करें कि केवल एक सक्रिय सेशन टोकन है; पुराने कॉलबैक को कोऑर्डिनेटर द्वारा छोड़ दिया जाना चाहिए।
-
सुनिश्चित करें कि पुश-टू-टॉक छोड़ना हमेशा सक्रिय टोकन के साथ
endCaptureकॉल करता है; यदि टेक्स्ट खाली है, तो चाइम या सेंड के बिनाdismissअपेक्षित है।
माइग्रेशन चरण (सुझाए गए)
VoiceSessionCoordinator,VoiceSession, औरVoiceSessionPublisherजोड़ें।VoiceWakeOverlayControllerको सीधे छूने के बजाय सेशन बनाने/अपडेट करने/समाप्त करने के लिएVoiceWakeRuntimeको रीफ़ैक्टर करें।- मौजूदा सेशन अपनाने और छोड़ने पर
endCaptureकॉल करने के लिएVoicePushToTalkको रीफ़ैक्टर करें; रनटाइम कूलडाउन लागू करें। VoiceWakeOverlayControllerको पब्लिशर से वायर करें; रनटाइम/PTT से सीधे कॉल हटाएं।- सेशन अपनाने, कूलडाउन, और खाली-टेक्स्ट खारिज करने के लिए इंटीग्रेशन टेस्ट जोड़ें।