Commande vocale hors ligne avec des modèles ONNX/TFLite
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 | |
|---|---|---|---|
| Vocabulaire | Fixe : 1 mot d’activation + 2–10 commandes | Ouvert | Ouvert |
| Empreinte | Modèles de l’ordre de ~100 Ko | Des centaines de Mo | Rien en local, l’audio quitte l’appareil |
| Matériel | MCU (ESP32-S3) jusqu’au navigateur | SBC Linux / smartphone | Tout appareil avec micro + réseau |
| Réseau | Inutile | Inutile | Obligatoire |
| Calcul & énergie | Millisecondes sur un MCU — assez bas pour l’écoute permanente, y compris sur batterie | Un ordre de grandeur de plus en CPU/RAM/énergie — écoute permanente irréaliste | Léger en local, mais la radio réseau ne dort jamais |
| Réponse | Immédiate, sur l’appareil | Plus lourde, selon l’appareil | Latence d’aller-retour |
| Coût courant | Aucun — le fichier modèle vous appartient | Calcul/énergie | À l’usage ou par abonnement |
| Confidentialité | L’audio ne quitte jamais l’appareil | Reste local | Audio envoyé |
Concrètement, voici les situations où l’on se tourne vers un modèle à mots-clés fixes :
- Maison connectée : « allume la lumière », « allume la clim » — un mot d’activation plus quelques commandes d’appareils
- Appareils partagés & pointage : « pointer », « début du service » — un pointage vocal là où le clavier est impossible
- Robots & caméras : « photo », « démarrer », « arrêter » — commander quand les mains sont occupées
- Présentations & bornes : « page suivante », « retour » — sans télécommande, sans toucher l’écran
- Jouets & objets : un mot d’activation sur mesure qui devient le nom du produit
- Radio push-to-talk : l’activation à la voix, sans chercher le bouton
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é
melspectrogram.onnxetembedding_model.onnxsont partagés entre tous les mots d’activation — inclus dans le dépôt.your_word.onnxest le classifieur propre à chaque mot. Changer de mot d’activation = échanger un petit fichier (plus une entrée dansmodel_info.json).- Les modèles multi-classes placent 2–10 mots-clés dans un seul fichier classifieur, avec N+1 sorties softmax.
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.
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.
- Modèles de démo (activation + commandes en allemand) : onnx-wakeword/models/de
- Firmware et exemples ESP32 : onnx-wakeword/esp32
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 :
- 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.
- 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).
É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 :
- 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.
- 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.
- 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.
- 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 :
- 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.
- 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 :
- Budget temps réel. Mesurez Mel +
Invoke()et maintenez-les sous le pas audio (160 ms dans cette démo). Si ça ne tient pas : réduisez le modèle ou ne traitez que la dernière fenêtre. - Faux déclenchements par heure. Enregistrez une heure de l’environnement réel — télé, conversations, musique —, donnez jamais cet enregistrement à l’entraînement, faites-le passer par le firmware et comptez les déclenchements. Ce seul chiffre vaut mieux que n’importe quel clip de démo.
- Déclenchements manqués au même seuil. Les chiffres de faux déclenchements et de rappel ne veulent dire quelque chose que ensemble ; notez les deux.
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.