« Thé, Earl Grey – chaud » – il y a 10 ans, la possibilité pour un ordinateur d’apporter une réponse appropriée à ce type de demande vocale tenait de la pure science-fiction... Mais c'était avant l'apparition d’Alexa, Google Home et Siri. Les assistants vocaux d’Amazon, Google ou Apple peuvent en effet écouter tout ce que nous disons et y répondre (mais pas toujours à bon escient). Si vous essayez d'écrire votre propre application associée à des fonctions de reconnaissance vocale, vous allez rapidement réaliser que les apparences d'un tel assistant sont assez trompeuses. En effet, tous ces systèmes cherchent systématiquement une corrélation entre les échantillons sonores capturés et une liste limitée de modèles de mots-clés. Une fois l'assistant activé, tout ce qui est collecté est directement envoyé aux serveurs du fournisseur respectif. La reconnaissance vocale n'est pas traitée localement, mais quelque part dans le nuage, chez le fournisseur. Vu ainsi, le nuage n'est rien de plus qu'un ensemble de ressources informatiques rassemblées quelque part dans un centre de données. En tant qu'utilisateurs ou développeurs d'applications, nous ne savons rien de ce que deviennent ces informations. Nous n'avons comme ressource que de faire confiance aux fournisseurs pour qu'ils les traitent dans le respect des réglementations applicables en matière de protection des données. C'est ainsi qu'un juge américain a récemment cité un assistant vocal Alexa d’Amazon comme « témoin » dans une affaire de meurtre.

Si vous craignez un effet « Big Brother », vous serez satisfait(e) de savoir qu'il existe des alternatives, comme Snips – logiciel de reconnaissance vocale fonctionnant intégralement hors connexion, qui veille à ce que vos données restent confinées dans les limites de votre réseau domestique. Il ne nécessite ni connexion Internet permanente, ni batteries d’ordinateurs pour assurer la reconnaissance vocale. Pour explorer ce produit plus en détail, nous allons nous intéresser au kit d'interaction vocale Snips qui utilise comme système de base le nano-ordinateur Raspberry Pi 3B+.

Pour cette application de reconnaissance vocale, nous avons besoin, outre le RPi, de quelques composants supplémentaires. Le moment est venu d'examiner ce que contient le produit.

 


Le kit est livré dans une boîte en carton bleu uni. À l'intérieur, vous trouvez tous les composants, avec le Raspberry Pi 3B+, un adaptateur secteur 5 V 3 A, un relais, un capteur de température et d'humidité, un haut-parleur, un HAT (carte d’extension) ReSpeaker 2-Mics pour RPi, une plaque de montage, une carte SD qui contient le système préinstallé et un guide de démarrage rapide.



Vous avez donc à portée de main tous les éléments nécessaires pour construire votre propre petit assistant vocal. Pour l'assemblage, utilisez les entretoises et les vis appropriées. Malheureusement, le manuel a omis un certain nombre de détails, et il nous arrivera de nous demander à quoi servent certaines vis. Après quelques tâtonnements, nous avons quand même réussi à nous en sortir, même si la carte RPi n'est pas idéalement positionnée pour accéder facilement à la trappe d'accès à la carte SD.

Plaque de montage perforée en acrylique

Le kit contient une plaque de montage en acrylique sur laquelle vous pouvez fixer les différents modules à l'aide de vis autotaraudeuses. La matrice des trous de fixation autorise un certain degré de liberté pour l'implantation des modules.

Capteurs et actionneurs

Le capteur de température et d'humidité est un modèle Sensirion SHT31, monté sur un module Grove. La précision de mesure est de ±0.3 °C pour la température et de ±2 % pour l'humidité.

Le relais est également monté sur un module Grove de Seeed Studio. Ses contacts permettent de commuter des tensions de 250 VCA / 30 VCC, sous 5 A, et offrent la possibilité d'exécuter 100.000 cycles. Même si le relais peut commuter une tension secteur, la carte n'a pas été conçue pour fonctionner dans ce contexte et ne prévoit aucune isolation. Il serait en effet très facile de toucher accidentellement des conducteurs sous tension. Si la tension appliquée à la charge est inférieure au niveau de sécurité en très basse tension (<25 VCA / <30 VCC) et en tenant compte des spécifications du relais, vous pouvez utiliser ce module en toute sécurité pour vos expérimentations.

Un petit haut-parleur est inclus dans le kit, et vous pouvez donc entendre ce que l'assistant vocal vous dit. Comme sa taille le laisse supposer, la qualité du son du haut-parleur n'est pas excellente, mais néanmoins adaptée à sa finalité.

HAT ReSpeaker 2-Mics pour RPi

Le cœur du système — hors RPi — est la carte d'extension HAT ReSpeaker 2-Mics pour RPi, construite autour d'un codec audio WM8960. Malheureusement, il n'est pas pris en charge directement par Raspbian, et le pilote comporte également quelques bogues. Si vous utilisez le shield avec une image Raspbian nue, il sera nécessaire de compiler le pilote pour le RPi. Vous trouverez ici les instructions nécessaires pour configurer manuellement le pilote. Le codec WM8960 comporte un amplificateur de classe D, capable de fournir 1 W sous 8 Ω par canal, et permet de raccorder des microphones. La carte possède donc deux micros ; les connexions nécessaires pour un haut-parleur ou un casque sont également disponibles.

La carte comporte également trois LED RVB (APA102), connectées au Raspberry Pi par l'interface SPI (Serial Peripheral Interface). Ces témoins indiquent le moment où l'assistant vocal commence à écouter (ou n'a pas compris). Un bouton-poussoir permet également une interaction avec le système. Vous disposez également de connexions pour le relais, et le capteur de température et d'humidité.

Un port micro-USB situé sur le côté permet de raccorder facilement l'alimentation du RPi. Malheureusement, la connexion de la barrette n'est pas traversante, ce qui empêche l’ajout d'un autre HAT. Il est donc impossible d'utiliser un afficheur SPI-TFT comme interface utilisateur.

Veillez à bien connecter le câble sur le port approprié pour raccorder le relais, et le capteur d'humidité et de température. Une fois tous les éléments assemblés et la carte SD insérée, nous pouvons commencer. Un moniteur HDMI et un clavier USB seront ici très utiles pour pouvoir observer le premier démarrage du RPi.

Après lancement, le système est prêt pour un premier essai. Prononcez ceci : « Hey Snips - What’s the temperature? » (ou son équivalent français*). Le système devrait vous répondre en vous indiquant la température. Ensuite, dites : « Hey Snips – Turn the relay on. » pour activer le relais. En principe, ces commandes devraient fonctionner directement sans avoir à modifier la configuration. Nous allons maintenant aborder la partie la plus intéressante en découvrant comment réaliser nos propres applications et commandes à reconnaissance vocale.

Configuration

Le Raspberry Pi doit maintenant pouvoir accéder à votre réseau, et le moyen le plus simple est d'utiliser un câble. Si vous souhaitez le faire en Wi-Fi, vous devez retirer la carte SD du RPi et créer le fichier wpa_supplicant.conf sur le lecteur nommé boot. Le fichier contient les paramètres suivants :
 
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=<your_country_id>
network={
ssid="<your_ssid>"
psk="<your_password>"
}
 
Les paramètres country (pays), SSID et password (mot de passe) correspondent aux informations d'identification de votre boîtier Wi-Fi.
Avec l’hôte snips-base.local, vous pouvez vous connecter au Raspberry Pi via SSH et explorer le système. Le logiciel Snips est déjà préinstallé sur le système.

Une fois effectuée l'installation de base du RPI, qui est relativement simple, nous installons Sam, interface de ligne de commande pour contrôler et gérer le logiciel Snips sur le Raspberry Pi. Pour installer Sam, nous devons ouvrir un terminal et entrer la commande sudo npm install -g snips-sam. Il est maintenant possible de se relier au logiciel Snips sur le Raspberry Pi avec la commande sam connect snips-base.local. La commande sam status permet d'obtenir l'état et le numéro de version de chaque composant. Le résultat devrait ressembler à peu de chose près au Listage 1.
 
Connected to device snips-base.local
OS version ................... Raspbian GNU/Linux 9 (stretch)
Installed assistant .......... MakerKitBundle_EN
Language ..................... en
Hotword ...................... hey_snips
ASR engine ................... snips
Status ....................... Live

Service status:

snips-analytics .............. 0.60.8 (running)
snips-asr .................... 0.60.8 (running)
snips-audio-server ........... 0.60.8 (running)
snips-dialogue ............... 0.60.8 (running)
snips-hotword ................ 0.60.8 (running)
snips-nlu .................... 0.60.8 (running)
snips-skill-server ........... 0.60.8 (running)
snips-tts .................... 0.60.8 (running)

Le logiciel étant encore en cours d’évolution, il est possible qu'une version ou une autre ne fonctionne pas toujours correctement. Pour obtenir la version la plus récente, il suffit d'entrer la commande sam update. Le RPi télécharge et installe ensuite la toute dernière version. Enfin, il est nécessaire de saisir la commande sam update-assistant. Cela permettra également de mettre à jour les applications, et tous les composants de Snips devraient alors être de nouveau en ligne. Si nous entrons encore la commande sam status, tous les composants (hormis snips-analytics) fonctionnent et le RPi devrait répondre aux exemples de commandes du tutoriel.

Construire sa propre application

Après avoir créé un compte, vous pouvez utiliser l'interface web pour créer votre propre application, et mieux encore, soumettre votre assistant à un apprentissage avec vos propres commandes vocales. À titre de petite démonstration, nous demanderons à l'assistant vocal de nous donner l'heure.
Nous commençons par créer un nouvel assistant, que nous appellerons WhatTimeItIs. Puisque vous disposez d'un assistant, vous pouvez maintenant créer des applications. Nous allons créer une application appelée « currentTime », qui donne l'heure à la demande.
Pour que l'application comprenne une commande vocale, nous devons la soumettre un apprentissage pour définir une intention (ou intent en abrégé).


Il existe un certain nombre de modules intégrés pour nous faciliter la vie si nous avons à traiter des nombres ou dates. Puisque nos questions à base de mots-clés n'existent pas sous la forme d'un module finalisé, nous devons les créer. Nous souhaitons que le système écoute (et entende) le mot « Time », ainsi qu’un certain nombre de synonymes.

Maintenant que l'apprentissage est terminé, nous pouvons nous occuper de l'action que notre commande vocale doit déclencher. Nous allons donc sur la zone Actions et choisissons Code snippets pour les besoins de notre démonstration. Il est possible actuellement d'écrire du code en Python3 et Python2 via l'interface web, et de l'exécuter sous la forme d'une « action »



Pour en savoir plus, consultez la documentation snips.

Pour obtenir l'heure, nous utilisons le code Python3 du Listage 2.
import time
now = time.localtime()
if len(intentMessage.slots.DateTime_Req) > 0:
    date_or_time = intentMessage.slots.DateTime_Req.first().value # We extract the value from the slot
    result_sentence = "Current time is : {} {} ".format(str(now.tm_hour), str(now.tm_min))◦ # The response that will be said out loud by the TTS engine.
else:
    result_sentence = "Time is running out"
current_session_id = intentMessage.session_id
hermes.publish_end_session(current_session_id, result_sentence)

Ce code sera exécuté chaque fois que le mot « Time » ou l'un de ses synonymes sera détecté. En réponse, nous créons une chaîne, qui est ensuite adressée au module logiciel de conversion texte-voix, chargé de donner l’heure vocalement.
Nous avons donc créé notre première application et nous pouvons maintenant la tester. Pour ce faire, il nous faut la transférer sur le Raspberry Pi. Sur le RPi, il suffit de saisir la commande sam install assistant pour installer l’assistant que nous avons créé. Et il ne reste plus qu'à demander l’heure : « Hey Snips, what's the time? »...*

En résumé

Ce kit contient tout ce dont vous avez besoin pour découvrir la commande vocale (haut-parleurs, microphones, capteurs et relais). Malheureusement, les signaux produits par les deux microphones intégrés sont de mauvaise qualité et entachés de bruit. La reconnaissance vocale n'en est pas affectée, mais si vous souhaitez enregistrer un nouveau mot-clé pour activer l'assistant vocal à l'aide de la procédure indiquée, vous aurez malheureusement besoin d'un microphone de meilleure qualité. Soyez très attentif(ve) pour l'assemblage du matériel. Une ou deux pages supplémentaires dans le manuel avec des illustrations représentant la mise en place des entretoises auraient été très utiles.
Actuellement, le codec wm8960 n'est pas pris en charge par le noyau Pi, ce qui impose un assemblage manuel pour faire fonctionner la carte son dans la version officielle de Raspbian. Si vous souhaitez créer votre propre image à partir de Raspbian, vous devrez compiler le pilote et incorporer le correctif vous-même. Si vous installez une nouvelle version de Snips, vous devrez mettre de nouveau à jour l'assistant ou le réinstaller.
Une fois familiarisé(e) avec l'interface web Snips.ai, c'est un plaisir de travailler avec le système et d'explorer toutes ses possibilités. Ce que je trouve surtout rassurant à la fin d'une journée, c'est que je suis réellement le seul à avoir accès à toutes mes données...

* L'assistant par défaut est en anglais, mais le produit peut fonctionner en français. Voir ici : https://github.com/snipsco/snips-demo-dev-kit#with-assistant-recommend.