मुख्य सामग्री पर जाएं

वॉइस ओवरले लाइफसाइकल (macOS)

लक्षित पाठक: macOS ऐप योगदानकर्ता। लक्ष्य: वेक-वर्ड और पुश-टू-टॉक के ओवरलैप होने पर वॉइस ओवरले को पूर्वानुमेय बनाए रखना।

मौजूदा इरादा

  • यदि ओवरले पहले से वेक-वर्ड से दिख रहा है और उपयोगकर्ता हॉटकी दबाता है, तो हॉटकी सेशन मौजूदा टेक्स्ट को रीसेट करने के बजाय उसे अपना लेता है। हॉटकी दबाए रखने तक ओवरले दिखता रहता है। जब उपयोगकर्ता छोड़ता है: यदि ट्रिम किया हुआ टेक्स्ट है तो भेजें, अन्यथा खारिज करें।
  • केवल वेक-वर्ड अब भी मौन पर अपने आप भेजता है; पुश-टू-टॉक छोड़ते ही तुरंत भेजता है।

लागू किया गया (9 दिसंबर, 2025)

  • ओवरले सेशन अब हर कैप्चर (वेक-वर्ड या पुश-टू-टॉक) के लिए एक टोकन रखते हैं। टोकन मेल न खाने पर partial/final/send/dismiss/level अपडेट छोड़ दिए जाते हैं, जिससे पुराने कॉलबैक से बचा जाता है।
  • पुश-टू-टॉक किसी भी दिख रहे ओवरले टेक्स्ट को उपसर्ग के रूप में अपना लेता है (इसलिए वेक ओवरले दिखते समय हॉटकी दबाने पर टेक्स्ट बना रहता है और नई स्पीच जुड़ जाती है)। यह मौजूदा टेक्स्ट पर वापस जाने से पहले अंतिम ट्रांसक्रिप्ट के लिए 1.5s तक प्रतीक्षा करता है।
  • चाइम/ओवरले लॉगिंग voicewake.overlay, voicewake.ptt, और voicewake.chime श्रेणियों में info पर उत्सर्जित की जाती है (सेशन शुरू, partial, final, send, dismiss, chime reason)।

अगले चरण

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

डीबगिंग चेकलिस्ट

  • अटके हुए ओवरले को पुन: उत्पन्न करते समय लॉग स्ट्रीम करें:
    sudo log stream --predicate 'subsystem == "ai.openclaw" AND category CONTAINS "voicewake"' --level info --style compact
    
  • सत्यापित करें कि केवल एक सक्रिय सेशन टोकन है; पुराने कॉलबैक को कोऑर्डिनेटर द्वारा छोड़ दिया जाना चाहिए।
  • सुनिश्चित करें कि पुश-टू-टॉक छोड़ना हमेशा सक्रिय टोकन के साथ endCapture कॉल करता है; यदि टेक्स्ट खाली है, तो चाइम या सेंड के बिना dismiss अपेक्षित है।

माइग्रेशन चरण (सुझाए गए)

  1. VoiceSessionCoordinator, VoiceSession, और VoiceSessionPublisher जोड़ें।
  2. VoiceWakeOverlayController को सीधे छूने के बजाय सेशन बनाने/अपडेट करने/समाप्त करने के लिए VoiceWakeRuntime को रीफ़ैक्टर करें।
  3. मौजूदा सेशन अपनाने और छोड़ने पर endCapture कॉल करने के लिए VoicePushToTalk को रीफ़ैक्टर करें; रनटाइम कूलडाउन लागू करें।
  4. VoiceWakeOverlayController को पब्लिशर से वायर करें; रनटाइम/PTT से सीधे कॉल हटाएं।
  5. सेशन अपनाने, कूलडाउन, और खाली-टेक्स्ट खारिज करने के लिए इंटीग्रेशन टेस्ट जोड़ें।

संबंधित