Avancé 15 minAudio

Assistant vocal 100 % local : Whisper + Ollama + Piper

Un assistant vocal local écoute, comprend et répond à voix haute sans jamais envoyer un octet dans le cloud. Ce guide assemble trois briques open source — Whisper pour la reconnaissance vocale, un LLM servi par Ollama pour le raisonnement, et Piper pour une voix française naturelle — en une boucle complète qui tourne sur votre propre machine. On détaille la chaîne STT → LLM → TTS, le matériel conseillé, et la latence à laquelle vous attendre réellement.

Par Samir K.·Màj 2026-07-25·Testé sur Windows, macOS, Linux

#Pourquoi un assistant vocal local

Alexa, Google Assistant et Siri partagent le même défaut : chaque phrase que vous prononcez part sur des serveurs distants pour être transcrite et interprétée. Un assistant vocal local inverse ce modèle. Le micro, la reconnaissance, le raisonnement et la voix de réponse vivent tous sur votre matériel. Rien ne transite par internet, et l'assistant continue de fonctionner même connexion coupée.

Au-delà de la vie privée, l'intérêt est le contrôle. Vous choisissez le modèle de langage, sa personnalité via le prompt système, la voix de sortie, et vous pouvez le brancher sur vos propres outils — domotique, agenda, notes — sans dépendre d'une API tierce qui peut fermer ou changer ses conditions du jour au lendemain.

Confidentialité
Aucune commande vocale n'est enregistrée ni analysée par un tiers. Idéal pour un usage domestique ou professionnel sensible.
Hors-ligne
La chaîne complète fonctionne sans internet une fois les modèles téléchargés.
Personnalisable
Prompt système, voix, langue, wake-word et outils sont tous sous votre contrôle.
Sans abonnement
Tout est open source. Le seul coût est votre matériel et l'électricité.

#La chaîne STT → LLM → TTS

Un assistant vocal, aussi sophistiqué soit-il, n'est qu'un enchaînement de trois étapes. Comprendre ce découpage est la clé pour diagnostiquer la latence et remplacer un maillon sans casser le reste.

  1. 01
    STT — Speech To Text
    Le micro capte votre voix, et Whisper la transforme en texte. C'est la reconnaissance vocale. La qualité dépend du modèle Whisper choisi et du bruit ambiant.
  2. 02
    LLM — le raisonnement
    Le texte transcrit est envoyé à un modèle de langage servi par Ollama, avec un prompt système qui définit le rôle de l'assistant. Le LLM génère une réponse écrite.
  3. 03
    TTS — Text To Speech
    La réponse texte est passée à Piper, qui la prononce à voix haute avec une voix française. C'est la synthèse vocale.
i
Trois processus indépendants
Chaque brique est un programme séparé qui parle aux autres via des fichiers audio, du texte ou des appels HTTP. Vous pouvez tester chaque maillon isolément avant de câbler la boucle — c'est fortement recommandé.

La latence perçue est la somme des trois étapes : le temps de transcription Whisper, le temps de génération du LLM (le plus variable), et le temps de synthèse Piper. On y revient en détail plus bas.

#Prérequis et matériel

Un assistant vocal local est plus exigeant qu'un simple chat texte : Whisper et le LLM se partagent le GPU, et la réactivité compte. Voici les repères matériels selon l'ambition.

Minimal (CPU seul)
Whisper base + un LLM 3B en Q4_K_M (≈2 Go). Fonctionne, mais comptez plusieurs secondes de latence par tour. Acceptable pour de la domotique où l'on ne parle pas en continu.
Confortable
RTX 3060 12GB ou RTX 4070 12GB. Whisper small/medium sur GPU + un LLM 7B Q4_K_M (≈5 Go). Latence de l'ordre de 1 à 3 secondes par tour.
Fluide
RTX 4080 16GB / RTX 4090 24GB ou un Mac M4 Pro (24-48 Go unifiés). Whisper medium + un LLM 14B Q4_K_M (≈9 Go), réponses quasi immédiates.
Micro et audio
Un micro USB correct suffit. Sous Linux, PipeWire ou PulseAudio ; sous macOS/Windows, la config par défaut convient.
Partager le GPU intelligemment
Whisper et le LLM ne travaillent jamais exactement en même temps : Whisper transcrit, puis le LLM répond. Un GPU 12 Go peut donc héberger Whisper small et un 7B sans les faire tourner simultanément à pleine charge.

Côté logiciel, on suppose Ollama déjà installé et fonctionnel. Si ce n'est pas le cas, commencez par le guide d'installation d'Ollama avant de continuer. Vérifiez que le daemon répond.

Vérifier Ollama
curl http://localhost:11434/api/tags
# doit renvoyer la liste JSON des modèles installés

#1. Écoute et transcription (Whisper)

Whisper est le modèle de reconnaissance vocale d'OpenAI, distribué en open source. Pour un usage local temps réel, on privilégie faster-whisper, une réimplémentation optimisée qui utilise CTranslate2 et tourne bien plus vite que la version de référence, sur CPU comme sur GPU.

Installer faster-whisper
pip install faster-whisper sounddevice numpy

Les modèles Whisper existent en plusieurs tailles. Plus le modèle est gros, meilleure est la transcription — surtout en français et en environnement bruyant — mais plus il est lent.

tiny / base
Très rapides, parfaits pour un CPU modeste ou de la domotique. Transcription correcte de commandes courtes en français.
small
Bon compromis vitesse/qualité pour la plupart des assistants. Recommandé comme point de départ.
medium
Nettement meilleur sur les phrases longues et les accents, mais demande un GPU pour rester fluide.
large-v3
Qualité maximale, réservé aux GPU confortables si la latence importe.

Voici une fonction d'écoute qui enregistre depuis le micro et renvoie le texte transcrit. On force la langue française pour éviter les erreurs de détection.

ecoute.py
import sounddevice as sd
import numpy as np
from faster_whisper import WhisperModel

# device='cuda' + compute_type='float16' sur GPU ; 'cpu' + 'int8' sinon
model = WhisperModel('small', device='cuda', compute_type='float16')

def ecouter(duree=5, samplerate=16000):
    print('🎙️  Parlez...')
    audio = sd.rec(int(duree * samplerate),
                   samplerate=samplerate, channels=1, dtype='float32')
    sd.wait()
    audio = np.squeeze(audio)
    segments, _ = model.transcribe(audio, language='fr', beam_size=5)
    texte = ' '.join(seg.text for seg in segments).strip()
    print(f'📝 {texte}')
    return texte
Détection de fin de parole
Enregistrer une durée fixe est simple mais peu naturel. Pour un vrai assistant, ajoutez une détection d'activité vocale (VAD) — la librairie silero-vad ou l'option vad_filter de faster-whisper — afin d'arrêter l'enregistrement dès que vous vous taisez.

#2. Raisonnement (Ollama)

Le texte transcrit part maintenant vers le LLM. Ollama expose une API HTTP sur http://localhost:11434 ; on l'interroge en Python. Le choix du modèle dépend de votre GPU : un 7B comme Llama 3.1 8B ou Qwen2.5 7B en Q4_K_M offre un excellent équilibre pour un assistant conversationnel.

Télécharger un modèle
ollama pull qwen2.5:7b

Le prompt système est ce qui transforme un LLM générique en assistant vocal utile. Pour la voix, une consigne cruciale : demander des réponses courtes. Un pavé de texte devient interminable une fois lu à voix haute.

raisonner.py
import requests

SYSTEM = (
    "Tu es un assistant vocal domestique en français. "
    "Réponds toujours de façon brève et naturelle, en une ou deux phrases, "
    "comme à l'oral. Pas de listes, pas de markdown, pas d'emojis."
)

def repondre(question, historique):
    historique.append({'role': 'user', 'content': question})
    r = requests.post('http://localhost:11434/api/chat', json={
        'model': 'qwen2.5:7b',
        'messages': [{'role': 'system', 'content': SYSTEM}] + historique,
        'stream': False,
        'options': {'temperature': 0.6, 'num_predict': 120},
    })
    reponse = r.json()['message']['content'].strip()
    historique.append({'role': 'assistant', 'content': reponse})
    return reponse
i
Garder le fil de la conversation
L'historique passé à chaque appel donne une mémoire à l'assistant : il se souvient de la question précédente. Limitez sa taille (par ex. les 10 derniers messages) pour ne pas gonfler le contexte et ralentir la génération.

#3. Synthèse vocale française (Piper)

Piper est un moteur de synthèse vocale neuronale rapide et local, conçu par la communauté Home Assistant (projet Rhasspy). Il produit une voix française bien plus naturelle que les vieux moteurs comme espeak, tout en restant assez léger pour tourner sur un Raspberry Pi.

Installer Piper
pip install piper-tts

Piper fonctionne avec des voix pré-entraînées, une par langue et par timbre. Pour le français, plusieurs voix sont disponibles (fr_FR) en différentes qualités. Chaque voix est un couple de fichiers : le modèle .onnx et sa configuration .onnx.json.

Télécharger une voix française
# Voix fr_FR « siwis » en qualité medium
python -m piper.download_voices fr_FR-siwis-medium

On l'utilise ensuite pour transformer une phrase en audio et la jouer directement.

parler.py
import wave
import sounddevice as sd
import numpy as np
from piper import PiperVoice

voix = PiperVoice.load('fr_FR-siwis-medium.onnx')

def parler(texte):
    samples = []
    for chunk in voix.synthesize(texte):
        samples.append(np.frombuffer(chunk.audio_int16_bytes, dtype=np.int16))
    audio = np.concatenate(samples)
    sd.play(audio, samplerate=voix.config.sample_rate)
    sd.wait()
Choisir la qualité de voix
Les voix Piper existent en x_low, low, medium et high. medium est le meilleur compromis pour un assistant : naturel convaincant sans surcharge CPU. high est plus lent et n'apporte de gain audible que sur de bonnes enceintes.

#4. Assembler la boucle complète

Les trois briques testées séparément, il ne reste qu'à les enchaîner dans une boucle : écouter, raisonner, parler, recommencer. Voici l'assistant minimal complet, en réunissant les fonctions précédentes.

assistant.py
# On suppose importées : ecouter(), repondre(), parler()
historique = []

print('Assistant vocal prêt. Ctrl+C pour quitter.')
parler("Bonjour, je vous écoute.")

try:
    while True:
        question = ecouter(duree=5)
        if not question:
            continue
        if 'au revoir' in question.lower():
            parler('À bientôt !')
            break
        reponse = repondre(question, historique)
        parler(reponse)
except KeyboardInterrupt:
    print('\nArrêt.')

C'est tout : une centaine de lignes réparties sur trois fichiers, et vous avez un assistant vocal qui écoute en français, réfléchit avec un LLM local et répond à voix haute, sans le moindre appel réseau sortant. À partir de là, on peut ajouter un wake-word (« Ok maison ») avec openWakeWord, une VAD pour l'écoute continue, ou brancher des outils.

#Latence réelle et optimisations

La question qui fait ou défait un assistant vocal : combien de temps entre la fin de votre phrase et le début de la réponse parlée ? Voici des ordres de grandeur observés sur une RTX 4070 avec Whisper small et un 7B Q4_K_M.

Transcription Whisper
≈ 0,3 à 0,8 s pour une phrase de 5 s avec le modèle small sur GPU. Sur CPU, comptez 2 à 4 s.
Génération LLM
Le poste le plus variable. Un 7B sur GPU produit la première réponse en ≈ 0,5 à 1,5 s selon la longueur. C'est ici que num_predict bas et un modèle rapide comptent le plus.
Synthèse Piper
≈ 0,2 à 0,5 s pour une ou deux phrases avec une voix medium. Très rapide, rarement le goulot.
Total ressenti
Autour de 1 à 3 s par tour sur GPU milieu de gamme. Sous la seconde relève du haut de gamme ou du streaming.
Le levier le plus efficace : le streaming
Au lieu d'attendre la réponse LLM complète avant de synthétiser, streamez la génération phrase par phrase et envoyez chaque phrase finie à Piper pendant que le LLM continue. La voix démarre bien plus tôt et la latence perçue chute nettement.
Garder les modèles chargés
Réglez OLLAMA_KEEP_ALIVE pour éviter qu'Ollama décharge le modèle entre deux questions — le rechargement coûte plusieurs secondes.
Réponses courtes
Un num_predict bas et un prompt système qui exige la concision réduisent directement le temps de génération et la durée de lecture.
Whisper adapté
Ne prenez pas large-v3 si small suffit à votre acoustique : vous économisez des centaines de millisecondes à chaque tour.

#5. Intégrer à Home Assistant

Si votre objectif est de piloter une maison connectée à la voix, il n'est pas nécessaire de tout recoder. Home Assistant intègre nativement le pipeline « Assist », et Whisper comme Piper y sont branchables via des add-ons officiels — ils ont d'ailleurs été développés dans cet écosystème.

  1. 01
    Installer les add-ons voix
    Depuis Paramètres → Modules complémentaires, ajoutez « Whisper » et « Piper ». Home Assistant les fait tourner localement comme services STT et TTS.
  2. 02
    Créer un pipeline Assist
    Dans Paramètres → Voix, créez un assistant : choisissez Whisper pour la reconnaissance, Piper (voix fr_FR) pour la synthèse.
  3. 03
    Brancher le LLM Ollama
    Home Assistant propose une intégration « Ollama » comme agent de conversation. Renseignez l'URL http://localhost:11434 et votre modèle pour remplacer l'analyse d'intention par défaut.
  4. 04
    Choisir un point d'entrée vocal
    Un satellite ESP32 (Voice PE), un ancien téléphone ou l'appli mobile servent de micro/haut-parleur dans les pièces.
i
Deux approches complémentaires
Le script Python de ce guide vous donne un contrôle total et sert de terrain d'apprentissage. Home Assistant offre une intégration domotique clé en main. Beaucoup commencent par le script pour comprendre la chaîne, puis basculent vers Assist pour la maison.

#Dépannage

Whisper transcrit dans la mauvaise langue
Forcez language='fr' dans transcribe(). Sans ça, une phrase courte peut être détectée comme de l'anglais.
Aucun son en sortie
Vérifiez le périphérique de sortie de sounddevice (sd.query_devices()) et que le samplerate passé à sd.play correspond bien à voix.config.sample_rate.
Le micro n'enregistre rien
Testez sd.query_devices() pour repérer le bon index d'entrée, et vérifiez les permissions micro (macOS) ou la source PipeWire/PulseAudio (Linux).
Réponses trop longues et illisibles
Renforcez la consigne de brièveté du prompt système et baissez num_predict. Un LLM verbeux ruine l'expérience vocale.
Latence qui monte au fil de la conversation
L'historique gonfle le contexte. Tronquez-le aux N derniers messages.
Ollama recharge le modèle à chaque question
Augmentez OLLAMA_KEEP_ALIVE (par ex. à 30m) pour garder le modèle en VRAM entre les tours.

#Pour aller plus loin

Votre assistant vocal repose sur un LLM local bien choisi et bien réglé. Ces guides du site complètent la mise en place :

Whisper + Ollama : transcription et résumé
Pour approfondir la partie audio et traiter des fichiers longs plutôt que du temps réel.
LLM local pour la domotique
Pour relier votre assistant à Home Assistant et piloter la maison à la voix, en préservant la vie privée.
Q4, Q5, Q8 : quelle quantification choisir
Pour arbitrer entre qualité de réponse, vitesse et VRAM selon votre GPU.
Ce guide vous a aidé ?

Un retour, une erreur, une précision ? Faites-nous signe, ça améliore le guide pour tout le monde.