Message cosmétique sur Windows : "Prêt (NER indisponible : optimum.onnxruntime
introuvable. Installez 'optimum' et 'onnxruntime')". Apparaît dans la barre de
statut de la GUI quand EDS-Pseudo échoue à charger, et que le fallback
ner_manager_onnx.py essaie d'utiliser optimum.
Cause : 'optimum' n'était pas dans hiddenimports → PyInstaller ne le bundlait
pas → ner_manager_onnx.py mettait ORTModelForTokenClassification = None au
niveau module → l'appel à load() levait RuntimeError.
Le pipeline principal (CamemBERT-bio ONNX + EDS-Pseudo + GLiNER) ne passe
PAS par ner_manager_onnx.py — il utilise camembert_ner_manager.py qui charge
directement l'ONNX via onnxruntime sans optimum. Donc le masquage fonctionne
correctement malgré ce message. Mais le message inquiète l'utilisateur.
Fix : ajouter optimum + sous-modules aux hiddenimports. Impact taille
attendu : ~30-80 MB selon les dépendances embarquées.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
L'utilisateur a signalé un chevauchement visuel entre la ligne statique
"Premier lancement : 30-60 secondes…" du PNG et la ligne dynamique
PyInstaller (qui affiche "Chargement EDS-Pseudo…", etc.) affichée par
pyi_splash.update_text().
Correctifs :
- PNG redessiné avec 3 lignes statiques seulement (titre, sous-titre,
"Démarrage en cours — merci de patienter…") et une ZONE LIBRE y=170-235
pour le texte dynamique.
- text_pos du Splash() ajusté à (60, 195) pour centrer dans la zone libre.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
L'exe --onefile décompresse ~720 Mo dans %TEMP% au lancement. Sur Windows,
cela prend 15-30 s AVANT que Python ne démarre. Pendant ce temps :
- Aucune fenêtre visible (même le splash tkinter existant n'était pas encore
exécuté, car il faut d'abord l'import de Python).
- L'utilisateur clique parfois plusieurs fois, croit que l'app est plantée.
Solution : Splash natif PyInstaller (Splash() dans le .spec). L'image est
affichée PAR LE BOOTLOADER de l'exe, AVANT même le démarrage Python. Le
texte sous l'image est actualisable via pyi_splash.update_text(), puis
fermé via pyi_splash.close() une fois le splash tkinter visible.
Changements :
- assets/splash.png (480x240) : titre + sous-titre + indication de durée
- anonymisation_onefile.spec : Splash() + splash/splash.binaries dans EXE()
- launcher.py : import pyi_splash (fallback silencieux en mode dev), helpers
_splash_update / _splash_close, fermeture du splash natif dès que le
splash tkinter est à l'écran (évite superposition).
- .gitignore : exception !assets/** pour versionner l'image du splash
(règle générale *.png exclut tout le reste).
Effet utilisateur attendu : fenêtre visible IMMÉDIATEMENT au double-clic,
avec message "Démarrage en cours — merci de patienter…". Suppression du
trou noir de 15-30 s.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Plantages signalés sous Windows : causes identifiées et corrigées.
1. anonymisation_onefile.spec : les fichiers data/stopwords_manuels.txt,
villes_blacklist.txt, dpi_labels_blacklist.txt, companion_blacklist.txt
n'étaient PAS inclus dans le bundle PyInstaller (seuls les sous-dossiers
data/bdpm, data/finess, data/insee l'étaient). Résultat en frozen : sets
vides, qualité dégradée, plus de faux positifs.
2. anonymizer_core_refactored_onnx.py : chargements robustifiés.
- Helper _load_txt_set avec try/except et logging WARNING si fichier absent
- Fallbacks intégrés (_DPI_LABELS_FALLBACK, _COMPANION_BLACKLIST_FALLBACK)
pour continuer à fonctionner si bundle partiel
- try/except sur stopwords_manuels.txt, villes_blacklist.txt, BDPM
3. launcher.py : UX repensée pour le chargement des modèles.
- SetupWindow (premier lancement) : auto-démarrage (plus de clic nécessaire),
progress bar avec étapes visuelles (⏳/✓/✗ par modèle), bouton relance si
échec, bouton "continuer malgré tout" pour modèles optionnels.
- Splash screen ajouté dans launch_gui() : le chargement des gazetteers
(INSEE 200k+ noms, FINESS 100k+ établissements) prend 15-30 s au démarrage
normal. Sans feedback, l'utilisateur croyait l'app plantée. Le splash
tourne pendant l'import (thread séparé, poll avec splash.after).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>