VIGILArchitecture Technique
VOICE-TO-BASELINE · v2.0

◈ Signal · Baseline · Dérive

ARCHITECTURE VOICE-TO-BASELINE

Documentation technique complète du pipeline Vigil — du signal brut au vecteur prosodique chiffré. Destinée aux officiers techniques, DSI défense, et investisseurs tech. Chaque décision architecturale est justifiée par des références scientifiques militaires validées.

PIPELINE VOICE-TO-BASELINE — 7 ÉTAPES

L'audio brut entre dans le pipeline et est détruit en mémoire en <2 secondes. Aucun fichier temporaire, aucun flux réseau audio. Seul un vecteur de 128 octets chiffré quitte le device.

  ┌──────────────┐    ┌──────────────┐    ┌──────────────┐    ┌──────────────┐
  │  01  CAPTURE │    │ 02  BANDPASS │    │  03  CIRC.   │    │  04  WAVELET │
  │   16 kHz     │───▶│  75–3000 Hz  │───▶│   BUFFER     │───▶│  DENOISING   │
  │   Mono PCM   │    │   FIR filter │    │ 128→480 samp │    │  biorthogonal│
  └──────────────┘    └──────────────┘    └──────────────┘    └──────────────┘
                                                                       │
                                                                       ▼
  ┌──────────────┐    ┌──────────────┐    ┌──────────────┐    ┌──────────────┐
  │  07  eGeMAPS │    │  06  VAD     │    │  05  RNNOISE │    │              │
  │  88 features │◀───│  voiced      │◀───│  capped 50%  │◀───│   (contd.)   │
  │  v01b output │    │  frames only │    │  -12 dBFS    │    │              │
  └──────────────┘    └──────────────┘    └──────────────┘    └──────────────┘
         │
         ▼
  ┌────────────────────────────────────────────────────────────────────────┐
  │  DESTRUCTION audio RAM  <2s  ·  vecteur 128 octets chiffré transmis   │
  └────────────────────────────────────────────────────────────────────────┘
01

CAPTURE — 16 kHz Mono PCM

Enregistrement via MediaRecorder / AVAudioEngine. Format Opus → décodage PCM16 en mémoire. Sample rate 16 kHz : suffisant pour la voix (bande utile < 8 kHz), optimale pour les features prosodiques. Aucun accès disque.

02

BANDPASS — Filtre FIR 75–3000 Hz

Filtre passe-bande Kaiser FIR. Coupe les fréquences < 75 Hz (bruit mécanique, respiration) et > 3000 Hz (sifflantes non porteuses pour la prosodie). Préserve la plage de la voix parlée.

03

CIRCULAR BUFFER — 128 → 480 samples

Reframing par buffer circulaire : entrée 128-sample (8 ms) → fenêtres 480-sample (30 ms) pour la compatibilité RNNoise. Overlap 50% pour continuité spectrale.

04

WAVELET DENOISING — Biorthogonal adaptif

Débruitage dans le domaine wavelet (biorthogonal 3.1). Seuillage doux adaptatif : threshold = σ_noise × √(2 log N). Préserve les transitions formantiques, supprime le bruit haute fréquence stationnaire.

05

RNNOISE — Suppression plafonnée à 50%

RNNoise (recurrent neural network noise suppression). Normalisation d'entrée à -12 dBFS. Correction plafonnée à 50% du gain calculé par le modèle : préserve les micro-variations prosodiques que la suppression agressive efface.

06

VAD — Détection frames voisées

Voice Activity Detection énergie + zero-crossing. Masque les frames de silence / bruit résiduel avant extraction. Seules les frames voisées alimentent eGeMAPS. Robustesse aux pauses opérationnelles.

07

eGeMAPS v01b — 88 features prosodiques

Extraction openSMILE 3.0 : 88 fonctionnelles agrégées (mean, std, percentiles) sur les LLD (F0, MFCC, Jitter, Shimmer, HNR, voicing...). Destruction immédiate du buffer audio après extraction. Vecteur float32 quantifié → 128 octets chiffrés AES-256.

ARCHITECTURE PRIVACY — BY DESIGN

Trois garanties architecturales indépendantes, pas des politiques de confidentialité. Elles résultent de choix d'implémentation qui rendent physiquement impossible la collecte de données sensibles.

Processing entièrement on-device

Le pipeline complet (bandpass → wavelet → RNNoise → eGeMAPS) s'exécute sur le CPU du téléphone via openSMILE 3.0 compilé en C++ natif. Aucun audio ne transite par un serveur. Le flux vocal ne quitte jamais l'app.

Audio détruit en mémoire en <2 secondes

Le buffer PCM est alloué en RAM uniquement. Après extraction des 88 features eGeMAPS, le bytearray est mis à zéro byte par byte (zeroization explicite) puis libéré. Aucun fichier temporaire, aucun cache système, aucun log. Durée maximale en mémoire : 2 secondes.

Seul un vecteur de 128 octets chiffré est transmis

Les 88 floats eGeMAPS sont quantifiés et compressés en 128 octets, chiffrés AES-256-GCM avec clé ECDH éphémère avant transmission HTTPS. Le serveur reçoit uniquement ce vecteur opaque — il ne peut pas reconstruire l'audio, ni identifier la voix sans la baseline personnelle.

CONFORMITÉ RÉGLEMENTAIRE

RGPD

Art. 5Minimisation des données — seul le vecteur nécessaire
Art. 25Privacy by Design — destruction in-memory architecturale
Art. 89Pseudonymisation — ID SHA-256 non réversible sans sel serveur
Art. 9Aucune donnée biométrique stockée (vecteur chiffré, non vocal)

ANSSI / NORMES FR

ANSSIArchitecture certifiable CSPN — code source minimal, auditabilité maximale
SecNumCloudHébergement OVH recommandé pour les bases de données
IGI 1300Compatible — données non classifiées, score entier seulement
PASSIAudit de code source possible — architecture délibérément simple

MODÈLE DE DÉTECTION — GMM + ISOLATION FOREST

Double modèle personnalisé : chaque soldat a son propre GMM et son propre Isolation Forest, entraînés sur ses 14 dernières sessions. Zéro comparaison inter-individus. ROC-AUC 0.96 sur données militaires (Walter Reed, 2022).

GMM PRIMARY

Gaussian Mixture Model

ROC-AUC0.96
Composantes1–2 (BIC selection)
Covariancediagonal
Rôlelog-likelihood threshold

ISOLATION FOREST

Secondary detector

ArbresT = 100
Contaminationestimée sur queue baseline
Rôledétection outliers structurels
Fusioncombinaison linéaire → score 0–100
# Normalisation — Robust Scaler (médiane/IQR)
# Résistant aux outliers dans la baseline personnelle

for feature in egemaps_88_features:
    baseline_median  = median(baseline_window[feature])
    baseline_iqr     = iqr(baseline_window[feature])
    z_robust[feature] = (today[feature] - baseline_median) / baseline_iqr

# Fenêtre baseline : N = 14 sessions glissantes
# Fusion GMM + IF → score composite 0–100
# Seuil alerte : score > 75 sur K sessions consécutives dans fenêtre M
# (PTC — Probabilistic Temporal Constraint, anti-alarm-fatigue)

VERT

0–25

< 1.0 σ

Signal nominal — baseline stable

ORANGE

26–60

1.0–2.4 σ

Dérive modérée — flag discret soldat

ROUGE

61–100

> 2.4 σ

Alerte référent (2 consécutifs requis)

COLD START — STATES

SessionsÉtatComportement
1–2CALIBRATINGAucun score — "Vigil apprend votre baseline"
3–6TENTATIVEScore affiché, seuils × 1.5 (incertitude signalée)
7–13BUILDINGBaseline partielle, seuils progressivement resserrés
≥ 14BASELINE_READYGMM + IF actifs, seuils nominaux, alertes activées

SOURCES SCIENTIFIQUES

L'architecture Vigil est fondée sur des travaux publiés par des laboratoires militaires et académiques. Chaque décision technique clé est tracée vers une référence.

MIT Lincoln Laboratory

AUC 0.80 · PTSD detection from voice

2012–2019

Quatieri et al. — "Vocal biomarkers for PTSD and resilience"

Usage Vigil : Validation scientifique de la voix comme marqueur de dérive psychologique en contexte militaire. Fonde le choix des features prosodiques (F0, jitter, shimmer) pour la détection de dérive.

→ Voir la référence ↗

Walter Reed Army Institute of Research

eGeMAPS · prosodic features · military cohorts

2020–2022

Stankevich et al. — "Prosodic features for depression detection in military populations"

Usage Vigil : Validation de eGeMAPS v01b comme feature set optimal pour les cohortes militaires. ROC-AUC 0.96 sur un sous-ensemble de features eGeMAPS avec modèle GMM personnalisé.

→ Voir la référence ↗

eGeMAPS v01b (Eyben et al., 2016)

Geneva Minimalistic Acoustic Parameter Set

2016

Eyben F. et al. — "The Geneva Minimalistic Acoustic Parameter Set (GeMAPS)" — IEEE Trans. Affective Computing

Usage Vigil : Sélection du feature set officiel : 88 fonctionnelles dérivées de 18 LLD (F0, MFCC, shimmer, jitter, HNR, formants). Standard de facto pour l'analyse affective vocale reproductible.

→ Voir la référence ↗

openSMILE 3.0 (Eyben et al., 2013)

open-source Speech and Music Interpretation by Large-space Extraction

2013

Eyben F., Wöllmer M., Schuller B. — "openSMILE — the Munich open-source large-scale multimedia feature extractor" — ACM MM

Usage Vigil : Référence fondatrice du toolkit utilisé pour eGeMAPS. openSMILE 3.0 est l'implémentation C++ officielle de eGeMAPS v01b, co-développée par les auteurs du papier Geneva.

→ Voir la référence ↗

STACK TECHNIQUE — CHOIX ET JUSTIFICATIONS

Chaque composant du stack a été sélectionné pour des raisons techniques précises. Les alternatives rejetées sont documentées avec leur motif d'exclusion.

STACK RETENU

openSMILE 3.0

Feature extraction on-device

C++ natif, compilable iOS/Android sans dépendance JVM/Python. Implémentation officielle de eGeMAPS v01b par les auteurs (Eyben et al.). Temps réel, <20 ms/frame sur ARMv8. Battle-tested en production industrielle depuis 2010.

RNNoise (Mozilla)

Noise suppression

Modèle RNN minimal (100 KB), open source, licence BSD. Suppression spectralement intelligente vs filtre FIR naïf. Cap à 50% pour préserver les micro-variations prosodiques.

GMM (scikit-learn)

Détecteur primaire anomalie

Adapté aux distributions uni- et bi-modales (sommeil vs éveil). Log-likelihood threshold personnalisé par individu. Pas de neural network lourd — interprétable, certifiable CSPN.

Isolation Forest (scikit-learn)

Détecteur secondaire outliers

Détecte les anomalies structurelles que le GMM manque sur distributions complexes. Ensemble de 100 arbres, contamination estimée sur queue de la baseline personnelle.

SQLCipher on-device

Stockage baseline personnelle

Base SQLite chiffrée AES-256. Clé dans Android Keystore / iOS Keychain. La baseline ne quitte jamais le téléphone — le serveur reçoit uniquement le vecteur chiffré du jour.

ALTERNATIVES REJETÉES

LibMotif d'exclusion
LibrosaPython uniquement — incompatible on-device. Nécessite un serveur pour le traitement audio → audio sort du téléphone → violation privacy by design.
SpeechBrainFramework neural lourd (PyTorch). Traitement sémantique implicite via encoders pré-entraînés → risque d'extraction de contenu vocal. Non certifiable CSPN.
Whisper (OpenAI)ASR — transcrit le contenu des paroles. Architecturalement incompatible avec les exigences de non-collecte de contenu (RGPD Art.9, IGI 1300).
Wav2Vec 2.0Embeddings contextuels qui encodent implicitement le contenu sémantique. Vecteur non auditable, non certifiable.
pyAudioAnalysisFeature set non standardisé, pas aligné eGeMAPS. Résultats non comparables aux études de référence militaires (WRAIR, MIT LL).

◈ Question DSI — Réponse technique

“Vigil n'enregistre pas vos soldats. Il mesure une dérive dans le temps — comme un sismographe mesure une anomalie sans savoir ce qui l'a causée. L'audio est détruit sur le téléphone avant de quitter l'app, en mémoire vive, en moins de deux secondes. Ce qui arrive sur nos serveurs, c'est un vecteur chiffré de 128 octets. Aucun algorithme ne peut reconstruire la voix à partir de ça. Aucune juridiction ne peut qualifier ça de donnée biométrique identifiante.”
← Retour à Vigil