Voice Overlay-livscyklus (macOS)¶
Publikum: macOS app-bidragsydere. Målsætning: Hold stemmen overlejret forudsigeligt, når du vågner ord og push-to-talk overlapper hinanden.
Nuværende hensigt¶
- Hvis overlejringen allerede er synlig fra wake-word og brugeren trykker på genvejstasten, genvejstasten session adopts den eksisterende tekst i stedet for at nulstille den. Overlayet forbliver op, mens genvejstasten holdes. Når brugeren udgiver: Send hvis der er beskåret tekst, ellers afvise.
- Wake-word alene sender stadig automatisk ved stilhed; push-to-talk sender straks ved slip.
Gennemført (9. Dec., 2025)¶
- Overlay sessioner nu bære en token per capture (wake-word eller push-to-talk). Dele/endelig/send/afvis/niveau opdateringer tabes, når token ikke matcher, undgå forsinke tilbagekald.
- Push-to-talk vedtager enhver synlig overlay tekst som et præfiks (så tryk på genvejstasten, mens den vågne overlay er oppe holder teksten og tilføjer ny tale). Den venter op til 1.5s for en endelig udskrift, før den falder tilbage til den aktuelle tekst.
- Klokke-/overlay-logging udsendes ved
infoi kategoriernevoicewake.overlay,voicewake.pttogvoicewake.chime(sessionsstart, partial, final, send, dismiss, klokkeårsag).
Næste trin¶
- VoiceSessionCoordinator (actor)
- Ejer præcis én
VoiceSessionad gangen. - API (token-baseret):beginWakeCapture,beginPushToTalk,updatePartial,endCapture,cancel,applyCooldown. - Dropper callbacks, der bærer forældede tokens (forhindrer gamle genkendere i at genåbne overlayet). - VoiceSession (model)
- Felter:
token,source(wakeWord|pushToTalk), committed/volatile tekst, klokke-flag, timere (auto-send, idle),overlayMode(display|editing|sending), cooldown-deadline. - Overlay-binding
-
VoiceSessionPublisher(ObservableObject) spejler den aktive session ind i SwiftUI. -VoiceWakeOverlayViewrenderer udelukkende via publisheren; den muterer aldrig globale singletons direkte. - Overlay-brugerhandlinger (sendNow,dismiss,edit) kalder tilbage til koordinatoren med sessionens token. - Samlet sendesti
- Ved
endCapture: hvis trimmet tekst er tom → dismiss; ellersperformSend(session:)(afspiller send-klokke én gang, videresender, lukker). - Push-to-talk: ingen forsinkelse; wake-word: valgfri forsinkelse for auto-send. - Anvend en kort cooldown på wake-runtime efter push-to-talk er færdig, så wake-word ikke straks retrigger. - Logning
- Koordinatoren udsender
.info-logs i subsystembot.molt, kategoriervoicewake.overlayogvoicewake.chime. - Nøglehændelser:session_started,adopted_by_push_to_talk,partial,finalized,send,dismiss,cancel,cooldown.
Fejlfindingscheckliste¶
- Stream logs, mens du reproducerer et fastlåst overlay:
bash
sudo log stream --predicate 'subsystem == "bot.molt" AND category CONTAINS "voicewake"' --level info --style compact
-
Bekræft, at der kun er ét aktivt session-token; forældede callbacks bør droppes af koordinatoren.
-
Sørg for, at slip af push-to-talk altid kalder
endCapturemed det aktive token; hvis teksten er tom, forventdismissuden klokke eller send.
Migreringstrin (foreslået)¶
- Tilføj
VoiceSessionCoordinator,VoiceSessionogVoiceSessionPublisher. - Refaktorer
VoiceWakeRuntimetil at oprette/opdatere/afslutte sessioner i stedet for at røreVoiceWakeOverlayControllerdirekte. - Refaktorer
VoicePushToTalktil at overtage eksisterende sessioner og kaldeendCaptureved slip; anvend runtime-cooldown. - Kobl
VoiceWakeOverlayControllertil publisheren; fjern direkte kald fra runtime/PTT. - Tilføj integrationstests for session-overtagelse, cooldown og lukning ved tom tekst.