Un moteur, une coquille,
un widget vocal.
L'architecture réellement en service : 21 professeurs, 93 cours, 22 spécialités, 0 séances enregistrées.
Interface Next.js (port 8300)
Interface de pages et d’API proxy : aucune base de données côté Next.js. Les pages de catalogue sont rendues à partir de l’API du moteur ; le navigateur passe par le proxy vocal du moteur.
ui/src/app pages (accueil, cours, classe, atelier, pédagogie, dossier)
ui/src/lib/store.ts catalogue : API moteur -> forme attendue par les pages
ui/src/lib/engine.ts fetch serveur + clé de service (X-Service-Key)
ui/src/app/api/seance enregistrement des séances vocales (côté serveur)Moteur myVirtualTeacher (port 8200)
Node.js sans framework + MySQL. Il détient les données (professeurs, cours, connaissances, séances), l'authentification, l'API REST et le proxy WebSocket vers PersonaPlex. Il sert aussi l'application PWA d'origine.
server/index.js HTTP/HTTPS, fichiers, proxy WS /ws/plex
server/router.js API REST + clé de service pour l'interface
server/db.js MySQL (MAMP, 127.0.0.1:8889)
public/widget/ widget vocal réutilisable
data/schema.sql professors · courses · knowledge · sessionsWidget vocal : Ogg/Opus et proxy
Pour le mode anglais full duplex, le navigateur capture le micro, encode en Opus (WebCodecs) et encapsule les paquets en Ogg. Le flux transite par le proxy du moteur ; les autres langues utilisent un échange tour par tour.
public/widget/mvt-voice.js start() · stop() · toggleMute()
public/js/oggopus.js mux / demux Ogg/Opus (CRC32, OpusHead)
public/js/audio.js capture + encodage/décodage WebCodecs
public/js/plex.js client WS, file d'attente avant "prêt"
→ wss://…:8200/ws/plex?text_prompt=…&voice=…PersonaPlex (port 8998)
PersonaPlex fournit le mode anglais full duplex. Les conversations dans les autres langues passent par le chat du moteur et une synthèse vocale disponible.
WS /ws/plex anglais full duplex (Ogg/Opus)
POST /api/ollama/chat conversation tour par tour
voix par professeur Thomas Leroy : NATM2 · Nadia Bensalem : NATF3 · Mei Lin : NATF4 · Beatriz Almeida : VARF3 · Giulia Romano : VARF2 · Jonas Weber : NATM2 · Lena Fischer : NATF0 · Diego Ramirez : NATM1 · Lucia Fernandez : NATF3 · Lucas Moreau : NATM3 · Camille Rousseau : NATF1 · Emily Carter : VARF0 · James O'Connell : NATM0 · Ji-woo Park : NATF0 · Yuki Tanaka : NATF2 · Anna Volkova : VARF4 · Mohamed Nassim MEZIANI : VARM2 · Karim Hadj : VARM0 · Sarah Bennett : NATF2
prompt de rôle /api/persona/:profId/:courseIdPWA et hors ligne
Le service worker ne précharge pas les pages de navigation. Il peut mettre en cache certaines ressources statiques déjà consultées ; les API et les fichiers de build Next.js restent hors cache. L’accès hors ligne au catalogue n’est donc pas garanti.
manifest.webmanifest installation depuis la barre d'adresse
sw.js coquille en cache, API en réseau
/_next/* jamais mis en cacheLimite connue et suite
PersonaPlex laisse des threads tourner après quelques séances et finit par ne plus répondre : un superviseur le redémarre (environ 45 s de rechargement). La suite : redémarrage piloté par le moteur, édition complète dans l'interface, progression de l'élève.
tools/plex-watchdog.sh redémarre si CPU > 150 % au repos
tools/start-personaplex.sh lancement hors ligne (poids en cache)
tools/dev.sh moteur + interface