Traductions communautaires par veiseule.ai — Help improve them on Crowdin
Aller au contenu principal

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 Ă  info dans les catĂ©gories voicewake.overlay, voicewake.ptt et voicewake.chime (dĂ©but de session, partiel, final, envoi, fermeture, raison du carillon).

Prochaines étapes¶

  1. 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).
  2. 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.
  3. Liaison de la superposition - VoiceSessionPublisher (ObservableObject) reflĂšte la session active dans SwiftUI. - VoiceWakeOverlayView effectue 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.
  4. Chemin d'envoi unifiĂ© - À endCapture : si le texte tronquĂ© est vide → fermer ; sinon performSend(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.
  5. Journalisation - Le coordinateur Ă©met des journaux .info dans le sous-systĂšme bot.molt, catĂ©gories voicewake.overlay et voicewake.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 endCapture avec le jeton actif ; si le texte est vide, attendez-vous Ă  dismiss sans carillon ni envoi.

Étapes de migration (suggestions)¶

  1. Ajouter VoiceSessionCoordinator, VoiceSession et VoiceSessionPublisher.
  2. Refactoriser VoiceWakeRuntime pour créer/mettre à jour/terminer des sessions au lieu de toucher directement VoiceWakeOverlayController.
  3. Refactoriser VoicePushToTalk pour adopter les sessions existantes et appeler endCapture au relĂąchement ; appliquer le cooldown d’exĂ©cution.
  4. Connecter VoiceWakeOverlayController Ă  l’éditeur ; supprimer les appels directs depuis l’exĂ©cution/PTT.
  5. Ajouter des tests d’intĂ©gration pour l’adoption de session, le cooldown et la fermeture lorsque le texte est vide.