Commande vocale hors ligne avec des modèles ONNX/TFLite

Octobre 2026 · ONNX · TFLite Micro · ESP32-S3 · Mot d’activation + commandes

Un ensemble de petits modèles à mots-clés fixes — ONNX standard pour téléphones, navigateurs et ordinateurs, INT8 TFLite pour les microcontrôleurs — qui écoute un mot d’activation et une poignée de commandes vocales, entièrement hors ligne. Cet article montre quand ce type de modèle est le bon outil, comment les mêmes fichiers tournent sur chaque plateforme, puis déroule une démo ESP32-S3 complète que vous pouvez reproduire avec vos propres mots.

Quand a-t-on besoin d’un tel modèle ?

Un modèle de reconnaissance de mots-clés (KWS) est le bon outil quand le vocabulaire est fixe et réduit — un mot d’activation plus quelques dizaines de commandes au plus — et que le produit doit écouter en permanence sans envoyer d’audio nulle part. Si l’utilisateur peut dire n’importe quoi, il faut un modèle ASR complet ; mais l’ASR exige un ordre de grandeur plus de calcul et d’énergie — hors de portée d’un microcontrôleur ESP32 ou d’un produit sur batterie, et l’écoute permanente devient tout simplement irréaliste.

KWS à mots-clés fixes
(ONNX/TFLite)
ASR embarquéAssistant vocal cloud
VocabulaireFixe : 1 mot d’activation + 2–10 commandesOuvertOuvert
EmpreinteModèles de l’ordre de ~100 KoDes centaines de MoRien en local, l’audio quitte l’appareil
MatérielMCU (ESP32-S3) jusqu’au navigateurSBC Linux / smartphoneTout appareil avec micro + réseau
RéseauInutileInutileObligatoire
Calcul & énergieMillisecondes sur un MCU — assez bas pour l’écoute permanente, y compris sur batterieUn ordre de grandeur de plus en CPU/RAM/énergie — écoute permanente irréalisteLéger en local, mais la radio réseau ne dort jamais
RéponseImmédiate, sur l’appareilPlus lourde, selon l’appareilLatence d’aller-retour
Coût courantAucun — le fichier modèle vous appartientCalcul/énergieÀ l’usage ou par abonnement
ConfidentialitéL’audio ne quitte jamais l’appareilReste localAudio envoyé

Concrètement, voici les situations où l’on se tourne vers un modèle à mots-clés fixes :

Tous ont un vocabulaire fixe et acceptent volontiers le compromis du KWS : renoncer à la conversation ouverte pour un modèle minuscule, instantané, privé et gratuit à l’usage. Besoin d’un modèle KWS pour un jeu de mots fixe comme ceux-là ? Entraînez-le sur voicute.com — en français, anglais, allemand, japonais ou chinois ; les étapes ci-dessous déroulent tout le chemin.

Un format de modèle, toutes les plateformes

La pipeline open-source Voir le moteur d'inférence open source et les modèles de démonstration → produit, depuis le même entraînement, deux formats : ONNX pour tout ce qui a un ONNX Runtime, et INT8 TFLite pour les appareils TFLite Micro comme l’ESP32-S3. La pipeline d’inférence tient en trois fichiers :

Audio (16 kHz) → melspectrogram.onnx → embedding_model.onnx → your_word.onnx → probabilité

Des runtimes open-source du même dépôt chargent ces fichiers sur Android (android/), Web (web/, ONNX dans le navigateur), Python sous Windows/Linux/macOS (linux/) et ESP32-S3/P4 (esp32/, TFLite). Un sidecar Wyoming relie les mêmes modèles à Home Assistant. Pas d’AccessKey, pas d’inférence cloud, pas de frais par appareil — le fichier modèle téléchargé vous appartient.

Exemple complet : mot d’activation + commandes vocales sur ESP32-S3

Pour montrer toute la chaîne de bout en bout, le même jeu de modèles tourne ici sur le plus petit bout de la liste. La démo combine exactement les deux types de modèles de la pipeline : un modèle d’activation à mot unique pour « Hallo Lumo » et un modèle multi mots-clés pour les quatre commandes suivantes. La carte est un ESP32-S3 HMI DevKit (double cœur 240 MHz, 8 Mo de PSRAM, codec micro ES7210) sous ESP-IDF 6.0.1. Dites « Hallo Lumo » — un mot d’activation allemand personnalisé — et la LED confirme le déclenchement. Dans la fenêtre de 6 secondes, dites « Licht rot / blau / grün / weiß » et la lumière change de couleur, puis l’appareil retourne en veille d’écoute.

Mesuré sur cette démo (fenêtre de 1,5 s, INT8 via ESP-NN) : Mel ≈ 47 ms + Invoke() ≈ 76 ms ≈ 121 ms par trame contre un pas de 160 ms — en temps réel. Plus de 20 déclenchements en salles calme et bruyante, les quatre commandes reconnues, aucune confusion. Les faux déclenchements du modèle d’activation sont passés de ~319/h à ~2,6/h grâce au minage de négatifs difficiles, mesuré sur 24 h d’audio tenu à l’écart. La latence varie selon le modèle — mesurez toujours le vôtre.

Pourquoi entraîner ses propres modèles ? Le MultiNet intégré d’Espressif ne gère les commandes qu’en chinois et en anglais. Ici, les deux modèles sont entraînés par notre pipeline sur des caractéristiques mel — le même flux fonctionne dans n’importe quelle langue ; l’allemand est simplement ce que parle cette démo.

Vous voulez vos propres modèles de mots-clés — un seul mot d’activation ou un ensemble de commandes multi mots-clés, en cinq langues ? C’est ce que voicute.com entraîne ; le reste de l’article vous y conduit pas à pas.

Comment ça marche : deux petits modèles, répartis dans le temps

Un même appareil exécute deux modèles INT8 TFLite compacts sur le même cœur, ordonnancés pour ne jamais se gêner :

  1. Modèle d’activation, toujours actif. L’AFE ESP-SR gère le front-end audio (AEC, réduction de bruit, VAD) ; le modèle d’activation consomme la dernière fenêtre mel. Au déclenchement, l’appareil change de mode.
  2. Modèle de commandes, seulement après un déclenchement. Pendant les 6 secondes suivantes, un second classifieur multi mots-clés associe la parole à l’une des commandes configurées (ici : quatre couleurs). Après la fenêtre — ou après une commande — l’appareil revient en écoute du seul mot d’activation.

Ce verrouillage explique la rareté des fausses commandes : le modèle de commandes n’écoute jamais seul. Le mot d’activation porte la charge des faux déclenchements — et c’est précisément ce que la pipeline peut optimiser (étape 4).

Une leçon du terrain : le premier modèle d’activation demandait ~250 ms par inférence — plus lent que le pas audio — et ratait donc silencieusement des pans de la phrase. La solution : toujours traiter la dernière fenêtre et réduire le modèle jusqu’à ce que l’inférence tienne dans le pas. Assurez « inférence < pas » avant tout le reste.

Étape 1 · Exécuter soi-même le modèle de démo (gratuit)

Les deux modèles de démo sont sur GitHub, sans inscription. La vérification la plus rapide ne demande aucun matériel — le runtime Python charge les mêmes fichiers sur un ordinateur :

git clone https://github.com/voicute/onnx-wakeword.git
cd onnx-wakeword
pip install onnxruntime numpy sounddevice
python linux/infer.py --model-dir ./models/de/

Le chemin embarqué complet est l’exemple ESP-IDF testé :

cd onnx-wakeword/esp32/examples/esp32s3_hmi_devkit
idf.py set-target esp32s3
python patch_led_strip.py
idf.py build
idf.py -p COM6 flash monitor

Le runtime Web fait tourner les mêmes modèles de démo entièrement dans le navigateur — pratique pour juger la sonorité d’un mot avant toute matériel.

Étape 2 · Entraîner votre propre mot d’activation (gratuit)

Sur voicute.com, saisissez votre phrase et choisissez la langue — français, anglais, allemand, japonais ou chinois. L’entraînement produit un modèle de première ronde (R0) : un classifieur ONNX standard pour ordinateur/mobile/navigateur plus l’INT8 TFLite correspondant pour l’ESP32-S3. Rien n’est facturé à cette étape.

Étape 3 · Tester avec votre vraie voix (gratuit)

Dans la console, éprouvez le modèle Basic face à votre micro, à votre distance réelle et à votre bruit ambiant. C’est l’étape qui décide de tout le reste — testez donc avant de penser au paiement : dites la phrase comme vous la dites vraiment, à la distance où vous l’utiliserez vraiment. Si le rappel semble faible, ajoutez quelques enregistrements réels de la phrase et réentraînez — les enregistrements sont une entrée d’entraînement optionnelle, toujours gratuite.

Étape 4 · De quel cas êtes-vous ?

Après le test, vous êtes dans l’une de ces quatre situations :

  1. La phrase est parfois manquée → ajoutez 5 enregistrements réels et réentraînez (gratuit). La plupart des problèmes de rappel sont des problèmes de couverture, réglés à cette étape.
  2. Le déclenchement est fiable, mais la télé ou les conversations déclenchent à tort → lancez l’optimisation des faux déclenchements (payante par passe) — son fonctionnement fait l’objet de la section suivante.
  3. Vous voulez de la commande vocale, pas seulement un mot d’activation → entraînez un modèle multi mots-clés avec 2–10 commandes fixes dans un seul fichier — ou supprimez le mot d’activation et utilisez un mot-commande comme déclencheur. La démo ci-dessus est exactement cette architecture.
  4. Cela fonctionne → téléchargez le modèle (payant, une fois) et déployez-le sur l’un des runtimes ci-dessus.

Maîtriser les faux déclenchements : R0 vs R1 et le minage de négatifs difficiles

Chaque modèle commence en R0 — la première ronde, entraînée sur des données de parole préparées plus un ensemble fixe de perturbations (bruit, réverbération, volume). Le monde réel en contient bien davantage : télévision, musique, conversations, publicités. Et ces perturbations dépendent du mot : le même clip publicitaire peut déclencher « Hallo Lumo » tout en laissant totalement de glace le modèle d’un autre mot. Un R0 tout neuf avec beaucoup de faux déclenchements est donc le lot de tous les modèles de mots-clés — ce n’est pas le signe d’un mauvais entraînement.

R1 y remédie, en deux étapes qui correspondent aux deux boutons de la console :

  1. Scan de négatifs. Votre modèle R0 écoute ~100 heures d’audio négatif dans la langue cible et signale les extraits auxquels il réagit — ce sont, par définition, les négatifs difficiles de ce modèle (jusqu’à 10 000 conservés). Quelques minutes.
  2. Réentraînement complet. Ces extraits rejoignent le jeu d’entraînement d’origine comme exemples négatifs, et le modèle est réentraîné de zéro. Typiquement 40 à 80 minutes.

Comme les négatifs sont choisis contre les faiblesses réelles de R0, une passe fait tomber les faux déclenchements de centaines par heure à un chiffre en moyenne (environ −95 %). Sur le mot d’activation de cette démo : mesuré 319/h → 2,6/h sur 24 heures d’audio tenu à l’écart. Les modèles à mot unique comme les multi mots-clés prennent en charge ce cycle : le modèle de commandes à quatre couleurs de la démo peut passer par la même boucle scan-réentraînement. Une pipeline R2 existe pour des sources de perturbation totalement nouvelles, mais pour la plupart des mots, une passe R1 suffit au quotidien. L’optimisation est payante par passe ; tarifs en vigueur sur voicute.com.

Étape 5 · Valider sur votre matériel

Le test en console prouve le modèle ; l’appareil prouve le produit. Trois vérifications avant la mise en service :

FAQ

Quand un modèle à mots-clés fixes est-il le mauvais choix ?
Quand le vocabulaire n’est pas fixe. Dictée, questions libres, tout ce qui est ouvert exige un ASR complet — un modèle KWS ne reconnaît, par conception, que les mots entraînés.
Fonctionne-t-il entièrement hors ligne ?
Oui. Mot d’activation et commandes tournent tous deux localement. Aucune inférence cloud, aucune clé de compte à l’exécution.
Quelles plateformes et quelles langues ?
Android, Web, Python (Windows/Linux/macOS), ESP32-S3/P4, plus Wyoming pour Home Assistant ; modèles en français, anglais, allemand, japonais et chinois.
Qu’est-ce qui est gratuit, qu’est-ce qui est payant ?
Entraînement et test en console gratuits. Le téléchargement des fichiers modèles et l’optimisation des faux déclenchements sont payants — tarifs sur voicute.com.
Une parole sans rapport peut-elle déclencher une commande ?
Uniquement dans la fenêtre de 6 secondes après le déclenchement, et le verrou en bloque déjà l’essentiel. La parole dans la fenêtre peut encore être mal classée ; le minage de négatifs difficiles pour les mots-clés est prévu dans la pipeline.
Transparence : les runtimes open-source et les modèles de démo cités ci-dessus sont développés par Voicute ; la plateforme d’entraînement en ligne utilisée aux étapes 2–4 est également un produit Voicute.
Entraînez et testez votre mot d’activation — gratuitement
Voir le moteur d'inférence open source et les modèles de démonstration →
ONNX / TFLite · Android · ESP32 · Web · Python · Home Assistant