Coder à la voix avec ChatGPT, ça marche. Le hic tient en une ligne : chaque mot que tu dictes part chez OpenAI. Depuis le 23 juillet 2026, Codex se pilote à la voix — il ouvre une pull request, cherche l'origine d'un bug, tout ça dans une phrase. Pratique pour un side-project. Rédhibitoire quand le code appartient à un client.
On voulait le même confort sans la fuite. Le résultat est un pipeline 100 % local : faster-whisper pour la transcription, Claude Code et sa commande /voice
pour l'agent. Rien ne sort de la machine — ni la voix, ni le contexte, ni le code. Voici la config exacte, la latence qu'on mesure sur un M2, et les deux bugs qui nous ont coûté une demi-journée.
Parce que « coder à la voix » cache deux choses qu'on confond tout le temps. Le mode vocal de ChatGPT est fait pour converser : il répond, il temporise, il reformule. Dicter du code, c'est l'inverse — tu veux une transcription fidèle et muette, qui ne discute pas, ne reformule pas et n'ajoute rien à ce que tu dis. Deux gestes opposés.
Le vrai stack n'est donc jamais « ChatGPT vocal seul ». C'est un outil de dictée précis d'un côté, un agent de code de l'autre. Codex vocal fait les deux dans le cloud pour 20 €/mois ; un setup local sépare les deux briques et garde tout sur ta machine. Le tour d'horizon complet — prix, outils, cas d'usage — est dans le guide de référence ; ici, on reste sur le terrain technique.
/voice
Depuis mars 2026, Claude Code embarque un mode vocal. Tu tapes /voice
dans le terminal, tu tiens la barre d'espace, tu parles, tu relâches. La transcription passe par un Whisper local, pas par une API distante.
> /voice
[hold space to talk · release to send]
Pour 90 % des cas, ça suffit. Tu dictes une intention, l'agent écrit le code, tu relis. Si tu veux garder la main sur le modèle, la langue et le vocabulaire technique, il faut descendre d'un cran et brancher ta propre transcription.
Trois morceaux : capturer l'audio, le transcrire, l'injecter. On enregistre avec sox
, on transcrit avec faster-whisper, on colle le texte dans le prompt de l'agent.
brew install sox
pip install faster-whisper
Enregistrement à la volée, arrêté au Ctrl-C :
sox -d -q clip.wav
Transcription, en forçant le français :
from faster_whisper import WhisperModel
model = WhisperModel("medium", device="cpu", compute_type="int8")
segments, _ = model.transcribe("clip.wav", language="fr")
print("".join(s.text for s in segments))
Un détail qui compte : sur Mac, faster-whisper tourne sur CPU, pas sur le GPU. Le modèle large-v3
est le plancher de précision en français, mais il rame ; medium
reste le bon compromis. Évite les modèles distil-*
, optimisés pour l'anglais. Sur du français, ils inventent. Si tu veux le GPU, whisper.cpp l'exploite via Metal et va plus vite ; on est resté sur faster-whisper pour son API Python, plus simple à scripter et à biaiser.
On a mesuré le temps entre la fin d'une phrase de 8 secondes et le texte prêt à coller, sur un MacBook M2 16 Go :
| Modèle | Type | Temps | Précision FR |
|---|---|---|---|
medium |
|||
| int8 | ~1,2 s | correcte | |
large-v3 |
|||
| int8 | ~3,5 s | meilleure | |
| Codex vocal (cloud) | — | 200-450 ms | excellente |
Le cloud gagne la course de vitesse, sans surprise. Mais 1,2 seconde par phrase ne casse pas un flux de code : tu ne dictes pas à 160 mots/minute en continu, tu réfléchis entre deux instructions. Le vrai coût du local n'est pas la latence, c'est la config initiale.
Voilà le piège que personne ne teste. Dicte « crée une fonction getUserData » à un Whisper réglé en français, et tu récupères ça :
crée une fonction get user data
Trois mots séparés, en minuscules, avec un point ajouté par le modèle. Multiplie ce raté par chaque useState
, chaque endpoint
, chaque nom de variable en anglais, et la transcription entière devient inutilisable au moment de la coller. Le réflexe — épeler, ou dicter la syntaxe à la main — tue alors tout le gain de vitesse. Retour à la case départ.
La bonne réponse tient en deux règles. D'abord, on ne dicte jamais les identifiants : on décrit l'intention (« crée une fonction qui récupère les données utilisateur ») et on laisse l'agent nommer. Ensuite, pour les termes inévitables, on biaise le décodeur avec un initial_prompt
:
segments, _ = model.transcribe(
"clip.wav",
language="fr",
initial_prompt="Termes techniques : useState, getUserData, TypeScript, PostgreSQL, endpoint, refactor.",
)
Ce prompt ne transcrit rien — il oriente le vocabulaire. Nos noms de variables anglais sont ressortis corrects dès qu'ils y figuraient. C'est le genre de détail qu'on ne trouve dans aucun tuto grand public, parce qu'aucun ne code réellement en français.
Après une semaine sur ce setup, le verdict est net. La voix excelle pour prompter l'agent et naviguer ; elle est mauvaise dès qu'il faut de la précision caractère par caractère.
Ce qui marche :
Ce qui casse :
La voix change l'interface, pas le métier. Elle déplace la frappe du clavier vers le micro, mais elle ne supprime ni la décision d'architecture, ni le choix des noms, ni la relecture ligne à ligne. L'agent génère, l'ingénieur tranche — et aucun micro ne tranchera à sa place.
Pour du code perso, Codex vocal est plus simple et plus rapide — assume juste que ta voix part dans le cloud. Tout dépend de l'enjeu. Pour du code client ou propriétaire, le pipeline local Whisper + /voice
est le seul qui garantit que rien ne fuit, au prix d'une latence d'une seconde et d'une soirée de config.
Si tu veux le monter proprement — modèle, vocabulaire, push-to-talk, intégration à ton éditeur — c'est exactement ce qu'on démonte étape par étape dans la formation Claude Code. Et pour rester côté outils, on a comparé Claude Code et Cursor et détaillé le mode vocal de Claude sur Gmail et l'agenda.