Cet article fait partie de la série Assistant vocal sur Raspberry Pi.
On a deux Raspberry Pi 4, quelques heures de setup, et à la fin un assistant vocal qui tourne entièrement en local. Avant d’écrire la moindre ligne de code .NET, on règle le setup des deux Pi.
L’architecture en deux Pi
Les deux Pi ont des rôles bien distincts :
| Pi Client (2 Go) | Pi Cerveau (4 Go) | |
|---|---|---|
| Rôle | Audio, GPIO, orchestration | LLM local (Ollama) |
| Parle à | Pi Cerveau via HTTP | - |
| Technologies | .NET 10 Worker Service, Whisper, Piper TTS | Ollama + Llama 3.2 3B |
| Hostname | pi-client | pi-cerveau |
Étape 1 : Flasher Raspberry Pi OS Lite 64-bit
Sur les deux Pi, on veut la même image de base : Raspberry Pi OS Lite (64-bit). Pas d’interface graphique, on fait tout en SSH.
Téléchargez et installez Raspberry Pi Imager.
Dans l’Imager :
- OS : Raspberry Pi OS (other) → Raspberry Pi OS Lite (64-bit)
- Storage : votre carte microSD
- Cliquez sur Edit Settings (l’icône ⚙️) avant de flasher :
Hostname : pi-client (ou pi-cerveau pour le 2e)
Username : gabriel
Password : [votre choix]
Wi-Fi SSID : [votre réseau]
Wi-Fi Pass : [votre mot de passe]
Locale : America/Toronto
SSH : ✅ Enable SSH (Use password authentication)
Répétez l’opération pour le deuxième Pi en changeant uniquement le hostname (pi-cerveau).
Étape 2 : Premier boot et connexion SSH
Une fois les deux Pi branchés et démarrés, trouvez leurs IPs sur votre réseau :
# Ping par hostname (mDNS)
ping pi-client.local
ping pi-cerveau.local
Si le ping par hostname ne fonctionne pas, vérifiez votre routeur pour les IPs assignées.
Connexion SSH :
ssh gabriel@pi-client.local
ssh gabriel@pi-cerveau.local
Étape 3 : Mise à jour du système
Sur les deux Pi :
sudo apt update && sudo apt full-upgrade -y
sudo apt autoremove -y
sudo reboot
Reconnectez-vous après le reboot.
Étape 4 : Installer .NET 10
Sur les deux Pi :
curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --channel 10.0
Ajoutez .NET au PATH de façon permanente :
echo 'export DOTNET_ROOT=$HOME/.dotnet' >> ~/.bashrc
echo 'export PATH=$PATH:$HOME/.dotnet:$HOME/.dotnet/tools' >> ~/.bashrc
source ~/.bashrc
Validez :
dotnet --version
# Attendu : 10.x.x
Pi Client seulement : si vous avez un écran branché, configurez le Screen Blanking via
sudo raspi-config→ Display Options → Screen Blanking → Enable. Évitez de modifier/boot/firmware/cmdline.txtpour ça :consoleblank=300peut être ignoré silencieusement sur Pi OS Bookworm quandplymouthest actif.
Étape 5 : Audio ALSA (Pi Client seulement)
Le Pi Client gère le microphone et le haut-parleur. Installez les libs ALSA :
sudo apt install -y \
alsa-utils \
libsndfile1 \
portaudio19-dev \
ffmpeg
Tester le microphone
Branchez votre microphone USB :
# Lister les périphériques d'entrée
arecord -l
# Enregistrement de 5 secondes
arecord -D hw:1,0 -f cd -t wav -d 5 test.wav
# Réécoute
aplay test.wav
Si
arecord -lne voit pas votre micro, essayezhw:2,0ouhw:0,0selon ce qui est listé.
Tester le haut-parleur
# Lister les périphériques de sortie
aplay -l
# Test audio
speaker-test -t wav -c 2
Étape 6 : Dépendances pour Whisper (Pi Client seulement)
On utilise Whisper.net via le runtime natif. Installez les dépendances système :
sudo apt install -y cmake build-essential
Le package NuGet
Whisper.netet ses runtimes s’ajoutent directement dans le projet .NET. On y revient dans l’article #2.
Étape 7 : Installer Piper TTS (Pi Client seulement)
Piper est un moteur text-to-speech léger qui tourne nativement sur ARM64.
mkdir -p ~/piper && cd ~/piper
# Télécharger le binaire ARM64
wget https://github.com/rhasspy/piper/releases/latest/download/piper_linux_aarch64.tar.gz
tar -xzf piper_linux_aarch64.tar.gz
# Le tar extrait dans un sous-dossier piper/ — le PATH doit pointer vers ~/piper/piper
echo 'export PATH=$PATH:$HOME/piper/piper' >> ~/.bashrc
source ~/.bashrc
piper --version
Télécharger une voix française
mkdir -p ~/piper-voices && cd ~/piper-voices
wget https://huggingface.co/rhasspy/piper-voices/resolve/main/fr/fr_FR/siwis/low/fr_FR-siwis-low.onnx
wget https://huggingface.co/rhasspy/piper-voices/resolve/main/fr/fr_FR/siwis/low/fr_FR-siwis-low.onnx.json
Tester Piper
echo "Bonjour, je suis votre assistant vocal." | \
piper --model ~/piper-voices/fr_FR-siwis-low.onnx --output_raw | \
aplay -r 22050 -f S16_LE -t raw -
C’est le moment wow du setup.
Étape 8 : Installer Ollama (Pi Cerveau seulement)
curl -fsSL https://ollama.com/install.sh | sh
Ollama s’installe comme service systemd automatiquement. Validez :
ollama --version
systemctl status ollama
Télécharger le modèle
# Llama 3.2 3B : bon compromis qualité/vitesse pour 4 Go de RAM
ollama pull llama3.2:3b
À l’article #4, on passe à
llama3.2:1bparce que le 3B dépasse régulièrement le timeout sur un Pi 4 Go chargé. Pullons quand même le 3B ici pour les tests initiaux.
Le téléchargement fait environ 2 Go. Prenez un café.
Tester en français
ollama run llama3.2:3b "Réponds en français : quelle est la capitale du Québec?"
Exposer Ollama sur le réseau local
Par défaut, Ollama écoute seulement sur localhost (127.0.0.1:11434). Il faut l’exposer pour que le Pi Client puisse l’appeler. sudo systemctl edit ollama peut ne pas créer le fichier correctement sur Pi OS, on le crée manuellement :
sudo mkdir -p /etc/systemd/system/ollama.service.d/
sudo nano /etc/systemd/system/ollama.service.d/override.conf
Collez exactement ceci :
[Service]
Environment="OLLAMA_HOST=0.0.0.0"
Sauvegardez (Ctrl+X, Y, Enter), puis :
sudo systemctl daemon-reload
sudo systemctl restart ollama
Vérifiez que le service écoute sur toutes les interfaces :
systemctl status ollama | grep Listening
# Attendu : Listening on [::]:11434
Puis depuis le Pi Client :
curl http://pi-cerveau.local:11434/api/tags
Vous devriez voir un JSON listant llama3.2:3b.
Étape 9 : IPs statiques (optionnel)
Pour que les deux Pi se trouvent toujours, assignez des IPs fixes dans votre routeur via une réservation DHCP par adresse MAC :
# Trouver l'adresse MAC
ip link show eth0 | grep ether
Les deux Pi répondent sur le réseau, .NET 10 est installé, Piper parle. On peut passer au code.
Articles de la série
- Setup des deux Raspberry Pi (cet article)
- Worker Service .NET 10 et pipeline audio
- Intégration Ollama et contexte maison
- Mémoire, détection de silence et systemd
- Météo en temps réel et swap Claude API
- Function Calling : enseigner des outils à l’assistant
- Bilan, leçons apprises et perspectives v2
Dans l’article #2, on crée le projet .NET 10 Worker Service et on câble le bouton GPIO au pipeline audio complet, sans LLM pour l’instant, juste pour valider que la chaîne son fonctionne de bout en bout.
Cet article a été rédigé avec l’aide de l’IA et révisé par moi.