Skip to content

Portfolio vocal : v0 RAG, voix clonée, vrai corpus, sécurité et CI - #1

Merged
mathiscapart merged 18 commits into
mainfrom
mathiscapart/check-notion-portfolio
Sep 14, 2026
Merged

mathiscapart merged 18 commits into
mainfrom
mathiscapart/check-notion-portfolio

Conversation

@mathiscapart

Copy link
Copy Markdown
Owner

Résumé

Portfolio vocal en production sur https://mathiscapart.xyz : le visiteur pose sa question à voix haute, l'assistant répond avec la voix clonée de Mathis, uniquement à partir de son parcours.

  • Chaîne vocale : STT Kyutai en streaming (GPU ROCm) → RAG Qdrant → qwen3:8b → Pocket TTS (voix clonée), via WebSocket /voice. Premier son ~2,3 s après la fin de la question (mesuré en public).
  • Front : interface voix seule (onde réactive au signal, états explicites, historique, bouton Arrêter), page parcours statique.
  • Corpus réel issu du CV et des README GitHub ; le prompt interdit d'attribuer souhaits ou recherche d'emploi absents du corpus.
  • Sécurité (audit security-auditor) : API et Qdrant liés à 127.0.0.1, contrôle d'Origin sur /voice, /docs fermé, CSP et Permissions-Policy, dépendances vulnérables mises à jour, Chatterbox inutilisé retiré.
  • CI : tests backend sans GPU, tests + typecheck + build front, build Docker, gitleaks, pip-audit, npm audit ; actions épinglées par SHA ; Dependabot.

Vérifications

  • Backend 52/52, front 13/13, typecheck OK.
  • Chaque job de CI rejoué en local (actionlint, pip-audit, npm audit, gitleaks sur l'historique, docker compose build rag).
  • Conversation vocale complète en production dans Chromium (faux micro), sans violation CSP.
  • Origine étrangère refusée (403), Qdrant et API injoignables depuis le réseau local.

Reste ouvert

  • Ollama écoute encore sur 0.0.0.0 (réglage machine Windows, décision en attente).
  • Section « Ce que je cherche » du corpus à rédiger.

🤖 Generated with Claude Code

https://claude.ai/code/session_01VmvgEmDbLpTURKTGz4QiDZ

mathiscapart and others added 18 commits September 13, 2026 15:51
CLAUDE.md consigne la topologie imposee, les modeles mesures et la dette assumee.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01VmvgEmDbLpTURKTGz4QiDZ
Contexte de build errone, variables absentes, fichiers illisibles en diff git.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01VmvgEmDbLpTURKTGz4QiDZ
Fil d'Ariane dans le texte embede, purge des points periemes, garde-fou A REMPLIR.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01VmvgEmDbLpTURKTGz4QiDZ
Refus hors perimetre, delimiteur anti-injection, endpoint def et non async def.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01VmvgEmDbLpTURKTGz4QiDZ
Export statique lisible backend eteint, parseur SSE maison, banniere de demonstration.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01VmvgEmDbLpTURKTGz4QiDZ
Le test de pertinence verifie le chunk portant la reponse, pas le nom de fichier.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01VmvgEmDbLpTURKTGz4QiDZ
Plus aucune execution au niveau module. Jamais execute : dependances ROCm absentes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01VmvgEmDbLpTURKTGz4QiDZ
Rate-limit par visiteur sur Cf-Connecting-Ip, API native jointe par host.docker.internal.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01VmvgEmDbLpTURKTGz4QiDZ
…ming

- Endpoint WebSocket /voice : STT Kyutai trame par trame, RAG, qwen3:8b en
  streaming, synthese phrase par phrase.
- TTS Pocket dans un service separe (.venv-tts, 127.0.0.1:8001) : 27,95x
  temps reel sous torch ROCm contre 0,70x sous torch CPU.
- num_ctx 8192 sur /chat et /voice : a 32768 le LLM debordait de la VRAM
  a cote du STT (10,5 t/s au lieu de 54,8).
- think=False et consigne orale sur /voice (9,2 s de silence evitees).
- Garde-fous : une session a la fois, question plafonnee a 30 s, socket
  muet coupe apres 10 s, trames hors format ignorees, etat STT reinitialise
  entre deux visiteurs.
- Front : Chat.tsx remplace par VoiceChat.tsx (parler / ecouter).

Mesure publique : premier son 2,3 a 2,6 s apres la fin de la question.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VmvgEmDbLpTURKTGz4QiDZ
- Onde reactive au signal reel : micro pendant l'ecoute (outremer), voix
  de l'assistant pendant la reponse (ambre), respiration en reflexion.
- Etats explicites (connexion, ecoute, reflexion, reponse), bouton
  Arreter, raccourci Espace, main rendue a la fin de la voix et non du texte.
- Historique des echanges, exemples de questions, 3 sources les mieux
  classees, messages d'erreur qui disent quoi faire.
- Typographie Bricolage Grotesque / Source Serif 4, mode sombre, contrastes
  verifies, mouvement reduit respecte.
- trailingSlash: /parcours repondait 403 en production (dossier sans index).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VmvgEmDbLpTURKTGz4QiDZ
TTS_VOIX accepte une voix du catalogue ou un etat .safetensors exporte.
Defaut inchange (estelle). Le dossier des echantillons vocaux est ignore.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VmvgEmDbLpTURKTGz4QiDZ
- Corpus redige depuis le CV Canva et les README GitHub, sans coordonnees
  personnelles ; valide par l'interesse.
- Front servi par defaut sur le vrai corpus : le bandeau demo disparait.
- Prompt : interdiction d'attribuer souhaits, recherche d'emploi ou
  disponibilite absents des extraits (qwen3 inventait un poste recherche).
- Test de pertinence recale sur le vrai corpus.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VmvgEmDbLpTURKTGz4QiDZ
CI : tests backend (sans pile GPU), tests + typecheck + build du front,
build Docker de rag, gitleaks sur l'historique, pip-audit, npm audit.
Actions epinglees par SHA, Dependabot hebdomadaire.

Durcissement (audit security-auditor) :
- API et Qdrant lies a 127.0.0.1 : exposes au LAN, ils contournaient le
  rate-limit et permettaient de vider ou empoisonner l'index. Traefik joint
  toujours l'API via host.docker.internal (verifie).
- /voice refuse les Origin etrangeres (CORS ne couvre pas les WebSockets).
- /docs, /redoc et /openapi.json fermes.
- CSP et Permissions-Policy (verifiees dans Chromium, zero violation).
- Dependances vulnerables mises a jour (h2, hpack, idna, urllib3, aiohttp,
  pillow, requests).
- torch et le STT importes paresseusement : API testable sans GPU.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VmvgEmDbLpTURKTGz4QiDZ
Chatterbox et perth imposaient setuptools<81 (vulnerable). Desinstalles de
.venv-rocm avec leurs dependances orphelines et peft ; STT, TTS et tests
reverifies, pip-audit sans vulnerabilite sur les deux venvs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VmvgEmDbLpTURKTGz4QiDZ
- Titre et description avec nom et poste, titre dedie a /parcours/.
- sitemap.xml et robots.txt generes au build, URL canoniques.
- Open Graph (image 1200x630) et donnees structurees schema.org Person,
  reliees a LinkedIn et GitHub (sameAs).
- En-tete commun avec le nom, LinkedIn et GitHub ; resume lisible sur
  l'accueil pour les moteurs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VmvgEmDbLpTURKTGz4QiDZ
Onde du visiteur (outremer) et de l'assistant (ambre) sur fond clair :
SVG, favicon.ico 16/32/48 et icone Apple 180.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VmvgEmDbLpTURKTGz4QiDZ
- AudioContext crees et reveilles dans le geste, avant l'attente du micro :
  apres un await, Safari iOS les laisse suspendus (muets).
- Frequence materielle au lieu de 24 kHz imposes ; micro reechantillonne en
  JavaScript (Reechantillonneur, teste), lecture en buffers 24 kHz.
- Session audio iOS en lecture avant la reponse (API Audio Session) : evite
  l'ecouteur d'appel et la coupure par le mode silencieux.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VmvgEmDbLpTURKTGz4QiDZ
@mathiscapart
mathiscapart merged commit 354310d into main Sep 14, 2026
4 checks passed
@mathiscapart
mathiscapart deleted the mathiscapart/check-notion-portfolio branch September 14, 2026 11:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant