Ce qu'est Saphere
Une caméra, trente secondes, et un jeu d’indicateurs physiologiques — sans capteur à distribuer et sans rien à porter pour l’utilisateur.
Saphere mesure des signaux physiologiques à partir d’une vidéo. Une personne regarde la caméra frontale de son téléphone ou la webcam de son ordinateur portable pendant une trentaine de secondes ; la lumière que sa peau réfléchit porte le rythme de son pouls ; Saphere extrait ce rythme et en déduit un jeu d’indicateurs.
Ni brassard, ni ceinture thoracique, ni pince au doigt. Le matériel est celui que vos utilisateurs possèdent déjà.
Les deux pièces
Saphere se livre en deux morceaux, et la plupart des intégrations utilisent les deux.
Saphere Scan est le widget. C’est un module JavaScript unique que vous déposez dans une page ou dans une WebView. Il prend en charge tout le parcours utilisateur — expliquer la mesure, recueillir le consentement, guider la personne dans le cadre, mener la capture, afficher le résultat — et rapporte à votre code ce qui se passe. Vous lui donnez un conteneur et un moyen d’obtenir un jeton ; il fait le reste.
L’API est tout ce qui entoure le widget. Elle émet les jetons courts que le widget présente, accepte une vidéo ou des images déjà enregistrées lorsque vous préférez vous passer du widget, et conserve les mesures pour que vous puissiez les relire plus tard.
Lequel me faut-il ?
Si une personne est présente et que vous voulez une mesure guidée, en direct, prenez le widget. Si vous détenez déjà un fichier enregistré — une vidéo d’entretien, une série de photos — envoyez-le à l’API et passez-vous entièrement du widget.Ce qui revient
Une mesure aboutie rend jusqu’à dix variables :
| Variable | Clé | Unité | Forme de la valeur |
|---|---|---|---|
| Fréquence cardiaque | hr | bpm | number |
| Fréquence respiratoire | br | cpm | number |
| Variabilité cardiaque | hrv | ms | number |
| Niveau de stress | strs | — | { level, scale } |
| Pression artérielle | bp | mmHg | { systole, diastole } |
| Risque tensionnel | bpClass | — | { level, scale } |
| Âge apparent | physicalAge | years | number |
| Indice de masse corporelle | bmi | kg/m² | number |
| IMC estimé du visage | faceBmi | kg/m² | number |
| Score de santé cardiovasculaire | healthScore | — | number |
Deux choses sur cette liste sont faciles à mal comprendre.
Le droit se règle par client, non par requête. Les variables que votre compte peut recevoir sont configurées sur le compte lui-même. Demander une variable à laquelle vous n’avez pas droit ne produit pas d’erreur — elle ne revient simplement pas. Un résultat dont le returnedVariables est vide signifie que le compte n’a encore rien reçu comme droit, ce qui est l’état habituel d’un client de test fraîchement créé.
Certaines variables ont besoin de connaître la personne. L’indice de masse corporelle ne se calcule pas sans la taille et le poids. Les indicateurs tensionnels et cardiovasculaires demandent l’âge, le sexe et le statut tabagique. Vous les fournissez dans userData, soit par l’écran d’informations personnelles du widget, soit directement dans l’appel à l’API. Sans eux, ces variables reviennent porteuses d’une erreur plutôt que d’une valeur.
L’indicateur de qualité
Toute mesure aboutie porte également un signal.qualityScore.
C'est un drapeau, pas une note
qualityScore est binaire : 100 si le signal a livré au moins une fenêtre exploitable pour la calibration tensionnelle, 0 sinon. Ce n’est pas une note sur cent, et il ne dit pas à quel point la mesure est digne de confiance. N’y bâtissez pas une règle du type « rejeter en dessous de 60 » — il n’y a rien entre 0 et 100.Lorsqu’une variable n’a pas pu être calculée, c’est elle qui porte le motif, sous la forme d’un code d’erreur à côté d’une valeur null. C’est là qu’il faut regarder quand une mesure déçoit.
Ce qu’il lui faut pour fonctionner
Saphere lit un signal optique très faible. Les conditions qui le rendent lisible ne se négocient pas, et votre interface devrait aider les utilisateurs à les réunir plutôt que les laisser deviner :
- Un visage éclairé. La lumière ambiante doit tomber sur le visage. Une personne assise devant une fenêtre lumineuse est à contre-jour, et il n’y a pas de signal dans une silhouette.
- Une personne immobile. Le mouvement noie la variation de couleur dont dépend la mesure. Trente secondes assis raisonnablement immobile, voilà l’exigence.
- Un visage découvert. Écharpes, cols montants, bonnets enfoncés et masques retirent tous la peau que la mesure lit.
- Un visage dans le cadre, à la bonne distance. Le widget y guide par une cible à l’écran ; l’API attend la même chose d’un fichier enregistré.
Les écrans d’accueil du widget existent précisément pour transmettre ces quatre points, en dix langues, avant même que la caméra ne s’ouvre.
Limites assumées
Une mesure est une estimation. Elle est tirée d’un signal optique dans des conditions non contrôlées, sur du matériel grand public. Traitez le résultat comme un indicateur, et concevez votre produit pour que l’utilisateur le lise comme tel.
Le widget est conçu pour des adultes. Son propre accueil indique à l’utilisateur qu’il s’adresse aux personnes de 18 à 80 ans, et l’API refuse un age inférieur à 18 ou supérieur à 110.
Une mesure peut échouer, et le dire fait partie du contrat. Une caméra que l’utilisateur refuse, un visage qui quitte le cadre, une lumière qui change à mi-parcours : chacun est rapporté à votre code avec un motif nommé plutôt qu’un échec générique, pour que votre support puisse relire ce qui s’est passé des mois plus tard.