Serveur Flask + Web UI - NodeJS, NGINX, Python, etc... Au choix.
Python3.11 requis.
Inspiré par le projet ada_app de Nlouis38 https://github.com/Nlouis38/ada
Merci à lui pour son travail.
2025-06-26.13-27-49.mp4
EVA (Evolved Virtual Assistant) est un assistant personnel vocal et textuel français écrit en Python. Il combine les capacités du modèle Gemini de Google, l’API Google Maps, les services Gmail/Calendar/Tasks, Custom Search API pour la recherche Web, et OpenWeatherMap pour la météo, le tout sous une seule interface Web réactive basée sur Tailwind CSS.
Le mode Agent est très couteux en ressource sur API, donc faites attention.
Use‑case principal : un hub productivité « tout‑en‑un » piloté à la voix : créer des événements calendrier, envoyer des e‑mails, obtenir un itinéraire, lancer une recherche Web, gérer contacts & tâches… et obtenir la réponse parlée.
| Catégorie | Détail |
|---|---|
| NLP/IA | Appels direct au modèle Gemini 2 (configurable). |
| Voix | Synthèse vocale via gTTS (facultatif) & Web Speech API côté navigateur. |
| Google API | OAuth 2 offline + Calendar, Gmail, Tasks, Maps Directions. |
| Recherche Web | Résumés API (fallback answer‑box / knowledge graph). |
| Météo | OpenWeatherMap affiché dans le tableau de bord. |
| Contact book | Carnet d’adresses local (JSON). |
| WebSocket | Dialogue temps‑réel entre front (HTML/JS) et backend (Flask + Flask‑Sock). |
| Interface | Panneau latéral (carte, recherche, e‑mails, tâches, calendrier, code généré). |
| Transcript Audio Whisper | Convertisserz un audio MP3 ou WAV en texte. |
| Visualiseur 3D | Demandez à E.V.A de créer un objet comme un cube, une sphere, un cône ou un tore en 3D. |
| Execution de code | E.V.A peut executer du code python et intéragir avec le shell |
| Mode Agent | E.V.A peut executer des tâches en plusieurs étapes |
| Compatibilité MIDI | E.V.A peut jouer des notes de musique sur votre DAW comme FL Studio (nécessite LoopMIDI) |
┌───────────────┐ WebSocket ┌──────────────┐
│ Front‑end │ <─────────────────────────────► │ Flask API │
│ index.html │ (JSON + audio) │ main.py │
└───────────────┘ └──────────────┘
│ │
▼ Google Maps JS ▼
Browser APIs : Speech‑to‑Text, gTTS audio Google APIs / Gemini / Custom Search API
-
Python ≥ 3.10
-
Un navigateur moderne (Chrome/Edge/Brave ≥ v113 pour l’API SpeechRecognition)
-
Clés/API :
- Google Gemini
GEMINI_API_KEY - Google Maps JS
GOOGLE_MAPS_API_KEY - Google OAuth 2 credentials (
client_secret.json) - Google Custom Search
GOOGLE_CUSTOM_SEARCH_API_KEYet le CXGOOGLE_CUSTOM_SEARCH_CX(optionnel mais recommandé) - OpenWeatherMap
OPENWEATHERMAP_API_KEY(frontend)
- Google Gemini
-
ffmpeginstallé (optionnel : synthèse gTTS fiable)
-
Clone + virtualenv
git clone https://github.com/<votre‑user>/eva-assistant.git cd eva-assistant python -m venv .venv && source .venv/bin/activate # Windows : .venv\Scripts\activate
-
Dépendances Python
pip install --upgrade pip pip install -r requirements.txt
-
**Fichier **
.env(à la racine) :GEMINI_API_KEY=sk‑... GEMINI_MODEL_NAME=gemini-2.0-flash # facultatif GOOGLE_MAPS_API_KEY=AIza... GOOGLE_CUSTOM_SEARCH_API_KEY==... GOOGLE_CUSTOM_SEARCH_CX=YOUR_CX_KEY FLASK_SECRET_KEY=change‑me-super‑secret GOOGLE_CLIENT_SECRETS_FILE=client_secret.json # Facultatif : décommenter si besoin de proxy # HTTP_PROXY=http://... # HTTPS_PROXY=https://...
-
OAuth Google et AI Studio
- Allez sur console.cloud.google.com
- Créez un projet ▶ “API & Services” ▶ “Identifiants” ▶ “ID client OAuth 2.0 (Desktop)”.
- Dans l’écran de consentement, ajoutez
http://localhost:5000/oauth2callback_googlecomme URI de redirection.
- Téléchargez
client_secret_<id>.json, renommez‑leclient_secret.json, placez‑le à la racine.
-
Récupérez et utilisez gratuitement votre clé API Gemini sans compte de facturation sur AI Studio (Vous pouvez activer la facturation pour gemini-2.0-flash pour pas cher : 0.10$/M de tokens INPUT et 0.50$/M de tokens en OUTPUT en cas d'utilise plus intensive d'E.V.A)
-
Générer une clé api OpenWeatherMap
-
Activez Directions API pour afficher les itinéraires sur la map dans "API et service" de Console Cloud.
-
Pour Google Custom Search API, vous devez aller sur La plate-forme de moteur de recherche personnalisé
Copier l'ID du moteur de recherche et coller le dans
GOOGLE_CUSTOM_SEARCH_CXprésent dans le fichier .env
-
Frontend : insérez vos clés JS
-
Ouvrez
index.htmlet recherchez, ligne 9 :<script async defer src="https://maps.googleapis.com/maps/api/js?key=GOOGLE_MAPS_API_KEY&callback=initMap&libraries=places"></script>
Remplacez
GOOGLE_MAPS_API_KEYpar la clé réelle. -
Ligne 584, remplacez
const openWeatherMapApiKey = 'YOUR_OPENWEATHERMAP_API_KEY';par votre clé OpenWeatherMap.
-
-
Lancer le backend
python main.py # écoute sur http://localhost:5000 -
Servir le frontend (au choix)
-
Mode rapide :
python -m http.server 8080 --bind 127.0.0.1
puis ouvrez http://localhost:8080/index.html
-
Ou via une extension Live Server (VS Code), Nginx ou NodeJS.
-
-
Autoriser Google
- Dans l’UI EVA cliquez sur “Autoriser l’accès aux services Google” puis connectez‑vous.
Ça y est ! Parlez ou tapez votre requête dans EVA 👾.
N'hésitez pas à rentrer des informations selon votre situation pro/perso pour donner du contexte dans SYSTEM_MESSAGE_CONTENT
Ligne 435:
L'utilisateur s'appelle 'VOTRE_PRENOM'.
Ligne 457:
par exemple : 'En route pour {destination}, VOTRE_PRENOM
- Voix continue : appuyez sur Espace pour commencer, Space à nouveau pour arrêter.
- Voix ponctuelle : cliquez sur le micro.
- Mode interruption : Voix continu avec la possibilité d'interrompre E.V.A en parlant dans le micro.
- Envoi de fichiers supporté : jpg, png, doc et txt
- Commandes supportées : « Crée un événement demain à 14 h », « Envoie un e‑mail à Alice … », « Ajoute une tâche … », « Itinéraire jusqu’à Paris », « Recherche Web : les actus sur l'IA ».
- "OK Eva" : Vous pouvez déclancher l'écoute par cette simple phrase.
- Lancement d'applications : E.V.A peux ouvrir des applications de votre PC. Configurez les chemins d'accès dans
.envavec les variablesAPP_NOM_DE_L'APP_PATH="C:\chemin\vers\app.exe
EVA détecte une commande ➜ renvoie un JSON (voir SYSTEM_MESSAGE_CONTENT dans main.py) ➜ backend exécute.
- Raccourcis touches : Caméra 'C' - Muet 'M' - Mode Interruption 'I'
requests
flask
flask‑sock
flask-cors
google‑auth‑oauthlib
google‑api‑python‑client
google-auth-httplib2
googlemaps
gtts
pillow
simple‑websocket
google‑generativeai
dotenv
google-search-results
beautifulsoup4
openai-whisper
ffmpeg-python
pyvista
spotipy
mido
PyPDF2
rtmidi-python
yt-dlp
Générez le fichier exact via :
pip freeze > requirements.txt| Variable | Description | Obligatoire |
|---|---|---|
GEMINI_API_KEY |
Clé API Gemini v2 | ✔︎ |
GEMINI_MODEL_NAME |
Nom du modèle (défaut : gemini‑2.0‑flash) | ❌ |
GOOGLE_MAPS_API_KEY |
Clé JS Google Maps (itinéraires + carte) | ❌ (désactive map) |
CUSTOM_SEARCH_API_KEY et GOOGLE_CUSTOM_SEARCH_CX |
Clé Custom Search pour la recherche Web | ❌ (web search off) |
FLASK_SECRET_KEY |
Secret session Flask | ✔︎ |
GOOGLE_CLIENT_SECRETS_FILE |
Nom du fichier JSON OAuth | ✔︎ |
OPENWEATHERMAP_API_KEY |
Clé météo (frontend) | ❌ (pas de météo) |
| Action | Commande |
|---|---|
| Lancer backend (dev) | python main.py |
| Linter (ruff) | ruff check . |
| Formatage (black) | black . |
| Frontend rapide | python -m http.server 8080 |









