À propos du projet

## Aperçu du projet AirPods Voice 输入法 est une app native macOS dans la barre de menus qui contrôle la saisie vocale via le geste d'un clic sur les AirPods : un premier clic démarre l'enregistrement, un second l'arrête, confirme le texte et l'envoie automatiquement, sans jamais toucher au clavier. La version stable actuelle est la 1.0. ## Fonctionnalités principales - Un clic sur les AirPods démarre la saisie vocale, un second clic l'arrête et envoie automatiquement. - Prise en charge de plusieurs cycles consécutifs, chaque cycle revenant à un état inactif permettant de redémarrer. - Compatible avec le microphone intégré et celui des AirPods, sans modifier les réglages de l'app. - Simule par défaut un appui long sur `Fn`, configurable en Control, Option, Command, Shift ou F1–F12. - La barre de menus et la fenêtre de contrôle offrent l'état d'exécution, le démarrage, l'arrêt, les instructions et la fermeture. - La fenêtre de contrôle s'affiche à chaque ouverture de l'app ; une fois fermée, l'app continue dans la barre de menus. - Une saisie au clavier physique interrompt automatiquement la touche vocale non terminée, évitant que les touches modificatrices affectent le terminal ou les logiciels de tâches. - N'occupe pas le Dock, ne dépend pas de logiciels d'automatisation tiers comme BetterTouchTool. - Compatible Apple Silicon et Intel Mac, macOS 13 minimum. ## Prérequis d'utilisation Il faut régler le raccourci de saisie vocale de son propre clavier vocal sur « appui long sur Fn ». Le README indique que la 1.0 a été validée avec le clavier 豆包输入法 sur plusieurs cycles avec de vrais AirPods ; les autres claviers doivent prendre en charge le comportement « maintenir le raccourci pour enregistrer, relâcher pour terminer ». Pendant l'exécution de l'app, celle-ci prend en charge le clic lecture/pause des AirPods ; il est donc impossible de contrôler la musique par un clic à ce moment. Après l'arrêt ou la fermeture de l'app, le contrôle multimédia est rétabli. ## Installation et autorisations Télécharger le paquet PKG depuis GitHub Releases et l'installer dans `/Applications/AirPods Voice 输入法.app`. L'installateur arrête et supprime automatiquement les anciennes versions bêta, évitant que deux versions prennent en charge les AirPods simultanément. Le paquet actuel utilise une signature ad-hoc ; si macOS le bloque, faire un clic droit dans le Finder et choisir « Ouvrir ». L'app doit obtenir l'autorisation « Accessibilité » de macOS pour simuler l'appui long sur la touche vocale et envoyer la touche Entrée. L'autorisation concerne l'app elle-même, pas le terminal ni les outils de développement, et aucun accès complet au disque n'est nécessaire ; l'app ne capture pas le microphone, la permission du microphone étant gérée par le clavier vocal choisi par l'utilisateur. ## Fonctionnement (décrit dans le README) L'app détient une session Now Playing via `MPRemoteCommandCenter` pour recevoir le clic des AirPods, n'acceptant que les événements média provenant de `com.apple.bluetoothd` ou `com.apple.cloudpaird` ; les autres sources comme la touche lecture du clavier ne déclenchent pas la voix. Une fois le microphone des AirPods passé en mode audio d'appel, le second clic est signalé par `bluetoothd` comme Software Mute, que l'app traite comme un signal d'arrêt et d'envoi uniquement dans sa propre session vocale déjà démarrée. L'écoute IOHID sert de canal de secours, la même opération physique étant dédupliquée via une fenêtre de 350 ms. Le premier clic envoie une activation Fn via `IOHIDPostEvent` ; le second clic termine la session d'enregistrement et envoie successivement deux touches Entrée, la première confirmant le texte composé par le clavier vocal, la seconde envoyant le message. Pour éviter que les touches modificatrices globales affectent les applications sensibles aux raccourcis, la 1.0 ajoute trois niveaux de protection : nettoyage du Fn résiduel au démarrage ; détection d'une saisie au clavier physique pendant la voix, retirant d'abord la touche modificatrice vocale et terminant immédiatement la voix ; libération du Fn par un processus gardien indépendant en cas d'arrêt anormal de l'app. L'arrêt normal, le changement d'application au premier plan, le délai de sécurité de 5 minutes ou la fermeture de l'app ne font que libérer la touche, sans envoi erroné. ## Configuration et journaux Le fichier de configuration par défaut est `config/voice-key`, avec pour contenu `fn`, modifiable en control, option, command, shift ou f1–f12 ; un redémarrage du script est nécessaire après modification. Il est aussi possible de le spécifier temporairement via une variable d'environnement lors de l'exécution depuis les sources. Les journaux se trouvent dans `/tmp/airpods-voice-input-method/` sous les noms app.log, app.stdout.log et app.stderr.log ; on peut confirmer le processus avec `pgrep -fl airpods-voice-input-method` et l'arrêter proprement en libérant la touche vocale avec `./scripts/stop.sh`. ## Compilation et tests `scripts/build.sh` compile l'app universelle, `scripts/package-release.sh` génère le PKG, avec prise en charge d'un certificat Developer ID spécifié. Les scripts de test couvrent quatre cycles d'interaction vocale, la consommation de Fn, la sécurité clavier, la récupération après plantage et d'autres scénarios de régression ; `tests/hitl-two-cycle.sh` sert à la validation manuelle avec de vrais AirPods. ## Licence Le code source utilise la licence PolyForm Noncommercial 1.0.0, ce qui en fait une licence source-available et non une licence open source au sens de l'OSI ; l'apprentissage personnel, la recherche et l'usage non commercial sont autorisés, l'usage commercial nécessitant une autorisation séparée.