Tutoriel : la voix et un modèle local sous WSL2, sur le GPU
Ce tutoriel installe Orkeon Code sous WSL2 (Windows 11) et y branche, sur la carte graphique de la machine, la transcription de la parole (Whisper), la synthèse vocale (Piper, puis Kokoro en option) et un modèle de langue local (Qwen par Ollama) : rien ne quitte la machine. Il a été déroulé en octobre 2026 sur un portable Windows 11 avec une NVIDIA GeForce RTX 3070 Ti Laptop (8 Go de mémoire vidéo) ; les durées et les tailles citées viennent de là.
Tout se tape dans un terminal WSL (Ubuntu ou Debian), jamais dans PowerShell, sauf les lignes marquées PowerShell. Les blocs se copient tels quels, un par étape, et chaque étape dit ce que vous devez voir.
0. Le parcours
| Étape | Quoi | Vérifié par |
|---|---|---|
| 1 | Repartir propre : retirer un essai précédent | plus rien ne répond |
| 2 | L'audio de WSL (WSLg) : haut-parleurs et micro de Windows vus de Linux | vous vous entendez |
| 3 | Orkeon depuis son paquet apt | orkeon --version |
| 4 | Orkeon Code dans le home WSL, ses réglages, uv |
/doctor dans le REPL |
| 5 | Le serveur vocal seul : Whisper sur CPU puis sur le GPU, Piper | le script smoke |
| 6 | Dans le REPL : /transcribe, /say, /voice, la conversation vocale |
vous entendez la réponse |
| 7 | Option : la voix Kokoro sur le GPU (speaches, Docker) | /say avec une meilleure voix |
| 8 | Option : le modèle de langue en local, qwen3.5:2b par Ollama sur le même GPU |
/doctor, ollama ps |
Les briques : Whisper (modèle de reconnaissance de la parole d'OpenAI, poids ouverts), que le serveur
mcp/whisper d'Orkeon Code fait tourner par faster-whisper ; Piper, un moteur de synthèse vocale léger, sur
CPU ; le tout exposé au REPL comme un serveur MCP que le lanceur orkeon-code déclare lui-même ; Ollama, qui sert
un modèle de langue sur le GPU, qu'Orkeon reconnaît à son port.
1. Repartir propre
Si la distribution a déjà vu un essai d'Orkeon ou de la voix, retirez ce qui prendrait la place : le paquet apt
orkeon et sa source, une installation depuis une archive de release (~/.local/lib/orkeon,
~/.local/bin/orkeon-repl), l'environnement du serveur vocal d'un clone précédent, un conteneur speaches. Chaque
ligne ne fait rien quand il n'y a rien à retirer. Les paquets Python posés à la main par pip (faster-whisper,
piper-tts, sounddevice) se retirent par pip uninstall ; les modèles téléchargés, les images Docker et
~/.config/Orkeon restent : la section 10 s'en charge.
sudo rm -f /etc/apt/sources.list.d/orkeon.sources /etc/apt/sources.list.d/orkeon.list && (dpkg -s orkeon >/dev/null 2>&1 && sudo apt-get purge -y orkeon orkeon-archive-keyring || true) && sudo rm -f /usr/share/keyrings/orkeon-archive-keyring.gpg && sudo apt-get update -qq
rm -rf ~/.local/lib/orkeon ~/.local/bin/orkeon-repl ~/.local/bin/orkeon ~/orkeon-code/mcp/whisper/.venv; docker rm -f speaches 2>/dev/null; command -v orkeon orkeon-repl || echo clean
Attendu : clean.
2. L'audio de WSL
Sous Windows 11, WSLg fournit à chaque distribution un serveur PulseAudio relié à la carte son de Windows
(/mnt/wslg/PulseServer, variable PULSE_SERVER déjà posée). Le serveur vocal enregistre et joue par PortAudio,
qui sous Linux parle ALSA : il faut router ALSA vers PulseAudio (~/.asoundrc et le greffon libasound2-plugins).
Si WSL n'a pas été mis à jour depuis longtemps (PowerShell, une fois) :
wsl --update
wsl --shutdown
Puis, dans WSL (curl et git aussi, qu'une image nue n'a pas) :
sudo apt-get update && sudo apt-get install -y curl ca-certificates git pulseaudio-utils libportaudio2 libasound2-plugins
printf 'pcm.!default { type pulse }\nctl.!default { type pulse }\n' > ~/.asoundrc
pactl info | grep -E "Server String|Default Sink|Default Source"
Attendu : Server String: unix:/mnt/wslg/PulseServer, Default Sink: RDPSink, Default Source: RDPSource.
Les haut-parleurs : la phrase française de 5 s livrée avec le serveur (elle parle de « dérive »), prise sur GitHub puisque le dépôt n'est pas encore cloné :
curl -fsSL -o /tmp/fr-5s.wav https://raw.githubusercontent.com/Orkeon/orkeon-code/main/mcp/whisper/samples/fr-5s.wav && paplay /tmp/fr-5s.wav
Le micro : 20 secondes de dictée (lisez un paragraphe à voix haute ; Ctrl+C arrête plus tôt), réécoutées
aussitôt. Ce fichier sert à l'étape 6 :
mkdir -p ~/audio && timeout 20 parecord --channels=1 --rate=16000 --file-format=wav ~/audio/note.wav ; paplay ~/audio/note.wav
Le micro n'enregistre que du silence : Windows → Paramètres → Confidentialité et sécurité → Microphone → « Autoriser les applications de bureau à accéder à votre microphone » (WSLg passe par le client Bureau à distance,
msrdc.exe). Puiswsl --shutdown(PowerShell) et rouvrez le terminal WSL. Vérifiez aussi le micro par défaut dans les paramètres son de Windows.
3. Orkeon depuis son paquet apt
Le canal rc porte la dernière release d'Orkeon, 1.0.0-rc.6, une release candidate : Orkeon Code est vérifié
contre un commit du main d'Orkeon (.orkeon-version), et le mode tool exécute cette release en retard sur l'épingle
(Premiers pas). Le canal dev publie un paquet par commit de main validé par la CI, versionné
1.0.0~rc.6.dev.<n> (n est le numéro de l'exécution CI), les trois derniers builds seulement : il sert à suivre
main en avance sur l'épinglage, pas à ce tutoriel. Le paquet installe
/usr/bin/orkeon-repl (le REPL, avec son esbuild : aucun .NET ni npm à installer) et orkeon (la CLI). Systèmes
pris en charge : Debian 12 et 13, Ubuntu 22.04, 24.04 et 26.04 (cat /etc/os-release le dit).
Le bloc est celui du guide d'Orkeon
(Install with apt), avec la seule
différence que sa table des canaux prescrit pour une release candidate : Suites: raw/apt/rc/ au lieu de stable. La clé est
vérifiée par son SHA-256 avant d'être confiée à apt, pour cette source seulement (Signed-By).
sudo apt-get update && sudo apt-get install -y ca-certificates curl
curl -fsSL -o /tmp/orkeon-archive-keyring.gpg https://github.com/Orkeon/orkeon/raw/apt/orkeon-archive-keyring.gpg
echo "0cc5e804e1ee49c50ec5b23145ee7ee65d4834a08b8dc38914674249dfcc6a21 /tmp/orkeon-archive-keyring.gpg" | sha256sum --check
Attendu : /tmp/orkeon-archive-keyring.gpg: OK. Sinon, ne continuez pas.
sudo install -m 0644 /tmp/orkeon-archive-keyring.gpg /usr/share/keyrings/orkeon-archive-keyring.gpg
sudo tee /etc/apt/sources.list.d/orkeon.sources > /dev/null <<'EOF'
Types: deb
URIs: https://github.com/Orkeon/orkeon/
Suites: raw/apt/rc/
Include: orkeon orkeon-archive-keyring
Signed-By: /usr/share/keyrings/orkeon-archive-keyring.gpg
EOF
sudo apt-get update && sudo apt-get install -y orkeon orkeon-archive-keyring
orkeon --version && command -v orkeon-repl
Attendu : 1.0.0-rc.6 (ou la forme que orkeon affiche pour 1.0.0~rc.6) et /usr/bin/orkeon-repl. Plus tard, la
release candidate suivante se prend par sudo apt update && sudo apt upgrade ; apt list -a orkeon liste celles du
canal, et /status dit si celle qui tourne est le commit de .orkeon-version.
4. Orkeon Code dans le home WSL
Un checkout sur le disque Windows (/mnt/c/...) est lisible de WSL, mais y faire tourner le REPL et y créer le
.venv du serveur vocal serait lent (système de fichiers 9p) et fragile (droits, liens symboliques). Le dépôt se
clone depuis GitHub dans le home WSL, sur ext4 (un clone déjà là est mis à jour à la place) :
if [ -d ~/orkeon-code/.git ]; then git -C ~/orkeon-code pull --ff-only; else git clone https://github.com/Orkeon/orkeon-code ~/orkeon-code; fi && cd ~/orkeon-code && git log --oneline -1
Attendu : le dernier commit de main.
Les réglages et la clé du modèle de langue (l'exemple vise DeepSeek ; tout point d'accès compatible OpenAI, ou un
autre fournisseur qu'Orkeon connaît, se règle dans la section Llm : Configuration). La clé
reste dans une variable d'environnement, jamais dans un fichier :
cp config/appsettings.example.json config/appsettings.local.json
export DEEPSEEK_API_KEY=...
uv, qui résout et lance le serveur vocal (Python 3.11 ou plus ; uv en télécharge un si la distribution n'en
a pas) :
curl -LsSf https://astral.sh/uv/install.sh | sh && source ~/.local/bin/env && uv --version
Premier REPL, sans la voix, sur le dépôt d'exemple jetable (--demo), en mode tool (le orkeon-repl du paquet) :
./orkeon-code --mode tool --demo
Le bandeau affiche orkeon-code <version> on Orkeon f80665f (tool) (f80665f est l'épingle de .orkeon-version,
pas la version du paquet), le projet et le fichier de réglages. Dans le REPL :
| Commande | Attendu |
|---|---|
/doctor |
La configuration LLM, les outils et les montages verts ; toolchain: node et toolchain: dotnet peuvent rester rouges (section 9), sans effet en mode tool ; version avertit : le paquet est la dernière release, pas l'épingle |
/permissions |
L'état de la garde : on (un main d'Orkeon récent ; unknown voudrait dire un build trop vieux) |
plan: que fait ce projet ? |
Une réponse du modèle (sinon : la clé n'arrive pas, le lanceur l'a dit au démarrage) |
/exit |
Sortie |
5. Le serveur vocal seul
Deux prérequis de la section 4, que le script ne vérifie pas lui-même :
- Depuis
~/orkeon-code, pas depuis un checkout sur/mnt/c/.... Le script se place dans le checkout où il vit : lancé depuis le disque Windows, il créemcp/whisper/.venvet ses roues CUDA (2,5 Go) à travers le système de fichiers 9p : lent, et fragile. Le clone ext4 du home WSL est là pour ça. uvsur lePATH. Sans lui le script s'arrête surwhisper-mcp-smoke: uv not found. Install it: curl …. L'installeur de la section 4 poseuvdans~/.local/binet ajoute ce dossier auPATHdes nouveaux terminaux ; un terminal ouvert avant veutsource ~/.local/bin/env. Et la section 10 retireuv: après un grand nettoyage, la section 4 est à refaire.
Le script smoke lance le serveur comme Orkeon le fait, par stdio, liste ses six outils, transcrit fr-5s.wav
et, avec --tts, fait écrire une phrase à Piper (haut-parleur éteint) que le même serveur retranscrit. La
première exécution résout l'environnement Python dans mcp/whisper/.venv (une à deux minutes), télécharge le
modèle (small : 462 Mo) et la voix française de Piper (fr_FR-siwis-medium, 63 Mo, dans ~/.cache/orkeon-code/piper).
C'est pour cela que le smoke passe avant le premier REPL : Orkeon donne 30 s à un serveur MCP pour répondre, et
un premier uv run lancé par le REPL les dépasse (section 9).
Sur le CPU :
WHISPER_MODEL=small bash scripts/whisper-mcp-smoke.sh --tts
Attendu : handshake + list_tools: … s, tools: list_audio, record_and_transcribe, speak, stop_speaking, transcribe_audio, whisper_info, le rapport de whisper_info, la transcription contenant « dérive », puis la phrase
de Piper retranscrite (« synthèse vocale » avec small). Ordre de grandeur de small sur CPU : 6 × le temps réel.
Sur le GPU. Sous WSL, aucun pilote NVIDIA ne s'installe dans Linux : celui de Windows suffit, et l'extra cuda
du serveur apporte cuBLAS et cuDNN en roues Python (environ 2,5 Go au premier appel), que le serveur précharge
lui-même : ni CUDA Toolkit, ni LD_LIBRARY_PATH. turbo (large-v3-turbo, 1,6 Go à télécharger) est le meilleur
modèle sur un GPU de 8 Go : il écrit juste les noms propres que small déforme (small tient en 1,3 Go de mémoire
vidéo).
nvidia-smi --query-gpu=name,memory.total --format=csv,noheader
Attendu : le nom de la carte et sa mémoire, par exemple NVIDIA GeForce RTX 3070 Ti Laptop GPU, 8192 MiB.
WHISPER_DEVICE=cuda WHISPER_COMPUTE_TYPE=float16 WHISPER_MODEL=turbo bash scripts/whisper-mcp-smoke.sh --tts
Attendu : la même sortie que sur le CPU, whisper_info disant cuda et float16, et le premier passage qui
télécharge plusieurs Go (roues CUDA, turbo, la voix Piper) : quelques minutes. Mesuré sur ce GPU, pour un
enregistrement de 45 minutes : small en 95 s (28 × le temps réel), turbo en 106 s, contre 7 min 14 s pour
small sur un CPU de 20 cœurs.
6. Dans le REPL : transcrire, lire à voix haute, dicter
Cinq variables suffisent au lanceur : il monte ~/audio sur /audio, écrit les transcriptions dans
.crew-output/transcripts (vues comme /transcripts), déclare le serveur au REPL avec les extras tts, voice
et cuda, et ouvre le micro et le haut-parleur (ORKEON_CODE_VOICE=1).
export ORKEON_CODE_AUDIO_DIR=~/audio ORKEON_CODE_VOICE=1 WHISPER_DEVICE=cuda WHISPER_COMPUTE_TYPE=float16 WHISPER_MODEL=turbo
./orkeon-code --mode tool --demo
Le bandeau gagne une ligne : audio : /home/<vous>/audio -> /audio (transcripts: …/.crew-output/transcripts, model turbo on the GPU, microphone and speaker on). Si elle manque, le lanceur a dit pourquoi juste avant
(uv absent du PATH, par exemple : source ~/.local/bin/env).
Transcription (la note de l'étape 2) :
| Commande | Attendu |
|---|---|
/debug-tool-call whisper_info |
Le backend local, turbo sur cuda, model_cached: True, micro et haut-parleur on |
/transcribe --list |
/audio/note.wav |
/transcribe note.wav --lang fr |
Le texte de votre note ; --prompt "Orkeon, MCP, WSL" épelle juste les noms que vous citez |
/transcribe note.wav --then "résume cette note en une phrase" |
Le modèle répond sur la transcription (clé nécessaire) |
Une transcription courte revient en ligne ; une longue est écrite sous /transcripts/<nom>.txt (et en parties
.part-NN.txt au-delà de 30 000 caractères) que l'assistant lit par file_read. Une seule transcription à la fois ;
le REPL reste disponible pendant qu'elle tourne.
Synthèse vocale (Piper, sur CPU : une phrase démarre environ 4 s après la commande, le REPL rend la main aussitôt) :
| Commande | Attendu |
|---|---|
/say Bonjour, la synthèse vocale fonctionne. |
La phrase dans les haut-parleurs ; une ligne reading aloud: N characters, X s |
/say |
La dernière réponse de l'assistant, lue : le Markdown nettoyé (blocs de code et tableaux sautés) |
/say --stop |
Coupe la lecture |
/say --voice en_US-lessac-medium Hello there |
Une autre voix Piper, téléchargée au premier usage |
Dictée (le serveur enregistre jusqu'à 2 s de silence, 60 s au plus ; rien n'est envoyé sans ordre) :
| Commande | Attendu |
|---|---|
/voice --lang fr |
Parlez ; à l'arrêt, 🎙 <votre phrase> puis send it: /voice send · … |
/voice send |
La phrase part à l'assistant comme une requête tapée |
/config set voice.reply on |
Chaque réponse est désormais lue à voix haute |
/voice --go |
Enregistre et envoie d'un coup : la conversation vocale complète, requête dictée, réponse lue |
/config set voice.reply off puis /exit |
Retour au silence, sortie |
Mesuré sur cette machine : une réponse de 236 caractères lue en 14 s ; /voice coupe une lecture en cours avant
d'ouvrir le micro, pour ne pas l'enregistrer. Dans une pièce bruyante, /voice ne s'arrête pas seul : exportez
WHISPER_SILENCE_RMS=0.02 (ou 0.05) avant de relancer.
7. Option : la voix Kokoro sur le GPU (speaches)
Piper suffit, mais speaches sert la voix Kokoro, plus naturelle, par la
même API que celle d'OpenAI, sur le GPU : la synthèse d'une phrase prend 0,6 s au lieu de 4,5. Il faut Docker dans
WSL avec le GPU : Docker Desktop (intégration WSL activée pour votre distribution) le fournit sans rien d'autre.
Aucune clé ne part vers ce serveur (le serveur vocal n'en envoie que si TTS_API_KEY_VAR en nomme une).
docker run -d --name speaches --gpus all -p 127.0.0.1:8000:8000 -v speaches-hf:/home/ubuntu/.cache/huggingface ghcr.io/speaches-ai/speaches:latest-cuda
curl -X POST http://localhost:8000/v1/models/speaches-ai/Kokoro-82M-v1.0-ONNX
Attendu : le téléchargement du modèle (26 s mesurées), une fois.
export TTS_BACKEND=http TTS_BASE_URL=http://localhost:8000/v1 TTS_MODEL=speaches-ai/Kokoro-82M-v1.0-ONNX TTS_VOICE=ff_siwis
./orkeon-code --mode tool --demo
Puis /say Bonjour, ceci est Kokoro sur la carte graphique. : la voix ff_siwis (le français de Kokoro) presque
sans délai. Le lanceur a ajouté de lui-même l'extra openai au serveur. Pour revenir à Piper : unset TTS_BACKEND TTS_BASE_URL TTS_MODEL TTS_VOICE. Arrêter le serveur : docker stop speaches.
8. Option : Qwen en local avec Ollama
Le modèle de langue des sections 4 à 6 est distant (DeepSeek, une clé). Ollama en fait tourner
un sur le GPU, sans clé et sans que rien ne quitte la machine ; Orkeon le reconnaît à son port (11434) et lui parle
en natif (/api/chat, appels d'outils compris). Ce tutoriel prend qwen3.5:2b : 2,7 Go, fenêtre de 256K,
outils, raisonnement et vision, qui tient à côté de Whisper turbo dans les 8 Go de la carte (environ 3 Go chargé).
Le plus petit Qwen de la bibliothèque, qwen2.5:0.5b (398 Mo), vérifie la plomberie (Orkeon ↔ Ollama, les appels
d'outils natifs, le GPU partagé) mais pas grand-chose d'autre ; qwen3:8b (5,2 Go), avec lequel Orkeon Code a été
validé, ne tient plus à côté de turbo (section 9). Un autre Qwen, ce sont les mêmes commandes avec son nom : le
tableau dit lesquels tiennent. Les Qwen de la bibliothèque Ollama en octobre 2026 (taille du tag par défaut, fenêtre
annoncée ; tous savent appeler des outils, qwen3 et au-delà raisonnent, qwen3.5 et au-delà voient les images) :
| Modèle | Mo | Fenêtre | À côté de turbo (8 Go) |
|---|---|---|---|
qwen2.5:0.5b |
398 | 32K | oui, le plus petit |
qwen3:0.6b |
523 | 40K | oui |
qwen2.5:1.5b |
986 | 32K | oui |
qwen3.5:0.8b |
1 200 | 256K | oui |
qwen3:1.7b |
1 400 | 40K | oui |
qwen2.5:3b |
1 900 | 32K | oui |
qwen3:4b |
2 500 | 256K | oui |
qwen3.5:2b |
2 700 | 256K | oui, le choix de ce tutoriel |
qwen3.5:4b |
3 300 | 256K | oui |
qwen2.5:7b |
4 700 | 32K | juste |
qwen3:8b |
5 200 | 40K | déborde sur le CPU |
qwen3.5:9b |
6 600 | 256K | non |
qwen2.5:14b, qwen3:14b |
9 000, 9 300 | 32K, 40K | non |
qwen3.8:27b, qwen3.6:27b, qwen3.5:27b |
18 000, 18 000, 17 000 | 256K | non |
qwen3:30b, qwen3-coder:30b |
19 000 | 256K | non |
qwen2.5:32b, qwen3:32b |
20 000 | 32K, 40K | non |
qwen3.5:35b, qwen3.6:35b |
22 000, 23 000 | 256K | non |
qwen2.5:72b, qwen3.5:122b, qwen3:235b, qwen3-coder:480b |
47 000, 81 000, 142 000, 290 000 | 32K ou 256K | non |
qwen2.5-coder existe aux mêmes tailles que qwen2.5 (0.5b à 32b, 32K), entraîné pour le code.
Ollama dans la distribution. Pas d'autre pilote que celui de Windows : l'installeur reconnaît WSL2 et saute
l'installation du pilote NVIDIA. Ollama déjà installé (ollama --version répond) : l'installeur le met à jour, rien
d'autre.
curl -fsSL https://ollama.com/install.sh | sh
Attendu : >>> Installing ollama to /usr/local, la création de l'utilisateur et du service
(>>> Enabling and starting ollama service...), >>> Nvidia GPU detected., puis
>>> The Ollama API is now available at 127.0.0.1:11434. et >>> Install complete.. Un
WARNING: systemd is not running veut dire une distribution sans systemd : activez-le ([boot] systemd=true dans
/etc/wsl.conf, puis wsl --shutdown côté Windows), ou lancez ollama serve & dans ce terminal à chaque session.
La fenêtre de contexte. Ollama sert chaque modèle avec 4 096 tokens par défaut, et Orkeon ne l'élargit pas par
requête (il n'envoie pas num_ctx). Le prompt système d'Orkeon Code en fait déjà environ 2 250, avant les schémas des
outils et la conversation : au-delà de la fenêtre, Ollama tronque le début du prompt sans erreur, et le modèle perd
ses consignes et ses outils. Le service reçoit donc 16 384 tokens, par un drop-in systemd :
sudo mkdir -p /etc/systemd/system/ollama.service.d && printf '[Service]\nEnvironment="OLLAMA_CONTEXT_LENGTH=16384"\n' | sudo tee /etc/systemd/system/ollama.service.d/context.conf >/dev/null && sudo systemctl daemon-reload && sudo systemctl restart ollama && systemctl show ollama -p Environment
Attendu : une ligne Environment=… qui contient OLLAMA_CONTEXT_LENGTH=16384 (sans systemd :
OLLAMA_CONTEXT_LENGTH=16384 ollama serve & à la place).
Le modèle :
ollama pull qwen3.5:2b && ollama run qwen3.5:2b "Answer in one word: what is the capital of France?" && ollama ps
Attendu : le téléchargement (2,7 Go, une fois), Paris après quelques lignes de réflexion (qwen3.5 raisonne avant
de répondre), puis une ligne qwen3.5:2b … 100% GPU (le modèle reste chargé 5 minutes après le dernier appel).
100% CPU, ou un partage xx%/yy% CPU/GPU, voudrait dire que le pilote n'est pas vu (section 9).
Les réglages d'Orkeon Code. Deux exemples tout prêts dans le dépôt, pour un second fichier à côté de celui de
la section 4 (un .local.json reste hors git) :
- config/appsettings.ollama-whisper.example.json, la voie
validée :
appsettings.example.jsondont la sectionLlmvise Ollama (qwen3.5:2bsurhttp://localhost:11434, pas de clé puisque Orkeon n'en demande pas à Ollama, température 0,6, la recommandation de Qwen pour son mode raisonnement,qwen3.5:4betqwen3.5:0.8bdansAvailableModels), plus le serveur vocal déclaré dans le fichier :turbosurcuda, Piper, micro et haut-parleur. Quatre chemins/home/me/...à remplacer par les vôtres ; le checkout est~/orkeon-code. Les deux dossiers du serveur doivent exister : rien ne les crée à votre place. - config/appsettings.ollama.example.json, la même section
Llmseule : le serveur vocal reste alors déclaré par le lanceur depuis les variables de la section 6.
Avec le premier, une ligne copie, remplace les chemins, crée les dossiers et vérifie :
cd ~/orkeon-code && cp config/appsettings.ollama-whisper.example.json config/appsettings.ollama.local.json && sed -i "s#/home/me#$HOME#g" config/appsettings.ollama.local.json && mkdir -p ~/audio ~/transcripts && grep -o "$HOME/orkeon-code/mcp/whisper" config/appsettings.ollama.local.json | wc -l
Attendu : 2 (les deux chemins du serveur, --project et le script, pointent votre clone).
Puis l'environnement du serveur, résolu une fois hors du REPL : exactement la commande que le fichier déclare,
l'entrée fermée pour que le serveur s'arrête seul une fois démarré. Orkeon donne 30 s à un serveur MCP pour
répondre ; ce premier uv run télécharge les roues CUDA (cuBLAS 554 Mo, cuDNN 731 Mo) et les dépasse de loin :
lancé par le REPL, le serveur manquerait à chaque démarrage (no registered tool 'whisper_info').
cd ~/orkeon-code && time (WHISPER_AUDIO_DIR=$HOME/audio WHISPER_OUT_DIR=$HOME/transcripts WHISPER_MODEL=turbo WHISPER_DEVICE=cuda WHISPER_COMPUTE_TYPE=float16 WHISPER_MICROPHONE=1 WHISPER_SPEAKER=1 ~/.local/bin/uv run --project ~/orkeon-code/mcp/whisper --extra voice --extra tts --extra cuda ~/orkeon-code/mcp/whisper/whisper_mcp.py < /dev/null)
Attendu la première fois : Preparing packages, les deux roues NVIDIA qui se téléchargent, puis l'arrêt silencieux et
un real de plusieurs minutes ; relancée, elle revient en quelques secondes sans rien imprimer. Le smoke de la
section 5, lancé dans ce clone, prépare le même environnement et télécharge turbo en plus.
Dans le REPL. Les variables de la section 6 ne servent plus, le fichier porte tout ; encore exportées, le
lanceur dit declares a "whisper" MCP server: ORKEON_CODE_AUDIO_DIR is ignored, the settings file wins, sans
conséquence.
./orkeon-code --mode tool --demo --settings config/appsettings.ollama.local.json
Le lanceur ne réclame aucune clé (la section Llm ne nomme pas d'ApiKeyEnvVar).
| Commande | Attendu |
|---|---|
/doctor |
llm: model configured ✅ qwen3.5:2b, le catalogue des trois Qwen, /audio(ro) et /transcripts(ro) parmi les montages ; toolchain: node ou dotnet rouges (section 9), sans effet ici |
/debug-tool-call whisper_info |
audio: /audio -> /home/<vous>/audio, microphone: on (WHISPER_MICROPHONE=1), speaker: on (WHISPER_SPEAKER=1), backend: local, model: turbo, device: cuda, compute_type: float16, model_cached: True une fois le smoke GPU de la section 5 passé, False sinon, tts_backend: piper, tts_voice: fr_FR-siwis-medium |
plan: que fait ce projet ? |
Une réponse du modèle local, courte ; dans un autre terminal, ollama ps montre le modèle chargé et nvidia-smi Ollama et le serveur vocal côte à côte (turbo : environ 2 Go, Qwen : environ 3 Go) |
/transcribe note.wav --then "résume cette note en une phrase" |
Le premier appel télécharge turbo (1,6 Go) si la section 5 ne l'a pas fait ; puis la transcription par Whisper, le résumé par Qwen, sur le même GPU : rien n'a quitté la machine |
/model |
qwen3.5:4b et qwen3.5:0.8b aussi ; un ollama pull <nom> avant de basculer sur un autre |
/exit |
Sortie |
Une réponse qui se fait attendre, c'est la réflexion de qwen3.5 : "Thinking": {"Enabled": false} dans la
section Llm la coupe, au prix d'appels d'outils moins sûrs. Pour revenir à DeepSeek : relancez sans --settings.
Arrêter Ollama : sudo systemctl stop ollama (il redémarre avec la distribution ; sudo systemctl disable ollama
pour l'en empêcher).
9. Dépannage
| Symptôme | Piste |
|---|---|
pactl: Connection failure ou Server String qui n'est pas /mnt/wslg/PulseServer |
echo $PULSE_SERVER vide : export PULSE_SERVER=unix:/mnt/wslg/PulseServer ; un démon pulseaudio installé dans la distribution par un essai passé prend la place de celui de WSLg : sudo apt-get purge pulseaudio ; sinon wsl --update puis wsl --shutdown |
paplay ne donne rien, sans erreur |
La sortie par défaut de Windows ; pactl list short sinks doit montrer RDPSink |
| Le micro enregistre du silence | La confidentialité Windows (étape 2) ; pactl list short sources doit montrer RDPSource |
apt-get update : NO_PUBKEY |
La clé manque ou n'est pas au bon format : refaire les trois lignes de la clé (étape 3) |
apt-get update : Conflicting distribution |
La ligne Suites: a été modifiée au-delà du nom du canal |
apt-get install orkeon : Unable to locate package orkeon |
La source n'est pas sur raw/apt/rc/ (stable ne porte que les versions finales, et il n'y en a pas encore) |
/doctor : toolchain: node ❌, ou toolchain: dotnet ❌ 10.0.2xx [/usr/share/dotnet/sdk] |
Le mode tool n'a besoin ni de l'un ni de l'autre : le paquet embarque son esbuild, et rien n'appelle dotnet. Pour les passer au vert quand même : node à la version de .nvmrc (nodesource ou nvm) ; pour dotnet, le global.json du dépôt demande le SDK 10.0.300 ou une bande supérieure (latestFeature) et la distribution a une bande plus ancienne : sudo apt-get install --only-upgrade dotnet-sdk-10.0 (le dépôt apt de Microsoft, /usr/share/dotnet) |
Pas de ligne audio dans le bandeau |
Le lanceur a dit pourquoi : uv absent du PATH, un serveur whisper déjà déclaré dans les réglages ou l'environnement, mode docker |
whisper-mcp-smoke: uv not found. Install it: … |
L'étape 4 n'a pas été faite, ou la section 10 est passée par là, ou le terminal date d'avant l'installation : source ~/.local/bin/env ; sinon curl -LsSf https://astral.sh/uv/install.sh \| sh && source ~/.local/bin/env |
MCP server 'whisper' could not be connected: no answer within 30 s au démarrage, puis no registered tool 'whisper_info' |
Orkeon donne 30 s au serveur pour répondre ; le premier uv run du clone résout l'environnement (roues CUDA, minutes). Préparez l'environnement hors du REPL : le smoke (section 5), ou la commande déclarée lancée une fois à la main avec < /dev/null (section 8) ; relancez ensuite |
MCP server 'whisper' could not be connected: … avec un chemin |
Un chemin du fichier de réglages est faux : Command (~/.local/bin/uv), --project et le script (~/orkeon-code/mcp/whisper), les deux dossiers en double dans Mounts et Env |
fail: … Failed to start MCP server process |
uv n'est pas sur le PATH du REPL : source ~/.local/bin/env puis relancer |
Library libcublas.so.12 is not found |
WHISPER_DEVICE=cuda sans l'extra cuda : le lanceur et le smoke l'ajoutent seuls sur WHISPER_DEVICE=cuda ; un serveur déclaré à la main veut --extra cuda |
CUDA driver version is insufficient, ou nvidia-smi absent dans WSL |
Mettre à jour le pilote NVIDIA côté Windows ; wsl --update |
no microphone access (PortAudio library not found) |
libportaudio2 manque, ou le serveur tourne sans l'extra voice (ORKEON_CODE_VOICE=1) |
the microphone is off / not played: the speaker is off |
ORKEON_CODE_VOICE=1 n'était pas exporté au lancement |
/voice ne s'arrête qu'au maximum |
La pièce dépasse WHISPER_SILENCE_RMS : 0.02, 0.05 |
Piper is not installed |
Le serveur tourne sans l'extra tts (le lanceur l'ajoute dès que Piper est le moteur) |
| Le premier appel semble bloqué | Le modèle se télécharge ; whisper_info dit model_cached: False tant qu'il n'est pas sur le disque |
Error: Timeout of 00:00:10 reached sur /debug-tool-call transcribe_audio |
La limite de Jint sur une commande synchrone, pas le serveur : utiliser /transcribe, qui attend dans un crew |
| Whisper invente du texte sur du silence | Hallucination connue ; le filtre vad_filter est actif par défaut ; nommer la langue (--lang fr) |
connection refused sur localhost:11434, ou /doctor ne joint pas le modèle |
Le service Ollama ne tourne pas : sudo systemctl start ollama (systemctl status ollama) ; sans systemd, ollama serve & |
Le modèle local ignore ses consignes ou ses outils ; journalctl -u ollama \| grep truncat montre truncating input prompt |
La fenêtre de 4 096 tokens par défaut : systemctl show ollama -p Environment doit contenir OLLAMA_CONTEXT_LENGTH=16384 (section 8) |
ollama ps : 100% CPU |
Le pilote Windows n'est pas vu d'Ollama : nvidia-smi dans WSL, journalctl -u ollama \| grep -i cuda ; mettre à jour le pilote côté Windows, wsl --shutdown |
Un Qwen de 8 milliards (qwen3:8b, 5,2 Go) en plus de turbo sur le GPU |
Ensemble ils approchent les 8 Go : le modèle de langue déborde sur le CPU (ollama ps : xx%/yy% CPU/GPU) ; prendre small pour Whisper, ou un Qwen plus petit (section 8) |
10. Tout retirer
Dans l'ordre : les deux blocs de l'étape 1 (le paquet et sa source, l'installation locale, le .venv, le
conteneur), puis ce qu'ils gardent.
rm -rf ~/orkeon-code ~/audio ~/transcripts ~/.asoundrc ~/.config/Orkeon ~/.cache/orkeon-code ~/.cache/huggingface/hub/models--Systran--faster-whisper-* ~/.cache/huggingface/hub/models--mobiuslabsgmbh--faster-whisper-large-v3-turbo
rm -rf ~/.cache/uv ~/.local/bin/uv ~/.local/bin/uvx ~/.local/bin/env
sudo apt-get purge -y pulseaudio-utils libportaudio2 libasound2-plugins
docker rmi ghcr.io/speaches-ai/speaches:latest-cuda ; docker volume rm speaches-hf
Attendu, après les deux derniers : Removing … pour les trois paquets, puis Untagged: … et speaches-hf
(ou No such image / No such volume si l'étape 7 n'a pas été faite).
Ollama (étape 8), avec ses modèles (/usr/share/ollama) ; le fichier de réglages est parti avec ~/orkeon-code :
sudo systemctl stop ollama ; sudo systemctl disable ollama ; sudo rm -rf /etc/systemd/system/ollama.service /etc/systemd/system/ollama.service.d /usr/local/lib/ollama /usr/local/bin/ollama /usr/share/ollama ~/.ollama ; sudo userdel ollama ; sudo groupdel ollama ; sudo systemctl daemon-reload
Attendu : Removed … ollama.service au disable, puis rien ; ollama --version répond désormais command not found.
11. Ce que ce tutoriel ne vérifie pas
- L'API d'OpenAI (
WHISPER_BACKEND=openai,TTS_BACKEND=openai) : l'audio ou le texte quittent la machine, et il faut une cléOPENAI_API_KEY; rien ici n'en a besoin. - Le mode docker du lanceur : le serveur vocal y tourne sur l'hôte, en HTTP, sans micro
(mcp/whisper/README.md). Le mode
toolde ce tutoriel est le plus simple et le seul où/voiceet/sayont le micro et le haut-parleur. - Ollama installé côté Windows plutôt que dans la distribution : de WSL,
localhost:11434ne le joint qu'avec le réseau en miroir (networkingMode=mirroreddans.wslconfig) ou unOLLAMA_HOST=0.0.0.0côté Windows et l'adresse de l'hôte dansBaseUrl; l'étape 8 installe Ollama dans la distribution, où il voit le GPU par le même pilote. - Le lanceur PowerShell (
orkeon-code.ps1), Windows natif : il n'a pas de mode source, et WSL avec le lanceur bash, comme ici, est la voie documentée.