72 lines
4.3 KiB
Markdown
72 lines
4.3 KiB
Markdown
# VPS hermes-nabil — pipeline visuels Yasmi (logo + scènes tunisiennes)
|
||
|
||
**Contexte** : génération de visuels publicitaires Yasmi sur hermes-nabil (VPS Contabo).
|
||
Fichiers dans `/data/nyora/` du container (`docker exec hermes-nabil …` via `ssh vps.internal`).
|
||
|
||
## Problème rencontré (18/07/2026)
|
||
Visuels avec logo YASMI illisible, doublé, + rectangle gris opaque.
|
||
**Causes** : (1) le lettrage du logo était décrit dans le prompt IA → le modèle l'a dessiné lui-même (flou, doublé) ; (2) artefact d'édition IA (rectangle gris) ; (3) ancien fichier logo = photo 440×1413 non détourée.
|
||
|
||
## Solution (19/07/2026)
|
||
- `nyora_logo.py` : surimpression déterministe du logo. Mesure la luminance de la zone d'ancrage → `logo_yasmi.png` (vert foncé) sur fond clair, `logo_yasmi_blanc.png` sur fond sombre (seuil 120). Hauteur 8,5 % de l'image, positions bas | haut-gauche | haut-droite | bas-droite. Branché dans `nyora_mannequin.py` ET `nyora_produit.py`.
|
||
- Prompt mannequin : exige « AUCUN texte, lettrage, filigrane, logo » — ne jamais mentionner YASMI dans un prompt d'image.
|
||
- `nyora_scenes.py` : 28 scènes tunisiennes régionales (Nord, Cap Bon, Nord-Ouest, Sahel, Sud-Est, oasis du Sud-Ouest) + 5 profils de mannequins tunisiennes élégantes. `--scene tozeur --mannequin chignon`.
|
||
- Variantes logo générées par recoloration PIL (alpha conservé) : blanc + ivoire.
|
||
|
||
## Règles permanentes
|
||
1. Logo et produit ne passent JAMAIS par un modèle d'image IA.
|
||
2. Rectangle gris / lettrage flou / logo doublé = l'IA a touché au logo → jeter et régénérer.
|
||
3. Tiers premium obligatoire pour l'essayage virtuel (fidélité broderie).
|
||
4. Sauvegardes : `*.bak_20260719` dans /data/nyora et /data/SOUL.md.bak_20260719.
|
||
|
||
## Vérification rapide
|
||
```
|
||
ssh vps.internal "docker exec hermes-nabil python3 /data/nyora/nyora_scenes.py | head"
|
||
ssh vps.internal "docker exec hermes-nabil python3 -c 'import sys;sys.path.insert(0,\"/data/nyora\");from nyora_logo import choisir_variante;print(choisir_variante(\"/data/nyora/out/mannequin_sidi_v1.png\"))'"
|
||
```
|
||
|
||
## Filet de sécurité watermark Google (19/07/2026)
|
||
Bug de régression documenté (discuss.ai.google.dev, 01/2026) : le sparkle
|
||
visible Google peut s'injecter même en accès API sur certains modèles
|
||
(Nano Banana Pro = gemini-3-pro-image), alors que l'accès API ne devrait
|
||
normalement porter que le SynthID invisible.
|
||
|
||
Correctif : nyora_watermark.py (nettoyer_coin) — patch miroir + fondu sur le
|
||
coin bas-droite, sans dépendance lourde (PIL seul). Branché automatiquement
|
||
dans nyora_produit.py (décor IA) et nyora_mannequin.py (brut, avant logo).
|
||
|
||
Test réel du 19/07 sur gemini-3-pro-image via OpenRouter : aucun sparkle
|
||
visible détecté (analyse pixel + aperçu ASCII du coin). Le filet reste actif
|
||
par sécurité car le bug est intermittent côté Google.
|
||
|
||
## Production reelle et bug de concurrence (19/07/2026)
|
||
|
||
Trois visuels livres sur Telegram (Gafsa, Nefta, Sfax) depuis une photo de
|
||
reference — gemini-3-pro-image, 1080x1350, logo lisible, aucun sparkle Google.
|
||
|
||
### Bug corrige : chemins temporaires fixes
|
||
`nyora_mannequin.py` et `nyora_produit.py` ecrivaient dans des chemins fixes
|
||
(`/tmp/mannequin_brut.png`, `/tmp/mannequin_logo.html`, `/tmp/produit_detoure.png`,
|
||
`/tmp/decor_ia.png`). Deux executions simultanees s'ecrasaient, et trois Chrome
|
||
headless en parallele depassaient le timeout de 120 s.
|
||
**Correctif** : `tempfile.mktemp()` avec prefixe unique.
|
||
**Regle** : lancer les generations **en serie**, jamais en parallele.
|
||
|
||
### Nouveau module : nyora_telegram.py
|
||
`python3 /data/nyora/nyora_telegram.py image.png "legende" [image2.png "legende2"]`
|
||
Token et chat_id lus dans `/data/.env`, jamais affiches.
|
||
|
||
### Transfert de fichier vers le VPS (methode validee)
|
||
Ne **jamais** utiliser des chunks base64 en here-doc SSH : tronque et tres couteux.
|
||
1. `curl -F "file=@fichier" https://tmpfiles.org/api/v1/upload`
|
||
2. Le lien `/dl/{id}/nom` renvoie une **page HTML** — en extraire l URL reelle
|
||
(`grep -oE "https?://tmpfiles.org/dl/[^\"]*\.jpg"`)
|
||
3. Telecharger cote VPS, verifier par `md5sum`, puis `docker cp` dans le container.
|
||
|
||
### Limite : heritage du physique du mannequin source
|
||
Le mannequin genere herite fortement du physique visible sur la photo de reference.
|
||
Une photo portee par un mannequin europeen donne un rendu europeen malgre
|
||
`--mannequin`. Pour un rendu tunisien fidele : fournir des photos de **vetements
|
||
seuls** (a plat ou sur cintre).
|
||
|