mirror of
https://github.com/JMP-MS/ASPIC.git
synced 2026-10-27 18:17:09 +00:00
V1.006 Suite de l'intégration de la voix
This commit is contained in:
@@ -1,50 +1,60 @@
|
||||
## 27. Pilotage vocal (Lilou) — phase 1 [BROUILLON, fonctionnalité non encore validée de bout en bout] (1er-2 septembre 2026)
|
||||
## 27. Pilotage vocal — multi-agents (1ᵉʳ-2 septembre 2026)
|
||||
|
||||
**⚠️ Statut de ce fichier.** Section créée par anticipation le 2 septembre 2026 à la demande explicite de Jean-Marc, alors que le principe initial (voir sommaire du journal) était de ne créer ce fichier qu'une fois le pilotage vocal validé de bout en bout — ce qui n'est pas encore le cas. Contenu à considérer comme un brouillon de travail, à mettre à jour à la fin de chaque session tant que la fonctionnalité n'est pas stabilisée, plutôt que comme un compte-rendu définitif.
|
||||
**Contexte et bouton micro (1er septembre 2026).** Suite de la ToDoList (section 26) : nouveau bouton micro dans le bandeau, positionné après l'avatar pour une place fixe à l'écran. Comportement centralisé dans un fichier partagé `micro.js`, chargé sur chaque écran hôte — reconnaissance vocale réelle via l'API Web Speech du navigateur (mode "cloud" du navigateur, l'audio étant envoyé à un service externe, voir réflexions stratégiques section 3), écoute continue avec redémarrage automatique tant que l'utilisateur n'a pas explicitement refermé le micro. Un mot déclencheur filtre les phrases prises en compte, pour ignorer la conversation de fond non destinée à ASPIC — principe conservé tout au long de cette section ; seul son fonctionnement (un seul nom fixe au départ, puis plusieurs agents) a évolué.
|
||||
|
||||
**Contexte.** Suite de la ToDoList (section 26) : nouveau bouton micro dans le bandeau, positionné après l'avatar pour une place fixe à l'écran. Comportement centralisé dans un fichier partagé `micro.js`, chargé sur chaque écran hôte — reconnaissance vocale réelle via l'API Web Speech du navigateur, écoute continue avec redémarrage automatique tant que l'utilisateur n'a pas explicitement refermé le micro. Mot déclencheur **« Lilou »** (assistante vocale d'ASPIC, dans la même veine que « Viktor » côté contacts) pour ignorer la conversation de fond — tolérant aussi **« Milou »**, confusion fréquente du moteur de reconnaissance sur ce prénom.
|
||||
**Mode notation.** Une phrase d'ouverture ("[nom], ajoute une tâche" / "un truc à faire" / "note ça dans ma todolist") fait basculer dans un mode où le nom de l'agent n'est plus exigé pour chaque ligne suivante — tout ce qui est capté est ajouté tel quel, jusqu'à une phrase de clôture ("c'est tout [nom]") ou d'annulation ("[nom] annule"). Volontairement **sans interprétation** à ce stade (décision explicite de Jean-Marc, 1er septembre) : le texte part tel quel en base pour constituer un corpus de vrais essais, avant de définir des règles d'interprétation dans un prochain chantier (étape 2, envisagée via n8n, avec des règles modifiables par l'utilisateur).
|
||||
|
||||
**Mode notation (livré le 1er septembre au soir).** Capture une dictée libre entre une phrase d'ouverture (« Lilou, ajoute une tâche » / « un truc à faire » / « note ça dans ma todolist ») et une phrase de clôture (« c'est tout Lilou ») ou d'annulation (« Lilou annule ») — les deux traitées à l'identique, sans interprétation à ce stade, sur demande explicite de Jean-Marc. Objectif : accumuler un vrai corpus d'essais réels avant de définir, dans un prochain chantier, des règles d'interprétation (étape 2, envisagée via n8n, avec des règles modifiables par l'utilisateur). Version applicative incrémentée une fois pour cette fonctionnalité, **V1.005**.
|
||||
|
||||
**Première implémentation (abandonnée le 2 septembre, voir plus bas) : fichier texte.** Le texte capté tel quel était envoyé à un endpoint `lilou_notes.php`, qui l'ajoutait, horodaté et attribué à l'utilisateur, à un fichier texte global (`notes_lilou/dictees.txt`, pensé pour être protégé par un `.htaccess` du même principe que `/journal`).
|
||||
|
||||
**Session de débogage en conditions réelles, nuit du 1er au 2 septembre.** Plusieurs corrections apportées à `micro.js` :
|
||||
- la clôture peut désormais porter à la fois la dernière ligne de contenu et la fin du lot dans une seule phrase, sans « ensuite » artificiel juste avant ;
|
||||
- tolérance à la confusion « Lilou »/« Milou » ;
|
||||
- fenêtre de quelques secondes pour recoller une phrase que le moteur de reconnaissance a coupée juste après la virgule suivant « Lilou ».
|
||||
|
||||
Côté serveur, deux problèmes rencontrés : le fichier `lilou_notes.php` n'avait pas été déployé au premier essai ; puis, une fois déployé, droits d'écriture insuffisants sur `notes_lilou/` (dossier propriété de `1001:users`, `www-data` hors de ce groupe). **Contournement provisoire en fin de session :** `dictees.txt` écrit directement à la racine de l'application plutôt que dans `notes_lilou/`, donc temporairement hors de toute protection `.htaccess`. Test de bout en bout non confirmé réussi au moment d'arrêter la session.
|
||||
|
||||
**Test du matin, 2 septembre — échec confirmé.** Jean-Marc a créé manuellement `dictees.txt` à la racine de l'application et refait un essai : aucune mise à jour du fichier. L'approche fichier ne fonctionne donc toujours pas en pratique, au-delà du problème de droits déjà identifié sur `notes_lilou/`.
|
||||
|
||||
**Décision de pivot, 2 septembre — abandon de l'approche fichier texte.** Sur proposition de Jean-Marc, pour ne pas perdre plus de temps sur une idée qui n'était que provisoire : chaque ligne de dictée sera désormais stockée directement dans une table MySQL simple, `ASP_ConsignesVoix` (nom volontairement générique, pas centré sur « Lilou », l'assistante n'étant qu'une des interfaces possibles vers ce mécanisme).
|
||||
**Abandon du fichier texte, pivot vers une table SQL (2 septembre).** La première implémentation écrivait les dictées dans un fichier texte global (`notes_lilou/dictees.txt`), plombée par des soucis de droits d'écriture (`www-data` hors du groupe propriétaire du dossier), puis par un échec pur et simple constaté au test du lendemain matin (aucune mise à jour du fichier malgré l'appel). Sur proposition de Jean-Marc, pour ne pas perdre plus de temps sur une approche provisoire : chaque ligne de dictée est désormais stockée directement dans une table MySQL, `ASP_ConsignesVoix`, structure finale à ce jour :
|
||||
|
||||
```sql
|
||||
CREATE TABLE `ASP_ConsignesVoix` (
|
||||
`CVX_Incr` int NOT NULL,
|
||||
`CVX_Incr` int NOT NULL AUTO_INCREMENT,
|
||||
`CVX_Consigne` varchar(200) NOT NULL,
|
||||
`CVX_Type` varchar(12) NOT NULL,
|
||||
`CVX_DateHeure` datetime NOT NULL,
|
||||
`CVX_CodeUser` varchar(3) NOT NULL,
|
||||
`CVX_Consigne` varchar(200) NOT NULL
|
||||
`CVX_AgentTraitant` varchar(20) NOT NULL,
|
||||
PRIMARY KEY (`CVX_Incr`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
|
||||
|
||||
ALTER TABLE `ASP_ConsignesVoix`
|
||||
ADD PRIMARY KEY (`CVX_Incr`);
|
||||
|
||||
ALTER TABLE `ASP_ConsignesVoix`
|
||||
MODIFY `CVX_Incr` int NOT NULL AUTO_INCREMENT;
|
||||
COMMIT;
|
||||
```
|
||||
|
||||
`CVX_DateHeure` et `CVX_CodeUser` ajoutés par rapport à la proposition initiale de Jean-Marc (qui ne portait que `CVX_Incr`/`CVX_Consigne`), sur suggestion de Claude, pour préserver l'horodatage et l'attribution utilisateur que l'ancien fichier texte portait déjà — évite un `ALTER TABLE` ultérieur sur des données déjà présentes. `CVX_CodeUser` en `varchar(3)`, même convention que `USR_Code`/`TDL_ToDoUser`.
|
||||
`CVX_Type` (ajoutée en cours de session, voir plus bas) distingue `ouverture` / `contenu` / `cloture` / `annulation` sur chaque ligne, pour qu'un futur automatisme ("robot") sache, sans ré-analyser le texte brut, où commence et finit un lot, et s'il doit être exécuté ou écarté — clôture et annulation distinguées à ce niveau, malgré un traitement du contenu identique dans les deux cas (décision du 1er septembre, maintenue). `CVX_AgentTraitant` (ajoutée plus tard dans la session, voir "Généralisation multi-agents" ci-dessous) porte en clair le nom de l'agent adressé, appelée à devenir une clé étrangère (`CVX_IncrAgent`) une fois le modèle stabilisé.
|
||||
|
||||
**Accès au code — point bloquant identifié le 2 septembre.** `micro.js` et `lilou_notes.php` n'ont jamais été poussés sur GitHub (dépôt non fait la veille au soir, Jean-Marc étant trop fatigué) — ils n'existent que sur le VPS. Jean-Marc s'en occupe (dépôt en cours au moment de la rédaction de ce brouillon). Une fois le dépôt fait, Claude pourra lire le contenu actuel de ces deux fichiers, notamment le format JSON exact envoyé par `micro.js` vers `lilou_notes.php`, avant de réécrire cet endpoint pour insérer dans `ASP_ConsignesVoix` au lieu d'écrire dans `dictees.txt`.
|
||||
**Corrections apportées en conditions réelles.** Plusieurs bugs identifiés et corrigés au fil des essais de Jean-Marc :
|
||||
- une phrase d'ouverture ou de clôture/annulation dite dans la même phrase que du contenu, sans pause ("Lilou, ajoute une tâche, [contenu]" tout d'une traite), perdait silencieusement le contenu situé après la phrase de contrôle repérée — corrigé symétriquement des deux côtés (ouverture, puis clôture/annulation) ;
|
||||
- couper le micro manuellement pendant une notation en cours abandonnait le contenu déjà dicté — corrigé en traitant la coupure manuelle comme une clôture normale, avec un marqueur explicite ("(coupure manuelle du micro)") ;
|
||||
- une clôture prononcée ("c'est tout Lilou") transcrite par erreur en "c'est tous les loups" par le moteur de reconnaissance passait inaperçue — diagnostiquée après une demande explicite de Claude à Jean-Marc de fournir un export exact plutôt qu'une nouvelle tentative à l'aveugle (une première hypothèse s'étant déjà révélée fausse), puis corrigée par une tolérance dédiée à cet homophone de phrase entière.
|
||||
|
||||
**Pattern d'implémentation identifié pour la suite** (lecture de `db.php` et `todolist.php`, tous deux déjà dans le dépôt) : connexion via `getDbConnection()` (PDO, routage MIRADOR géré automatiquement par session), vérification de session (`$_SESSION['USR_Code']`, 401 sinon), JSON en entrée (`php://input`) et en sortie, requêtes préparées. `lilou_notes.php` réécrit suivra ce même pattern.
|
||||
**Incident de confidentialité et retrait du traçage de débogage.** Un traçage brut temporaire (toutes les phrases reconnues, trigger ou non), ajouté pour diagnostiquer le bug ci-dessus, a enregistré des bribes d'un appel téléphonique confidentiel reçu pendant que le micro était resté ouvert. Jean-Marc a supprimé les lignes lui-même et signalé l'incident sans gravité particulière ; Claude a retiré l'intégralité de cette fonctionnalité de traçage dès que l'incident a été rapporté, sans attendre. Risque résiduel identifié : même sans traçage, l'écoute continue envoie l'audio ambiant au service de reconnaissance tant que le micro est ouvert, qu'un agent soit reconnu ou non — seul le mode local ("on-device", encore expérimental) éliminerait complètement cet envoi (voir réflexions stratégiques, section 3). Mitigation partielle apportée dans la foulée : voir coupure pour inactivité ci-dessous.
|
||||
|
||||
**Coupure automatique pour inactivité.** Ajoutée en réponse directe à l'incident ci-dessus : après `DUREE_INACTIVITE_MS` (10 minutes par défaut) sans interaction réelle avec un agent, le micro se referme tout seul, comme un clic manuel — notation en cours clôturée proprement plutôt que perdue. Le bruit de fond ignoré (aucun agent reconnu) ne repousse volontairement pas ce délai, puisque c'est justement le cas qu'on veut détecter (une conversation qui ne s'adresse à aucun agent, comme lors de l'incident).
|
||||
|
||||
**Généralisation multi-agents (2 septembre).** Jean-Marc a souhaité que l'information "à quel agent s'adresse la note" soit explicitement stockée plutôt que sous-entendue, en vue d'un futur système où plusieurs assistants IA nommés se partageraient les tâches (voir réflexions stratégiques, section 11, le "bureau à l'ancienne"). Nouvelle table `ASP_Agents` :
|
||||
|
||||
```sql
|
||||
CREATE TABLE `ASP_Agents` (
|
||||
`AGN_Incr` int NOT NULL,
|
||||
`AGN_Nom` varchar(20) NOT NULL,
|
||||
`AGN_Fonction` varchar(40) NOT NULL,
|
||||
`AGN_Variantes` varchar(200) NOT NULL,
|
||||
`AGN_Defaut` varchar(1) NOT NULL DEFAULT 'N'
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
|
||||
```
|
||||
|
||||
`micro.js` charge cette liste au démarrage via un nouvel endpoint `agents.php` (GET, même principe que `utilisateurs.php`), et construit dynamiquement le motif de reconnaissance de chaque agent — plus aucun agent codé en dur dans le script. `lilou_notes.php` a été renommé `agent_notes.php` (il ne sert plus un seul agent) et accepte désormais `{agent, lignes}` en entrée.
|
||||
|
||||
**AGN_Variantes — tolérer les confusions sans coder en dur.** Après trois cas réels indépendants de confusion de reconnaissance le même jour (Lilou/Milou/Loulou, Matilda/Mathilda/Mathilde, Karl/Carl), le mécanisme a été généralisé : chaque agent porte en base une liste de graphies alternatives (`AGN_Variantes`, séparées par une virgule), repliées dans le motif de reconnaissance de son nom — modifiable par Jean-Marc directement en base, sans code. Règle explicitement posée à cette occasion : une variante doit rester un nom propre ou un mot rare en tête de phrase, jamais un mot français courant ("car", "calme"...), qui déclencherait l'agent sur n'importe quelle phrase du quotidien commençant par ce mot. Seule exception qui reste codée en dur : l'homophone "les loups" pour la clôture de Lilou, qui porte sur la phrase entière et non sur le seul prénom (aujourd'hui inerte, Lilou n'étant plus dans `ASP_Agents` — voir plus bas).
|
||||
|
||||
**AGN_Defaut — agent de repli piloté par la donnée.** Le champ `agent`, s'il arrive vide dans `agent_notes.php` (compatibilité avec un client qui ne le renseignerait pas), résout désormais l'agent à utiliser via `ASP_Agents.AGN_Defaut = 'O'`, avec un repli supplémentaire sur le premier agent de la table si aucun n'est marqué par défaut. Plus aucun nom d'agent figé en dur dans le code, y compris côté `micro.js` (titre du panneau de notation, secours en cas d'échec de chargement de `agents.php`).
|
||||
|
||||
**Retrait de Lilou et Karl (décision de Jean-Marc).** Les essais réels ont montré des confusions de reconnaissance récurrentes et non résolues sur ces deux noms — "car"/"calme"/"Carl" pour Karl (une notation entière restée bloquée, jamais refermée, lors d'un essai), "Philou"/"loulou" en plus de "Milou" pour Lilou. Plutôt que d'empiler encore des tolérances, avec le risque à la fois de multiplier les faux déclenchements (sur des mots français courants) et de fragiliser le système face à un accent ou une prononciation différente de celle testée, Jean-Marc a choisi de retirer ces deux agents plutôt que de corriger indéfiniment. Liste active à l'issue de cette session : **Viktor** (Agent Commercial, variante "Victor"), **Matilda** (Agent Administratif, variantes "Mathilda"/"Mathilde", agent par défaut), **Léon** (Agent Commercial Export, aucune variante nécessaire à ce jour), **Nikita** (Agent Financier, aucune variante nécessaire à ce jour) — ces deux derniers n'ayant provoqué aucune confusion observée en essai réel.
|
||||
|
||||
**Méthode de travail à noter pour la suite.** Plusieurs diagnostics de cette session (le bug "les loups", un déploiement resté sur l'ancien `lilou_notes.php` après le renommage, les confusions Matilda/Karl/Viktor) ont été résolus après avoir explicitement demandé à Jean-Marc une preuve concrète (export SQL exact, ligne de console) plutôt qu'en tentant une nouvelle correction à l'aveugle sur simple hypothèse — approche à reconduire systématiquement.
|
||||
|
||||
**État à la fin de cette session.** Fonctionnalité validée de bout en bout sur les quatre agents actifs (ouverture → contenu → clôture, y compris avec variantes de prononciation). Version applicative incrémentée une fois pour cette session, **V1.006**.
|
||||
|
||||
**Reste à faire.**
|
||||
- Push GitHub de `micro.js` et `lilou_notes.php` (Jean-Marc, en cours).
|
||||
- Réécriture de `lilou_notes.php` pour insérer dans `ASP_ConsignesVoix` (Claude, une fois le point précédent fait) — un `INSERT` par ligne de dictée, `au fur et à mesure` comme demandé par Jean-Marc.
|
||||
- Vérifier que le format envoyé par `micro.js` reste compatible avec le nouvel endpoint, ou adapter `micro.js` si besoin.
|
||||
- Test de bout en bout à refaire et confirmer.
|
||||
- Vérifier concrètement que le `.htaccess` du dossier `/journal` bloque bien l'accès direct (`curl -I` sur un fichier du dossier doit répondre `403`, pas `200`) — point resté en suspens depuis le 31 août, sans lien direct avec Lilou mais noté ici pour mémoire tant que ce brouillon n'est pas remplacé par la version finale.
|
||||
- Une fois la fonctionnalité validée de bout en bout : remplacer ce brouillon par une version définitive de la section 27, avec une numérotation de version applicative si de nouveaux changements de code l'accompagnent.
|
||||
- Étape 2 : règles d'interprétation du contenu dicté (aujourd'hui stocké tel quel, sans traitement), envisagées via n8n, avec des règles modifiables par l'utilisateur.
|
||||
- Continuer à observer les agents actifs en usage réel ; envisager d'autres retraits, ou l'ajout de nouvelles variantes via `AGN_Variantes`, si de nouvelles confusions apparaissent — sans jamais y ajouter un mot français courant.
|
||||
- Vérifier concrètement que le `.htaccess` du dossier `/journal` bloque bien l'accès direct (`curl -I` doit répondre `403`, pas `200`) — point resté en suspens depuis le 31 août, sans lien avec le pilotage vocal mais toujours ouvert.
|
||||
- Documentation utilisateur : pas encore mise à jour pour cette fonctionnalité, encore en phase d'essais techniques (choix des noms d'agents notamment) — à envisager une fois l'usage stabilisé.
|
||||
|
||||
Reference in New Issue
Block a user