Levenscyclus van de spraakoverlay (macOS)
Doelgroep: macOS-appbijdragers. Doel: de spraakoverlay voorspelbaar houden wanneer wake-woord en push-to-talk overlappen.Huidige intentie
- Als de overlay al zichtbaar is door het wake-woord en de gebruiker de sneltoets indrukt, adopteert de sneltoetssessie de bestaande tekst in plaats van deze te resetten. De overlay blijft zichtbaar zolang de sneltoets wordt ingedrukt. Wanneer de gebruiker loslaat: verzenden als er getrimde tekst is, anders sluiten.
- Alleen het wake-woord verzendt nog steeds automatisch bij stilte; push-to-talk verzendt direct bij loslaten.
Geïmplementeerd (9 dec 2025)
- Overlay-sessies dragen nu per opname (wake-woord of push-to-talk) een token. Updates voor partial/final/send/dismiss/level worden genegeerd wanneer het token niet overeenkomt, om verouderde callbacks te voorkomen.
- Push-to-talk adopteert alle zichtbare overlaytekst als prefix (dus het indrukken van de sneltoets terwijl de wake-overlay actief is, behoudt de tekst en voegt nieuwe spraak toe). Het wacht tot 1,5 s op een definitief transcript voordat wordt teruggevallen op de huidige tekst.
- Chime-/overlaylogging wordt uitgezonden bij
infoin categorieënvoicewake.overlay,voicewake.pttenvoicewake.chime(sessiestart, partial, final, verzenden, sluiten, reden van chime).
Volgende stappen
- VoiceSessionCoordinator (actor)
- Beheert exact één
VoiceSessiontegelijk. - API (token-gebaseerd):
beginWakeCapture,beginPushToTalk,updatePartial,endCapture,cancel,applyCooldown. - Negeert callbacks met verouderde tokens (voorkomt dat oude recognizers de overlay opnieuw openen).
- Beheert exact één
- VoiceSession (model)
- Velden:
token,source(wakeWord|pushToTalk), vastgelegde/vluchtige tekst, chime-vlaggen, timers (automatisch verzenden, inactiviteit),overlayMode(display|editing|sending), cooldown-deadline.
- Velden:
- Overlay-binding
VoiceSessionPublisher(ObservableObject) spiegelt de actieve sessie naar SwiftUI.VoiceWakeOverlayViewrendert uitsluitend via de publisher; het muteert nooit direct globale singletons.- Overlay-gebruikersacties (
sendNow,dismiss,edit) roepen terug naar de coordinator met het sessietoken.
- Eenvoudig verzendpad
- Bij
endCapture: als getrimde tekst leeg is → sluiten; andersperformSend(session:)(speelt het verzendgeluid één keer af, stuurt door, sluit). - Push-to-talk: geen vertraging; wake-woord: optionele vertraging voor automatisch verzenden.
- Pas een korte cooldown toe op de wake-runtime nadat push-to-talk is beëindigd, zodat het wake-woord niet direct opnieuw triggert.
- Bij
- Logging
- De coordinator emitteert
.info-logs in subsysteembot.molt, categorieënvoicewake.overlayenvoicewake.chime. - Sleutelgebeurtenissen:
session_started,adopted_by_push_to_talk,partial,finalized,send,dismiss,cancel,cooldown.
- De coordinator emitteert
Debugging-checklist
-
Stream logs terwijl je een vastzittende overlay reproduceert:
- Verifieer dat er slechts één actief sessietoken is; verouderde callbacks moeten door de coordinator worden genegeerd.
-
Zorg ervoor dat het loslaten van push-to-talk altijd
endCaptureaanroept met het actieve token; als de tekst leeg is, verwachtdismisszonder chime of verzending.
Migratiestappen (aanbevolen)
- Voeg
VoiceSessionCoordinator,VoiceSessionenVoiceSessionPublishertoe. - Refactor
VoiceWakeRuntimeom sessies te maken/bij te werken/te beëindigen in plaats vanVoiceWakeOverlayControllerdirect aan te raken. - Refactor
VoicePushToTalkom bestaande sessies te adopteren en bij loslatenendCaptureaan te roepen; pas runtime-cooldown toe. - Verbind
VoiceWakeOverlayControllermet de publisher; verwijder directe aanroepen vanuit runtime/PTT. - Voeg integratietests toe voor sessie-adoptie, cooldown en sluiten bij lege tekst.