Salut les futurs génies du code ! 🚀
Vous avez toujours rêvé d’avoir votre propre assistant intelligent, comme Jarvis pour Iron Man ? Un assistant à qui vous pouvez parler, poser des questions et qui vous répond avec une voix synthétique ?
Aujourd’hui, on va transformer ce rêve en réalité ! On va décortiquer un script Python qui utilise un modèle d’IA local (grâce à un outil génial appelé Ollama), la reconnaissance vocale pour écouter vos commandes, et la synthèse vocale pour vous répondre.
Pas de panique, même si ça a l’air complexe, on va tout voir étape par étape. Préparez votre boisson préférée, ouvrez votre éditeur de code, et c’est parti !
✅ Avant de commencer : Les prérequis
Pour que notre script fonctionne, on a besoin de quelques outils.
- Python : Assure-toi qu’il est bien installé sur ta machine.
- Les bibliothèques Python : Ouvre un terminal (ou une invite de commandes) et installe les bibliothèques nécessaires avec cette commande magique :
pip install requests gradio speechrecognition pyttsx3 pyaudio- (Note :
pyaudioest parfois un peu capricieux à installer. Si tu as des soucis, une petite recherche « installer pyaudio sur [ton système] » devrait t’aider !)
- Ollama et un modèle d’IA : C’est le cœur de notre assistant ! Ollama est un programme qui permet de faire tourner des modèles d’IA sur ton propre ordinateur.
- Télécharge et installe Ollama depuis leur site officiel.
- Une fois installé, ouvre ton terminal et tape cette commande pour télécharger le modèle que nous allons utiliser (ou un autre, comme
llama3oumistral) :ollama pull deepseek-r1
- Très important : Laisse Ollama tourner en fond pendant que tu utilises le script.
décortiquons le code ! 💻
Voici le script complet. On va l’analyser section par section juste après.
import requests
import gradio as gr
import speech_recognition as sr
import pyttsx3
import re
import threading
import time
# Endpoint de l'API locale Ollama
OLLAMA_URL = "http://localhost:11434/api/generate"
# Initialisation du moteur de synthèse vocale (Text-to-Speech)
engine = pyttsx3.init()
engine.setProperty('rate', 170) # Vitesse de la parole
# Variables pour le contrôle vocal
speaking_thread = None
stop_speaking = False
# Mémoire de la conversation
conversation_history = ""
last_interaction_time = time.time()
CONVERSATION_TIMEOUT = 180 # On oublie la conversation après 3 minutes d'inactivité
def speak_text(text):
""" Fait parler l'assistant dans un thread séparé. """
global stop_speaking
stop_speaking = False
engine.say(text)
try:
# Boucle pour permettre l'interruption
while not stop_speaking:
engine.runAndWait()
break
except RuntimeError:
# Évite un crash si on stoppe en plein milieu de la parole
pass
def stop_speech():
""" Arrête la parole de l'assistant. """
global stop_speaking
stop_speaking = True
try:
engine.stop()
except Exception:
pass
def ai_assistant(text):
"""
Génère une réponse de l'assistant IA en utilisant l'historique de la conversation.
"""
global conversation_history, last_interaction_time
# Si on n'a pas parlé depuis longtemps, on réinitialise la mémoire
if time.time() - last_interaction_time > CONVERSATION_TIMEOUT:
print("🧹 Nouveau contexte (ancien effacé car inactif)")
conversation_history = ""
# On ajoute la nouvelle question à l'historique
conversation_history += f"\nUtilisateur: {text}"
# On construit le prompt pour l'IA
prompt = f"""Tu es Jarvis, un assistant personnel intelligent.
Voici la conversation en cours :
{conversation_history}
Réponds de manière concise et utile à la dernière question posée par l'utilisateur.
Réponse:"""
payload = {
"model": "deepseek-r1",
"prompt": prompt,
"stream": False,
}
# On envoie la requête à notre IA locale
response = requests.post(OLLAMA_URL, json=payload)
if response.status_code == 200:
ai_response = response.json().get("response", "Désolé, je n'ai pas de réponse.")
# Petit nettoyage pour enlever des balises non désirées
cleaned_text = re.sub(r'<think>.*?</think>', '', ai_response, flags=re.DOTALL)
# On sauvegarde la réponse de Jarvis dans l'historique
conversation_history += f"\nJarvis: {cleaned_text}"
last_interaction_time = time.time()
# On lance la lecture vocale dans un thread pour ne pas bloquer le programme
global speaking_thread
speaking_thread = threading.Thread(target=speak_text, args=(cleaned_text,))
speaking_thread.start()
return ai_response
else:
return "Erreur: Impossible de contacter le serveur AI."
def listen_command():
""" Écoute l'utilisateur via le microphone et retourne le texte. """
recognizer = sr.Recognizer()
microphone = sr.Microphone()
with microphone as source:
print("🎤 Écoute... (parlez, Jarvis attendra vos pauses)")
recognizer.adjust_for_ambient_noise(source, duration=1)
# Le temps de pause avant de considérer la phrase comme terminée
recognizer.pause_threshold = 1.5
audio = recognizer.listen(source, phrase_time_limit=12)
try:
command = recognizer.recognize_google(audio, language="fr-FR")
print(f"👉 Vous avez dit: {command}")
return command.lower()
except sr.UnknownValueError:
# Si la voix n'est pas comprise
return ""
except sr.RequestError:
return "Erreur de service de reconnaissance vocale."
def is_stop_command(command: str) -> bool:
""" Vérifie si la commande est une demande d'arrêt. """
stop_keywords = ["jarvis stop", "stop jarvis", "arrête", "tais-toi", "silence"]
return any(kw in command for kw in stop_keywords)
# === Le cœur du programme : la boucle infinie ===
while True:
command = listen_command()
# Priorité 1 : Vérifier si on doit l'arrêter de parler
if is_stop_command(command):
print("⏹️ Arrêt immédiat de la parole de Jarvis.")
stop_speech()
continue # On recommence à écouter
# Priorité 2 : Vérifier si on l'appelle
if "jarvis" in command:
print("🔑 Mot-clé 'Jarvis' détecté. Traitement de la question...")
response = ai_assistant(command)
print(f"🤖 Réponse de l'assistant: {response}")
1. Les Imports et la Configuration Initiale 🛠️
import requests # Pour envoyer des requêtes à l'IA
import speech_recognition as sr # Pour comprendre ce que tu dis
import pyttsx3 # Pour faire parler Jarvis
import threading # Pour que Jarvis parle sans bloquer le reste du script
# ... et quelques autres !
OLLAMA_URL = "http://localhost:11434/api/generate"
engine = pyttsx3.init()
engine.setProperty('rate', 170)
Ici, on importe toutes les boîtes à outils dont on a besoin. On définit l’adresse de notre IA locale (OLLAMA_URL) et on configure le moteur vocal pour qu’il parle à une vitesse naturelle.
2. La Mémoire et la Parole de Jarvis 🧠🗣️
import requests # Pour envoyer des requêtes à l'IA
import speech_recognition as sr # Pour comprendre ce que tu dis
import pyttsx3 # Pour faire parler Jarvis
import threading # Pour que Jarvis parle sans bloquer le reste du script
# ... et quelques autres !
OLLAMA_URL = "http://localhost:11434/api/generate"
engine = pyttsx3.init()
engine.setProperty('rate', 170)
Pour que Jarvis soit cohérent, il a besoin d’une mémoire à court terme (conversation_history). On stocke nos échanges ici. Mais si on ne lui parle pas pendant 3 minutes (CONVERSATION_TIMEOUT), il oublie tout pour repartir sur de nouvelles bases !
La fonction speak_text est super importante. Elle lance la lecture de la réponse dans un thread.
Analogie simple : Imagine que tu lis une recette tout en cuisinant. Tu n’arrêtes pas de cuisiner pour lire ! C’est pareil ici : le programme peut continuer à écouter une commande « stop ! » même pendant que Jarvis est en train de parler. C’est ça, le
threading!
La fonction stop_speech est son interrupteur : elle met fin à la parole instantanément.
3. Le Cerveau de l’Opération : ai_assistant 🤖
def ai_assistant(text):
# ...
prompt = f"""Tu es Jarvis... Voici la conversation en cours : {conversation_history}..."""
# ...
response = requests.post(OLLAMA_URL, json=payload)
# ...
C’est la fonction la plus dense ! Voici ce qu’elle fait :
- Gère la mémoire : Elle vérifie si la conversation a expiré.
- Construit le prompt : Elle prépare la « question » pour l’IA. C’est plus qu’une simple question, on lui donne un rôle (« Tu es Jarvis ») et tout l’historique de la conversation pour qu’il ait le contexte. C’est la base du Prompt Engineering !
- Appelle l’IA : Elle envoie ce prompt à Ollama avec
requests.post. - Traite la réponse : Elle récupère le texte généré par l’IA, le nettoie un peu.
- Lance la parole : Elle appelle
speak_textpour lire la réponse à voix haute.
4. L’Oreille de Jarvis : listen_command 🎤
def listen_command():
recognizer = sr.Recognizer()
microphone = sr.Microphone()
# ...
command = recognizer.recognize_google(audio, language="fr-FR")
# ...
Cette fonction utilise la bibliothèque SpeechRecognition pour :
- Ouvrir le microphone.
- Écouter ce que tu dis (
recognizer.listen). Elle est assez intelligente pour attendre que tu aies fini de parler. - Envoyer l’audio aux serveurs de Google pour le transformer en texte (
recognize_google). Eh oui, cette partie nécessite une connexion Internet ! - Retourner le texte reconnu en minuscules.
5. Le Cœur du Programme : La Boucle Principale ❤️
while True:
command = listen_command()
if is_stop_command(command):
# ...
continue
if "jarvis" in command:
# ...
C’est le moteur qui tourne en permanence :
- Il écoute une commande (
listen_command). - Il vérifie d’abord si tu as dit un mot pour l’arrêter (comme « stop » ou « tais-toi »). C’est une priorité pour garder le contrôle !
- Si ce n’est pas un ordre d’arrêt, il vérifie si le mot-clé « jarvis » est présent. C’est notre « wake word » !
- Si « jarvis » est détecté, alors il transmet la phrase entière au cerveau (
ai_assistant) pour obtenir une réponse.
🔥 Comment lancer ton Jarvis ?
- Assure-toi qu’Ollama est bien lancé en arrière-plan.
- Sauvegarde le script sous un nom comme
jarvis.py. - Ouvre un terminal dans le dossier où tu as enregistré le fichier.
- Tape
python jarvis.pyet appuie sur Entrée. - Tu devrais voir le message
🎤 Écoute...s’afficher. - Parle ! Essaie de dire : « Jarvis, quelle est la capitale de la France ? »
Tu devrais entendre ton ordinateur te répondre !
Et maintenant ? Pour aller plus loin…
Félicitations, tu as un assistant vocal fonctionnel ! C’est une base incroyable que tu peux améliorer :
- Changer la voix : Explore la documentation de
pyttsx3pour changer la voix de Jarvis. - Ajouter des commandes spéciales : Modifie la boucle principale pour qu’il puisse ouvrir ton navigateur ou lancer des applications.
- Créer une interface graphique : Le script importe
gradio, une bibliothèque parfaite pour créer une interface web simple. Tu pourrais afficher la conversation à l’écran ! - Tester d’autres modèles : Essaie
llama3oumistralavec Ollama pour voir comment les réponses de Jarvis changent.
J’espère que ce tutoriel t’a plu ! N’hésite pas à expérimenter, à casser des choses et surtout, à t’amuser. C’est comme ça qu’on apprend le mieux.
Happy coding! 💻✨

