UADIA · Système EAAE Gaze — version convergée V8.3 · Mr So Olveson System

Défilement piloté par le regard : synthèse technique et mathématique

Description formelle du pilote oculaire de bout en bout : du maillage facial à la vitesse de défilement, avec une couche vocale optionnelle de contrôle Pause / Play raccordée au même état moteur.

Étages perception · calibration · lissage · champ documentaire · intention · actuation Voice control Mr So Olveson System · Pause / Play · diagnostic vocal Noyau MediaPipe Face Landmarker + modèle relationnel local

Équation maîtresse — sortie unique

vY(t) = clamp( ℓ(t) × gL × TbVP × Ŝ × Č × Û , −ρmax , +ρmax ) × Hvis(t)

où ℓ intègre le profil de taux Ly(ŷ), Ŝ le champ documentaire, Č la continuité de lecture, Û la rétroaction d'intention. Aucun de ces facteurs n'émet de commande : chacun module la seule et même vitesse.

Partie 1

Invariant fondateur : un seul champ de sortie

Le système obéit à une contrainte architecturale unique dont tout le reste découle : à chaque instant, le moteur produit une et une seule grandeur de mouvement, la vitesse de défilement vertical vY (et, sur les conteneurs horizontaux, son homologue vX). Tous les termes du modèle sont des modulateurs multiplicatifs de ce champ ; aucun n'ouvre une seconde trajectoire, aucun ne recentre indépendamment la position, aucun n'additionne sa propre vitesse.

Cette discipline écarte par construction le défaut classique des interfaces oculaires : deux contrôleurs qui se disputent la position et entrent en oscillation. Ici le champ documentaire, la continuité de lecture et l'intention gestuelle sont des gains bornés appliqués en cascade ; leur produit reste, dimensionnellement et sémantiquement, une vitesse. La lisibilité du comportement est un théorème plutôt qu'un réglage.

Conséquence de conception. Toute fonctionnalité nouvelle doit s'exprimer comme un facteur dans l'équation maîtresse, jamais comme une écriture concurrente de la position. C'est le critère d'admission de chaque module décrit ci-dessous.
Partie 2

Chaîne de signal

Le flux va de l'image caméra à l'écriture du défilement en six étages séquentiels. Chaque étage transforme une représentation dans le repère de la précédente et ne réintroduit jamais une unité déjà quittée — en particulier, la position filtrée du regard demeure adimensionnelle jusqu'à la toute dernière projection.

01
Maillage facial
MediaPipe, 478 points, iris inclus, ~24 Hz
02
Extraction brute
ratios iris, pose de tête (yaw, pitch)
03
Fusion adaptative
poids œil/tête selon fiabilité mesurée
04
Calibration + One-Euro
→ (x̂, ŷ) ∈ [0,1]²
05
Champ de mouvement
Ly · Ŝ · Č · Û
06
Actuation
intégration sous-pixel, projection viewport

Le point de bascule conceptuel se situe à l'étage 4 : le regard y devient une coordonnée normalisée stable, indépendante du format d'affichage. Tout ce qui précède vit dans l'image caméra ; tout ce qui suit vit dans un espace de taux adimensionnel, converti en pixels seulement au dernier geste.

Partie 3

Étage perceptif : estimation du regard

Attributs bruts

Pour chaque œil, la position de l'iris est ramenée à un ratio entre les commissures et entre les paupières, ce qui absorbe la taille apparente de l'œil :

xœil = (irisx − min(ox, ix)) / |ix − ox|
yœil = (irisy − min(ty, by)) / |by − ty|

avec (o, i) les coins externe/interne et (t, b) les paupières. On moyenne les deux yeux : gazeX = (xR+xL)/2, gazeY = (yR+yL)/2. La pose de tête découle de l'écart du nez au centre du visage, normalisé par ses dimensions :

yaw = (nezx − f̄x) / fW
pitch = (nezy − f̄y) / fH

Fusion adaptative œil / tête

Le poids relatif de l'iris et de la pose de tête n'est pas fixe : il suit la fiabilité instantanée de chaque source. On mesure l'ouverture palpébrale, la gigue (écart-type glissant sur huit trames) et la qualité lumineuse L, puis :

ReOeil = clamp( so × sstab × (0,55 + 0,45×L) )
ReTete = clamp( hstab × (0,72 + 0,28×L) )
PoOeil = clamp( ReOeil / (ReOeil + ReTete), 0,16, 0,84 )
PoTete = 1 − PoOeil

ReOeil et ReTete décrivent la fiabilité instantanée des deux sources ; PoOeil et PoTete déterminent ensuite leur poids dans la fusion — ces variables ne constituent aucune catégorie morphologique et ne sont jamais mémorisées. Lorsque l'iris devient instable, la pose de tête gagne du poids au lieu de forcer un point oculaire incertain.

Confiance et incertitude

Une confiance scalaire κ agrège trois qualités — signal, calibration, lumière :

κ = clamp( 0,50×qsig + 0,35×qcal + 0,15×L )
qsig = ReOeil×PoOeil + ReTete×PoTete

où qcal = clamp(1 − 2,5×rmse, 0,3, 1) relie la confiance à l'erreur résiduelle de calibration (Partie 4). L'incertitude spatiale σ est exprimée comme une fraction du plus petit côté visible, donc invariante au format : σvp = max(24/m, (1−κ)×0,16 + 24/m), m = min(Wvis, Hvis). Plus la confiance chute, plus la distribution du regard s'élargit — ce qui adoucit mécaniquement le champ documentaire.

Partie 4

Calibration : référentiel quadratique régularisé

La calibration mappe les attributs bruts vers une coordonnée écran normalisée par une régression ridge sur un plongement quadratique de dimension 14 :

φ(r) = [ 1, x, y, x², y², x×y, yaw, pitch, yaw×x, pitch×y, PoOeil×(x−0,5), PoOeil×(y−0,5), PoTete×yaw, PoTete×pitch ]

Les termes croisés yaw×x et pitch×y couplent la pose de tête au regard oculaire ; les termes pondérés par PoOeil, PoTete laissent la fusion moduler continûment la contribution de chaque source dans le mapping lui-même. Pour chaque axe a ∈ {X,Y}, on résout :

wa = argminw Σᵢ₌₁ᴺ ( φ(ri)ᵀ×w − ta,i )² + λ‖w‖²
λ = 5×10⁻³ · N ≥ 30

soit, en équations normales, (ΦᵀΦ + λI) wa = Φᵀta. La régularisation λ maintient le conditionnement du système 14×14 malgré la corrélation des monômes quadratiques. La prédiction est affine dans le plongement :

v̂a = clamp( φ(r)ᵀ×wa, −0,15, 1,15 )
rmse = √( (1/N) × Σᵢ ‖(x̂, ŷ)ᵢ − tᵢ‖² )

Le modèle (poids, rmse, horodatage) est stocké localement sous uadia.gaze.calibration.v2 ; aucune donnée biométrique persistante ne quitte l'appareil, et la rmse réinjecte sa qualité dans κ.

Partie 5

Lissage One-Euro

Le regard prédit est filtré par un One-Euro — un passe-bas dont la fréquence de coupure croît avec la vitesse du signal, ce qui résout le compromis gigue/latence mieux qu'une constante fixe : en fixation le seuil descend et étouffe le bruit, en saccade il monte et efface le retard.

τ(fc) = 1 / (2πfc)
α(fc, Δt) = 1 / (1 + τ/Δt)
ẋ̂ ← ẋ̂ + α(fd, Δt) × (ẋ − ẋ̂)
fc = fmin + β × |ẋ̂|
x̂ ← x̂ + α(fc, Δt) × (x − x̂)

Le filtre agit dans le repère normalisé [0,1]², avant toute projection pixel : le lissage porte sur la grandeur invariante, non sur des pixels dont l'échelle change avec le viewport. Les métadonnées (κ, σ, poids) sont lissées séparément pour ne pas appliquer deux passe-bas successifs à la position.

ParamètreAxe XAxe YRôle
f_min1.18 Hz1.05 Hzcoupure au repos (gigue de fixation)
β0.0550.045réactivité à la vitesse (latence de saccade)
d_cutoff1.01.0lissage de la dérivée
Surface de réglage. Ces valeurs sont le point d'ajustement principal du ressenti : monter fmin et β si le curseur traîne, les baisser s'il frétille en fixation. Le reste de la chaîne n'a pas à bouger pour accorder la douceur perçue.
Partie 6

Référentiel normalisé et projection tardive

L'état filtré du regard v = (x̂, ŷ) ∈ [0,1]² ne mémorise aucun pixel. La conversion vers l'écran n'intervient qu'en fin de chaîne, contre le viewport visuel courant :

px(t) = oL(t) + x̂ × Wvis(t)
py(t) = oT(t) + ŷ × Hvis(t)

où (oL, oT) et (Wvis, Hvis) proviennent de window.visualViewport, et suivent donc l'apparition des barres du navigateur, le clavier virtuel, le pincement-zoom ou la rotation. Il en résulte un invariant qui fonde tout l'étage cinématique :

Invariant de format. Pour un regard normalisé v constant, tout changement H1 → H2 de la géométrie visible vérifie ŷ constant ⇒ Ly(ŷ) constant. Seule la conversion finale en pixels se met à l'échelle par Hvis. Une transformation de format ne peut donc plus déplacer le point de fonctionnement de Ly vers la zone morte — la cause historique du non-défilement mobile est éliminée à la racine.

Corollaire opératoire : la cinématique est calculée en viewport par seconde (grandeur sans dimension d'écran), la conversion en pixels par seconde étant la dernière opération. La vitesse angulaire de lecture reste ainsi constante quel que soit le format.

Partie 7

Le champ de mouvement : l'équation unique

Le cœur du système compose quatre facteurs en un seul taux, borné puis projeté. En notant ℓ l'intégrateur lissé du profil de taux :

rY = clamp( ℓ × gL × TbVP × Ŝ × Č × Û, −ρmax, +ρmax ) [viewport/s]
vY = rY × Hvis [px/s]

avec gL = 1,16, TbVP = 0,086 (fraction de viewport parcourue par seconde pour |Ly| = 1) et ρmax = 2,10. Les quatre facteurs sont détaillés ci-après.

7.1 — Ly(y) : contrôle en taux, non en position

Le profil Ly : [0,1] → ℝ mappe la hauteur du regard vers un taux de défilement (et non vers une position cible). Il est interpolé par splines PCHIP monotones — continuité C¹ sans dépassement, garantissant qu'un regard porté un peu plus haut ne produit jamais un recul parasite. Une zone morte [0,27 ; 0,64] annule le taux : c'est la bande de lecture confortable, où l'œil peut résider sans déclencher de mouvement.

Ly(y) = 0 pour y ∈ [0,27 ; 0,64]
Ly(1,00) = +4,10 · Ly(0,00) = −3,10

Sous la zone morte, Ly < 0 (remontée) ; au-dessus, Ly > 0 (progression), avec une pente croissante vers les bords qui donne une réserve d'accélération volontaire.

7.2 — Ŝ (SDoc) : champ documentaire géométrique

SDoc pondère la vitesse selon ce que le regard recouvre réellement dans le document. Le regard est traité comme une masse de probabilité ; pour chaque surface, on mesure le recouvrement relatif ρ = aire(boîte regard ∩ élément) / aire(boîte regard), dont on tire un score :

scoreᵢ = ρᵢ × κ × (0,82 + 0,18√aᵢ) × (0,72 + 0,28√νᵢ)

où aᵢ est l'aire visible normalisée et νᵢ le taux de visibilité de l'élément. Une activation par seuil, douce en deçà et saturante au-delà, évite tout basculement brusque :

Si scoreᵢ < θᵢ : actiMdᵢ = 0,26 × scoreᵢ / θᵢ
Si scoreᵢ ≥ θᵢ : actiMdᵢ = 0,26 + 0,74 × (scoreᵢ − θᵢ) / (1 − θᵢ)

La valeur documentaire est la moyenne pondérée des cinq surfaces dominantes, puis atténuée par la confiance :

Saem = Σᵢ∈top5 (sDocᵢ × wᵢ) / Σᵢ wᵢ
Ŝ = fond + (Saem − fond) × κ ∈ [0,34 ; 1,25]

7.3 — Č (Cread) : continuité de lecture

Cread maintient le mouvement pendant les micro-interruptions du regard de lecture — les retours-ligne saccadiques qui, sans lui, provoqueraient un bégaiement à chaque ligne. C'est un intégrateur à fuite asymétrique : montée rapide (145 ms), descente lente (820 ms), piloté par la cohérence de la demande et la confiance :

C* = clamp( (|ℓ| − 0,08) / 0,70 ) × (0,58 + 0,42×κ′)
Č ← Č + α(τ↑/↓) × (C* − Č)

Cread agit à deux endroits, toujours comme modulateur du champ unique : un facteur direct Čf = 0,86 + 0,14×Č ∈ [0,86 ; 1], et un plancher de continuité sous SDoc entre deux éléments :

fC = fond + (0,64 − fond) × Č
Si maintien actif : Ŝeff = Ŝ
Sinon : Ŝeff = max(Ŝ, fC)

La lecture engagée ne « retombe » donc pas dans le fond documentaire entre deux paragraphes : elle conserve un socle de vitesse le temps que le regard rejoigne la surface suivante.

7.4 — Û (Uintent) : rétroaction d'intention

Uintent lit le geste du regard — la dérivée de la position oculaire et de la pose de tête — pour confirmer ou contredire le sens en cours, sans jamais émettre de commande propre. Chaque source passe par une tangente hyperbolique bornée, puis est fusionnée par les mêmes poids œil/tête :

gœil = tanh(4,6 × ẏœil)
gtête = tanh(5,4 × ṗitch)
σI = (gœil×PoOeil + gtête×PoTete) / (PoOeil + PoTete)

L'accord entre le geste et le sens du taux, a = sign(ℓ) × σI, module un gain d'intention borné :

U* = clamp( 1 + 0,26×max(0,a) − 0,18×max(0,−a), 0,76, 1,24 )

Point clé de la version convergée : l'autorité de l'intention décroît quand la lecture s'engage. Le geste ne doit pas injecter de gigue pendant une lecture continue :

A = clamp(1 − 0,88×Č, 0,12, 1)
Û = 1 + (U* − 1) × A

Quand Č → 1 (lecture établie), A → 0,12 et Û → 1 : l'intention gestuelle s'efface presque entièrement, supprimant le bruit de dérivée là où il gênait le plus. En exploration (Č faible), l'autorité remonte et le geste retrouve son pouvoir de confirmation. Ce conditionnement croisé Cread–Uintent est ce qui distingue un simple empilement de gains d'un modèle dont les termes se déterminent mutuellement.

Partie 8

Intégration et actuation

Lisseurs et retour continu à zéro

Tous les lissages emploient la forme indépendante du framerate α = 1 − e^(−Δt/τ). Le profil est intégré (τℓ = 86 ms), puis la vitesse suit sa cible (τout = 108 ms). En zone morte, la vitesse glisse vers zéro au lieu d'être téléportée :

Si d = 0 : v ← v + (0 − v) × α(τstop)
τstop = 145 ms
v := 0 si |v| < εstop

Chaque incursion du regard dans la zone morte — retour-ligne, micro-saccade — produit ainsi une décélération continue, non une coupure sèche. C'est l'un des deux correctifs majeurs du bégaiement perçu.

Accumulateur sous-pixel

L'intégration de position vit dans un flottant interne, découplé de la quantification pixel du navigateur. On n'intègre jamais depuis un scrollTop relu et arrondi ; on se resynchronise seulement si un écart franc trahit une reprise manuelle :

pF ← clamp( pF + v×Δt, 0, Smax )
pF := scrollTopréel seulement si |pF − scrollTopréel| > 3 px

À vitesse de lecture, où l'incrément par trame est inférieur au pixel, cet accumulateur supprime le motif de battement de la troncature répétée. Il subsiste un plancher irréductible : le rendu de scrollTop reste quantifié au pixel physique ; l'accumulateur amène exactement à ce plancher.

Neutralisation du lissage natif et garde de confiance

Pendant l'actuation, le défilement doux CSS (scroll-behavior: smooth) est neutralisé sur l'axe vertical et horizontal : sans cela, l'animation d'inertie du navigateur poursuit une cible que l'intégrateur réécrit soixante fois par seconde — deux boucles de contrôle en conflit, source majeure de saccade et de latence. Enfin, une garde de confiance à mémoire (temporisation de 420 ms avant abandon) évite qu'une trame sous le seuil ne détruise instantanément l'état : le signal fluctue, le mouvement non.

Partie 9

Propriétés et invariants

Partie 10

Limites et extensions

La version convergée résout la classe fluidité/contrôle. Le chantier ouvert relève d'un autre axe — la précision — et se distingue par un symptôme différent : non pas un à-coup, mais une visée qui dérive lorsque la tête se déplace.

Le plongement de calibration φ ne contient que la rotation de tête (yaw, pitch) ; il n'a ni proxy de distance ni terme de translation. Or l'extraction brute calcule déjà la largeur fW et le centre f̄ = (f̄x, f̄y) du visage — le substrat est présent, seulement non consommé. L'extension naturelle augmente le plongement :

φ′(r) = [ φ(r) ∥ fW, f̄x, f̄y, fW×x, fW×y, f̄x×x, f̄y×y ]

où fW agit comme surrogat de distance (angle visuel) et (f̄x, f̄y) capturent la translation latérale ; les interactions avec x, y corrigent la déformation du mapping quand l'utilisateur s'approche, recule ou se décale. Le surcoût est de quelques dimensions, trivial pour la résolution ridge, et rétrocompatible avec la calibration existante.

Deux réserves mineures complètent le tableau : le modèle temporel exporté vers ONNX reste à l'état d'échafaudage et, s'il était activé, hériterait d'un biais de distribution (fenêtres d'apprentissage restreintes aux fixations, alors que le régime réel est la lecture) ; et le plancher de rendu de scrollTop ne peut être franchi qu'en abandonnant le défilement natif au profit d'une transformation translateY — changement lourd rarement justifié.

Prochain incrément net. Augmenter φ → φ′ avec distance et translation, en conservant la calibration existante comme sous-cas. C'est le seul levier substantiel encore ouvert, et il est orthogonal à tout ce qui précède.
Partie 11

Compatibilité landings / pages

Comment rendre la landing receveuse du système compatible

Le moteur n'exige pas que la page soit reconstruite autour de lui. Une landing existante reste receveuse si elle conserve le défilement vertical natif du document, charge le dossier gaze/, puis expose au moteur les surfaces particulières qu'elle souhaite qualifier. Les éléments éditoriaux standards — titres, paragraphes et listes — sont déjà détectés automatiquement.

1 · Défilement vertical natif

Le moteur V8.3 pilote document.scrollingElement. La page peut conserver sa mise en page, ses sections et ses effets visuels, mais ne doit pas remplacer le scroll principal par un conteneur vertical privé sans adaptation du runtime.

2 · Référentiel viewport

Conserver la balise viewport. Le moteur travaille en coordonnées normalisées puis projette via visualViewport, ce qui maintient la même logique sur Desker, mobile, rotation et changement de hauteur visible.

3 · Dossier moteur

Placer le dossier gaze/ à côté de la page ou adapter explicitement les chemins d'import. Le CSS, le contrôleur, l'estimateur, la calibration et l'interface restent ainsi modulaires.

4 · Caméra + microphone optionnel

La caméra reste nécessaire au gaze. Le microphone est facultatif et n’est demandé que si le Voice Control est activé. Les deux accès passent par navigator.mediaDevices.getUserMedia() et restent soumis au consentement explicite de l’utilisateur.

Chargement minimal

La landing receveuse charge d'abord le style du moteur, puis le contrôleur de scroll global, puis le module principal. L'ordre est volontaire : UadiaGazeEngine détecte window.UadiaGazeScrollScale lors de son montage.

En V8.3, UadiaGazeEngine importe automatiquement UadiaGazeVoiceControl.js. Aucun second script vocal n’est à ajouter dans la landing receveuse.

<link rel="stylesheet" href="gaze/gaze-engine.css?v=20260914-8v3-so-olveson"> <script src="gaze/UadiaGazeScrollScale.js?v=20260914-8v3-so-olveson"></script> <script type="module"> import { UadiaGazeEngine } from './gaze/UadiaGazeEngine.js?v=20260914-8v3-so-olveson'; const gaze = new UadiaGazeEngine({ autoPrompt: true, debug: false, profile: 'reading', useScrollScale: true }); window.UADIA_GAZE = gaze; gaze.mount().catch((error) => console.error('[UADIA Gaze]', error)); </script>

Neutraliser les contrôleurs CSS concurrents

Une landing peut conserver scroll-behavior: smooth pour son usage normal. Pendant l'actuation gaze, il faut toutefois laisser l'intégrateur V8.3 être l'unique contrôleur de position. La classe uadia-gaze-actuating est posée par le moteur ; la page receveuse doit lui donner priorité.

html.uadia-gaze-actuating { scroll-behavior: auto !important; } html.uadia-gaze-actuating [data-gaze-slide="x"] { scroll-behavior: auto !important; }
Règle de compatibilité. Toute animation CSS ou JavaScript qui écrit elle aussi continuellement scrollTop ou scrollLeft pendant l'actuation recrée un second contrôleur. Elle doit être suspendue, neutralisée ou explicitement intégrée au moteur.

Surfaces documentaires

Les balises h1 à h4, p et li sont déjà reconnues par le champ documentaire. Une landing simple n'a donc pas besoin d'annoter chaque paragraphe. Les attributs data-gaze-* servent à préciser les composants particuliers : cartes, CTA, carrousels, sections éditoriales ou zones à ignorer.

AttributFonctionUsage
data-gaze-zoneDéclare une surface documentaire explicite.Carte, bloc ou composant personnalisé.
data-gaze-anchorDéclare un repère structurel dans la page.Section principale ou point de lecture.
data-gaze-sdocFixe la valeur SDoc propre à la surface.Moduler l'influence documentaire sans changer le moteur.
data-gaze-thresholdFixe le seuil de recouvrement/activation.Ajuster la sensibilité d'un composant.
data-gaze-priorityFixe sa priorité dans l'agrégation.Distinguer un élément principal d'un conteneur parent.
data-gaze-holdTransforme la zone en surface de maintien faible.CTA ou zone où le scroll doit être fortement réduit.
data-gaze-ignoreExclut l'élément et ses descendants.UI flottante, décor ou contenu non sémantique.
data-gaze-slide="x"Autorise l'actuation horizontale du conteneur.Carrousel avec overflow-x.

Exemple de section receveuse

<section id="presentation" data-gaze-anchor="presentation" data-gaze-zone="presentation" data-gaze-sdoc="0.84" data-gaze-threshold="0.10" data-gaze-priority="0.82"> <h2>Titre de la section</h2> <p>Le texte est automatiquement reconnu comme surface de lecture.</p> </section>

Carrousel horizontal compatible

<div class="resource-carousel-track" data-gaze-slide="x" data-gaze-zone="resource-carousel" data-gaze-sdoc="0.34" data-gaze-threshold="0.14"> ... </div>

Critère de réception

Une page est compatible lorsque le moteur peut conserver son regard en [0,1]², lire la géométrie documentaire, être seul à écrire le déplacement pendant l'actuation et projeter la vitesse sur le viewport courant. Elle est à adapter lorsqu'un framework remplace le scroll du document, lorsqu'un autre moteur d'inertie réécrit continuellement la position, ou lorsqu'un composant personnalisé n'est ni sémantique ni déclaré par data-gaze-zone.

Principe. La compatibilité ne consiste pas à réécrire la landing pour le gaze. Elle consiste à laisser la page décrire ses surfaces et à garantir qu'un seul contrôleur possède la position de scroll au moment où le système actue.
Partie 12

Mr So Olveson System · Voice Control

La V8.3 ajoute une couche vocale facultative appelée Mr So Olveson System. Son rôle est volontairement limité : résoudre une phrase parlée vers l’un des deux états Pause ou Play. Elle ne constitue pas un moteur de défilement supplémentaire.

Invariant architectural. Le microphone ne calcule aucune vitesse, ne modifie ni Ly, ni SDoc, ni Cread, ni Uintent, et n’écrit jamais scrollTop. Une commande vocale appelle exactement le même état Pause / Play que le bouton visuel.

Chaîne de résolution sonore

V·01
Microphone
entrée audio optionnelle, consentement séparé
V·02
SpeechRecognition
reconnaissance navigateur, jusqu’à 5 alternatives
V·03
Transcription
phrase finale visible + confiance si disponible
V·04
Résolution
exacte d’abord, puis tolérante et conservatrice
V·05
État moteur
Pause / Play via le même handler que le bouton
Audio → SpeechRecognition → transcription → confiance → résolution → Pause / Play

Commandes configurables

Les commandes par défaut sont « scroll pause » et « scroll play ». Elles peuvent être remplacées dans le panneau sans modifier le moteur. Les deux expressions doivent rester différentes. La langue acoustique de reconnaissance peut être choisie indépendamment entre Français · fr-FR et English · en-US.

ParamètreValeur V8.3Fonction
Pausescroll pausePlace immédiatement l’état de scroll en pause après résolution.
Playscroll playRéactive le scroll seulement si caméra, calibration et runtime sont prêts.
Languefr-FR / en-USPréférence acoustique transmise à SpeechRecognition.
Alternatives≤ 5Compare plusieurs hypothèses retournées par le navigateur.
Cooldown900 msÉvite le double déclenchement immédiat d’une même commande.

Résolution exacte puis tolérante

L’égalité exacte reste prioritaire. Lorsque la transcription diffère légèrement, Mr So Olveson applique une similarité de Levenshtein normalisée sur la phrase complète, et non sur un mot isolé. Une résolution tolérante n’est acceptée que si le meilleur score atteint 0,82 et conserve au moins 0,10 d’avance sur la commande opposée.

ScoreTolérant ≥ 0,82
et
ScoreGagnant − ScoreOpposé ≥ 0,10

Les seuils de confiance diffèrent selon le type de résolution : une correspondance exacte peut être acceptée à partir de 0,18 lorsque la confiance est fournie, tandis qu’une correspondance tolérante exige 0,45. Si l’API ne fournit pas de confiance exploitable, la commande n’est pas rejetée pour cette seule raison.

Diagnostic vocal observable

La V8.3 expose toutes les transcriptions finales utiles, y compris lorsqu’elles sont rejetées. Le panneau sépare ainsi les étapes qui étaient auparavant confondues :

Mr So Olveson · diagnostic vocal Entendu : « scroll pose » Confiance : 0,78 Résultat : PAUSE · tolérant

Consentement, capture et dépendance navigateur

Le microphone reste facultatif. Lorsqu’il est activé, le système demande l’accès audio avec réduction d’écho, réduction de bruit et contrôle automatique du gain. Le flux ouvert pour l’autorisation est refermé après la demande, puis SpeechRecognition gère la reconnaissance selon les capacités du navigateur.

Limite de confidentialité à documenter correctement. UADIA ne conserve pas d’enregistrement audio dans cette couche. En revanche, SpeechRecognition / webkitSpeechRecognition peut dépendre d’un service fourni par le navigateur ou son éditeur. La documentation ne doit donc pas présenter cette reconnaissance comme nécessairement locale tant que le runtime utilisé ne le garantit pas explicitement.

État stable V8.3 et prochain jalon

La V8.3 est retenue comme jalon stable : la commande vocale est reconnue, résolue et raccordée au même état moteur que le bouton. Le prochain incrément ne concerne plus la compréhension de la voix mais la latence de rupture entre le début de la commande Pause et l’arrêt effectif du scroll.

Dans la V8.3 actuelle, interimResults = false : seule une transcription finale peut déclencher la commande. L’optimisation future devra donc prioriser la rupture Pause — par exemple en évaluant prudemment un résultat intermédiaire suffisamment certain — sans réintroduire de faux positifs ni créer un second contrôleur.

Jalon suivant. Réduire Voice Stop Latency tout en conservant l’invariant : une voix → un état → un seul moteur de scroll.