Rhasspy en mode satellite

Rhasspy-satellite

Alors, comme on en a pris l’habitude, on fait les tests de bon fonctionnement. Normalement on a mis à jour raspbian, installé les drivers comme les respeakers, tester un enregistrement et une lecture via arecord et aplay. Si tout ça est ok, c’est bon, on peut passer à la suite.

Les prérequis

On installe les packages nécessaires

sudo apt-get install supervisor mosquitto sox alsa-utils espeak flite curl patchelf ca-certificates python3 python3-dev python3-setuptools python3-pip python3-venv build-essential libatlas-base-dev swig portaudio19-dev

Petite méthode alternative (surtout pour les pi zeros) pour l’installation d’un picoTTS qui marche bien

wget http://archive.raspberrypi.org/debian/pool/main/s/svox/libttspico-utils_1.0+git20130326-3+rpi1_armhf.deb
wget http://archive.raspberrypi.org/debian/pool/main/s/svox/libttspico0_1.0+git20130326-3+rpi1_armhf.deb
sudo apt-get install -f ./libttspico0_1.0+git20130326-3+rpi1_armhf.deb
sudo apt-get install -f ./libttspico-utils_1.0+git20130326-3+rpi1_armhf.deb

L’installation

Et on lance la récupération des sources

git clone --recursive https://github.com/rhasspy/rhasspy-satellite.git
cd rhasspy-satellite

Et on lance l’installation

make

Alors de façon générale, mais surtout si tu es sur un pi zero, va boire un café, va faire un tour parce que ça va durer.

voilà ce que tu devrais obtenir si tu ne rencontres pas d’erreur

OK
scripts/build-docs.sh
Using virtual environment at /home/pi/rhasspy-satellite/.venv
INFO    -  Cleaning site directory
INFO    -  Building documentation to directory: /home/pi/rhasspy-satellite/rhasspy-server-hermes/web/docs
OK

Voilà la première bidouille. Si jamais ton make échoue sur le module rapidfuzzy. Ce qui est mon cas à l’instant t avec la version proposée.

Ouvre le fichier requirements.txt

nano requirements.txt

et tu remplaces

rapidfuzz==0.7.6

par

rapidfuzz==0.7.8

Et tu relances le make d’installation.

Cette fois-ci, la commande doit se terminer par

OK
scripts/build-docs.sh
Using virtual environment at /home/pi/rhasspy-satellite/.venv
INFO    -  Cleaning site directory
INFO    -  Building documentation to directory: /home/pi/rhasspy-satellite/rhasspy-server-hermes/web/docs
OK

Le démarrage de rhasspy-satellite

Il n y a plus qu’à le lancer et regarder les logs au cas où

bin/rhasspy-satellite --profile fr

Et notre rhasspy démarre. Si on va dans la partie configuration, tout est désactivé.

La configuration de rhasspy-satellite

Toujours dans le but de se connecter à un réseau snips, on va donc activer que ce qui nous intéresse. Voilà ce qu’on aura au bout

Le siteId

Vu que c’est un satellite, n’oublie pas de le remplir. Moi, ce sera le snips dans mon bureau.

MQTT

On se connecte au serveur MQTT de snips. Moi, dans mon cas mon snips maître s’appelle snips-master

Audio recording

On configure pyaudio. Au passage, on n’oublie pas d’entrer les valeurs pour le host et le port UDP Audio. Cela permet de faire passer le son capturé en continue au module de wake word en passant par une connexion UDP. Et il vaut mieux que ça passe par udp sur localhost que sur le réseau MQTT . Parce que si chaque satellite envoie en MQTT le son capturé en continu, ça me gêne à plusieurs niveaux.

Wake word

On configure notre snowboy. Si on ne sait pas, ou si une couche de rappel est nécessaire, c’est dans cet article que ça se passe. C’est aussi là qu’on peut apprendre à créer son propre « Hey, snips » personnalisé par personne. Ce qui peut être utile dans certains scénarios de migration.

Là encore, on n’oublie pas de configurer l’UDP audio afin d’éviter que le flux audio capté en continu soit diffusé sur MQTT.

Speech To Text et Intent Recognition

Ce sont les modules chargés de reconnaitre le texte de la voix et d’en sortir les intents. Ce sont 2 tâches très lourdes et qui sont donc réservées à notre serveur maitre. On les bascule donc en « Hermes MQTT » pour que ce soit l’assistant maitre qui fasse cette partie du travail

Text to Speech

Là, c’est la seconde bidouille. Dans mon cas, mon réseau MQTT snips, le pico2wave fonctionne avec langue de défini à fr. Or la commande pico2wave de rhasspy ne reconnait que fr-FR . Du coup, j’ai repris le script qui était utilisé par rhasspy et je l’ai cloné pour forcer la langue à fr-FR.

sudo nano /usr/bin/mypicotts.sh

et on y colle ceci

#!/usr/bin/env bash

temp_wav="$(mktemp --suffix=.wav)"
function finish {
    rm -rf "${temp_wav}"
}

trap finish EXIT

pico2wave -w "${temp_wav}" -l "fr-FR" "$@"
cat "${temp_wav}"

On le rend exécutable évidemment

sudo chmod +x /usr/bin/mypicotts.sh

Il nous reste plus qu’à définir notre script comme nouvelle commande de TTS

On bascule en « Local Command » et on entre le chemin vers notre script.

Audio playing

Rien de particulier par rapport à un rhasspy standard.

Test de bon fonctionnement

Après avoir cliqué sur le bouton bleu, il ne te reste plus qu’à essayer ton nouveau satellite,normalement, il est opérationnel 🙂

Voici ce que tu dois trouver dans les logs si ton hot word est entendu

[DEBUG:2020-04-24 01:13:39,540] rhasspywake_snowboy_hermes: Wake word detected: jarvis (site_id=bureau)
[DEBUG:2020-04-24 01:13:39,548] rhasspywake_snowboy_hermes: -> HotwordDetected(model_id='jarvis', model_version='', model_type='personal', current_sensitivity=0.5, site_id='bureau', session_id=None, send_audio_captured=None)
[DEBUG:2020-04-24 01:13:39,549] rhasspywake_snowboy_hermes: Publishing 159 bytes(s) to hermes/hotword/jarvis/detected

Toujours dans les logs, le résultat du Speech To Text fait par notre maitre snips

[DEBUG:2020-04-24 07:45:11,324] rhasspyserver_hermes: <- NluIntent(input='éteins la lumière', intent=Intent(intent_name='cedcox:eteindreLumiere', confidence_score=1.0), site_id='bureau', id=None, slots=[Slot(entity='custom_lights_device', value={'kind': 'Custom', 'value': 'Lumière'}, slot_name='lights_device', [blablabla ]

et le Text To Speech

[DEBUG:2020-04-24 07:45:11,286] rhasspytts_cli_hermes: <- TtsSay(text='je le fais de suite', site_id='bureau', lang='fr', id='ab1458ad-ae2a-46fa-b404-b8d42bf5cca2', session_id='07c8eae5-d1f5-48de-90e0-35b92ad5cd8b')

Si tu veux aller un peu plus loin

Je te propose le petit script ci-dessous qui est un script python. Il se connecte sur le réseau MQTT et t’affiche ce qui s’y passe.


#!/usr/bin/env python3

import paho.mqtt.client as mqtt
import json

def on_connect(client, userdata, flags, rc):
    print('Connected')
    mqtt.subscribe("hermes/tts/#")
    mqtt.subscribe("hermes/dialogueManager/#")
    mqtt.subscribe("hermes/asr/#")
    mqtt.subscribe("hermes/intent/#")
    mqtt.subscribe("hermes/nlu/#")

def on_message(client, userdata, msg):
    print("Msg rcv on topic {0}: {1}".format(msg.topic, msg.payload))

mqtt = mqtt.Client()
mqtt.on_connect = on_connect
mqtt.on_message = on_message
mqtt.connect('snips-master', 1883)
mqtt.loop_forever()

N’oublie pas de changer snips-master qui est le nom de mon snips maitre.

Le but du jeu est de prononcé la même sur un satellite snips et sur un satellite rhasspy et de voir s’il y a des différences.

2 Comments

  1. Bonjour,

    Je m’intéresse à faire un assistant, rhasspy sur un orange pi 2 déjà en place dans mon réseau et un satellite dans le salon avec un pi zero.
    Mon idée est bonne? Si j’ai mon serveur rhasspy sur mon orange pi et un pi zero avec la carte ReSpeaker 2-Mics Pi HAT, cela devrait fonctionner?
    Si l’on peut continuer par mail, merci

    • Hello Garfi,

      Oui ça fonctionnera mais attention, il faudra bien configuré le pi 0 pour qu’il ne soit que « relais » et que tout soit fait au niveau de ton serveur rhasspy 🙂

      Ced

Poster un Commentaire

Votre adresse de messagerie ne sera pas publiée.


*


Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.