Tutoriel IA
Construisez votre premier assistant vocal avec OpenAI et Python : un tutoriel pour développeurs
Un tutoriel pratique en Python pour construire un assistant vocal avec les API Whisper, ChatGPT et text-to-speech d'OpenAI : enregistrement audio, transcription, génération d'une réponse adaptée à la parole, et conversion en audio.

Un assistant vocal semble être un vaste projet d'ingénierie, mais la boucle centrale n'est que trois appels API enchaînés : transcrire la parole en texte, envoyer ce texte à un modèle de langage, puis convertir la réponse en parole. Ce tutoriel construit une version fonctionnelle en ligne de commande de cette boucle en utilisant Whisper d'OpenAI pour la transcription, ChatGPT pour la réponse, et l'API text-to-speech d'OpenAI pour la sortie audio.
Ce dont vous aurez besoin
- Python 3.9 ou ultérieur installé
- Une clé API OpenAI avec la facturation activée (ce projet utilise trois endpoints distincts, chacun facturé à l'utilisation)
- Un microphone, et un moyen de lire l'audio depuis votre machine
Étape 1 : Configurer l'environnement
Créez un dossier de projet et installez les paquets requis :
pip install openai sounddevice scipy python-dotenv
Stockez votre clé API dans un fichier .env plutôt que de la coder en dur dans le script : cela compte plus qu'il n'y paraît : les clés API commitées dans le code finissent par fuiter dans les dépôts git plus souvent que les développeurs ne le prévoient.
OPENAI_API_KEY=votre-clé-ici
Étape 2 : Enregistrer et transcrire l'audio avec Whisper
L'étape d'enregistrement capture quelques secondes d'entrée microphone et les sauvegarde sous forme de fichier WAV, qui est ensuite envoyé à l'endpoint de transcription de Whisper :
import sounddevice as sd, scipy.io.wavfile as wav, os
from openai import OpenAI
from dotenv import load_dotenv
load_dotenv()
client = OpenAI()
def record_audio(filename="input.wav", duration=5, fs=44100):
print("Enregistrement...")
audio = sd.rec(int(duration * fs), samplerate=fs, channels=1)
sd.wait()
wav.write(filename, fs, audio)
def transcribe(filename="input.wav"):
with open(filename, "rb") as f:
result = client.audio.transcriptions.create(model="whisper-1", file=f)
return result.text
Cinq secondes suffisent pour une question courte. Pour une entrée plus longue, augmentez la durée ou, pour une version de production, remplacez l'enregistrement à durée fixe par une détection de silence afin qu'il s'arrête automatiquement dès que vous avez fini de parler.
Étape 3 : Envoyer la transcription à ChatGPT
Avec le texte en main, l'appel de complétion de chat est simple. Gardez le prompt système court, car les réponses vocales doivent être plus concises et plus conversationnelles que la sortie de chat typique destinée à être lue à l'écran :
def get_response(user_text):
completion = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "Vous êtes un assistant vocal. Limitez les réponses à 3 phrases, conversationnel, pas de markdown."},
{"role": "user", "content": user_text}
]
)
return completion.choices[0].message.content
L'instruction "pas de markdown" compte ici spécifiquement car une liste à puces n'a aucun sens lue à voix haute : c'est un cas où le prompt doit tenir compte du support de sortie, pas seulement du contenu.
Étape 4 : Convertir la réponse en parole
L'API text-to-speech d'OpenAI prend ce texte de réponse et renvoie directement l'audio :
def speak(text, filename="output.mp3"):
response = client.audio.speech.create(model="tts-1", voice="alloy", input=text)
response.stream_to_file(filename)
os.system(f"start {filename}" if os.name == "nt" else f"afplay {filename}")
Le paramètre voice accepte plusieurs options prédéfinies : alloy, echo, fable, onyx, nova et shimmer, chacune avec un ton distinct. Essayez-en plusieurs en fonction de votre cas d'usage ; un assistant destiné aux clients et un outil personnel de prise de notes n'ont pas besoin de la même voix.
Étape 5 : Relier le tout
if __name__ == "__main__":
record_audio()
text = transcribe()
print(f"Vous avez dit : {text}")
reply = get_response(text)
print(f"Assistant : {reply}")
speak(reply)
Exécutez le script, prononcez une question lorsque demandé, et la boucle complète, enregistrer, transcrire, répondre, parler, s'effectue en quelques secondes.
Où ça casse, et comment le réparer
Le problème le plus courant est l'audio tronqué : si la fenêtre fixe de 5 secondes coupe avant que vous ayez fini de parler, la transcription sera incomplète et la réponse répondra à la mauvaise question. Augmenter la durée est le correctif rapide ; ajouter une bibliothèque de détection d'activité vocale comme webrtcvad est le correctif approprié. La latence est l'autre contrainte à planifier : trois appels API séquentiels totalisent généralement 2 à 4 secondes de temps d'aller-retour, notable mais généralement acceptable pour un outil personnel, moins pour quelque chose qui se veut vraiment en temps réel.