Cycle de vie de la superposition vocale (macOS)¶
Public : contributeurs de lâapplication macOS. Objectif : maintenir une superposition vocale prĂ©visible lorsque le mot dâactivation et le push-to-talk se chevauchent.
Intention actuelle¶
- Si la superposition est dĂ©jĂ visible via le mot dâactivation et que lâutilisateur appuie sur le raccourci clavier, la session push-to-talk adopte le texte existant au lieu de le rĂ©initialiser. La superposition reste affichĂ©e tant que le raccourci est maintenu. Au relĂąchement : envoyer sâil existe du texte tronquĂ©, sinon fermer.
- Le mot dâactivation seul envoie toujours automatiquement aprĂšs le silence ; le push-to-talk envoie immĂ©diatement au relĂąchement.
Implémenté (9 déc. 2025)¶
- Les sessions de superposition portent dĂ©sormais un jeton par capture (mot dâactivation ou push-to-talk). Les mises Ă jour partial/final/send/dismiss/level sont ignorĂ©es lorsque le jeton ne correspond pas, ce qui Ă©vite les rappels obsolĂštes.
- Le push-to-talk adopte tout texte de superposition visible comme prĂ©fixe (ainsi, appuyer sur le raccourci pendant que la superposition du mot dâactivation est affichĂ©e conserve le texte et ajoute la nouvelle parole). Il attend jusquâĂ 1,5 s un transcript final avant de revenir au texte courant.
- La journalisation des carillons/superpositions est Ă©mise Ă
infodans les catégoriesvoicewake.overlay,voicewake.pttetvoicewake.chime(début de session, partiel, final, envoi, fermeture, raison du carillon).
Prochaines étapes¶
- VoiceSessionCoordinator (actor)
- Détient exactement un
VoiceSessionĂ la fois. - API (basĂ©e sur des jetons) :beginWakeCapture,beginPushToTalk,updatePartial,endCapture,cancel,applyCooldown. - LĂąche les callbacks qui portent des jetons obsolĂštes (empĂȘche les anciens reconnaissants de rouvrir le recouvrement). - VoiceSession (model)
- Champs :
token,source(wakeWord|pushToTalk), texte validé/volatile, indicateurs de carillon, minuteurs (envoi auto, inactivité),overlayMode(display|editing|sending), échéance de cooldown. - Liaison de la superposition
-
VoiceSessionPublisher(ObservableObject) reflĂšte la session active dans SwiftUI. -VoiceWakeOverlayVieweffectue le rendu uniquement via lâĂ©diteur ; il ne modifie jamais directement des singletons globaux. - Les actions utilisateur de la superposition (sendNow,dismiss,edit) rappellent le coordinateur avec le jeton de session. - Chemin d'envoi unifiĂ©
- Ă
endCapture : si le texte tronquĂ© est vide â fermer ; sinonperformSend(session:)(joue le carillon dâenvoi une fois, transfĂšre, ferme). - Push-to-talk : pas de dĂ©lai ; mot dâactivation : dĂ©lai optionnel pour lâenvoi automatique. - Appliquer un court cooldown Ă lâexĂ©cution du mot dâactivation aprĂšs la fin du push-to-talk afin que le mot dâactivation ne se redĂ©clenche pas immĂ©diatement. - Journalisation
- Le coordinateur émet des journaux
.infodans le sous-systĂšmebot.molt, catĂ©goriesvoicewake.overlayetvoicewake.chime. - ĂvĂ©nements clĂ©s :session_started,adopted_by_push_to_talk,partial,finalized,send,dismiss,cancel,cooldown.
Liste de vérification de débogage¶
- Stream les logs tout en reproduisant une surcouche autocollante :
bash
sudo log stream --predicate 'subsystem == "bot.molt" AND category CONTAINS "voicewake"' --level info --style compact
-
VĂ©rifiez quâil nây a quâun seul jeton de session actif ; les rappels obsolĂštes doivent ĂȘtre ignorĂ©s par le coordinateur.
-
Assurez-vous que le relĂąchement du push-to-talk appelle toujours
endCaptureavec le jeton actif ; si le texte est vide, attendez-vous Ădismisssans carillon ni envoi.
Ătapes de migration (suggestions)¶
- Ajouter
VoiceSessionCoordinator,VoiceSessionetVoiceSessionPublisher. - Refactoriser
VoiceWakeRuntimepour créer/mettre à jour/terminer des sessions au lieu de toucher directementVoiceWakeOverlayController. - Refactoriser
VoicePushToTalkpour adopter les sessions existantes et appelerendCaptureau relĂąchement ; appliquer le cooldown dâexĂ©cution. - Connecter
VoiceWakeOverlayControllerĂ lâĂ©diteur ; supprimer les appels directs depuis lâexĂ©cution/PTT. - Ajouter des tests dâintĂ©gration pour lâadoption de session, le cooldown et la fermeture lorsque le texte est vide.