How TO - VoiceAssistant with Snips and reSpeaker over MQTT für Dummies [GERMAN]

Hallo Liebe HA Community,
ich bemühe mich bereits seit 2 Wochen ein vernünftiges Voice-Assistant System zu konfigurieren. Nun habe ich ein gutes Basis-Setup auf dem sich aufbauen lässt.
Hatte noch keine Zeit das Thema auf Englisch zu übersetzen, evtl. kann sich hier jemand dafür engagieren.

Setup:
1x HassIO auf RasPi 4
1x Raspi 3b+ with reSpeaker 4HAT (Debian9 Stretch!!!) REALLY IMPORTANT

Anleitung reSpeaker

UNBEDINGT Debian9 (Stretch) verwenden
sudo apt install git -Y
sudo apt-get update
git clone https://github.com/respeaker/seeed-voicecard.git
cd seeed-voicecard
sudo ./install.sh → sollte auf /boot nicht genug frei sein kann das skript unter "if [ “$free_space” -lt “20” ] auf 20MB runtergeschraubt werden und es funktioniert trotzdem
reboot

sudo raspi-config

Select 7 Advanced Options
Select A4 Audio
Select 1 Force 3.5mm (‘headphone’) jack
Select Finish

dann mittels arecord -L prüfen ob reSpeaker erkannt wurde,
sonst debuggen mittels Suchmaschine deiner Wahl
Audio-Output kann mittels

amixer cset numid=3 2 (hdmi)
amixer cset numid=3 1 (aux)

umgestellt werden

Anleitung Snips auf remote Pi (Satellite Pi)

sudo bash -c ‘echo “deb https://raspbian.snips.ai/$(lsb_release -cs) stable main” > /etc/apt/sources.list.d/snips.list’
sudo apt-key adv --fetch-keys https://raspbian.snips.ai/531DD1A7B702B14D.pub

sudo apt install snips-hotword-model-heysnipsv4
sudo apt install snips-hotword (nicht sicher ob benötigt evtl in snips-satellite enthalten)
sudo apt install snips-autio-server (nicht sicher ob benötigt evtl in snips-satellite enthalten)

sudo nano /etc/snips.toml

dort dann die mqtt konfiguration vornehmen (mqtt server von home assistant)

[snips-audio-server]
bind = “siteID@mqtt” → analog zu den anderen komponenten in der snips.toml
dann als service

sudo systemctl start snips-audio-server
sudo systemctl start snips-hotword

snips kann gut debugged werden mittels

sudo apt install snips-watch

und dann

snips-watch -vvv

Anleitung HomeAssistant, Rhasspy und Events

Rhasspy als AddOn installieren
dann das WebUi öffnen, das läuft unter Port 12101

Reiter → Settings

  1. Unter Mqtt entsprechende Konfig hinterlegen (IP-Adresse von HA NICHT localhost!)

  2. Als Intent-Handler nehmen wir HomeAssistant, da wir dort Aktionen setzten wollen.
    Ich nutze dazu events, da Intents bei mir nicht funktionierten. URL auf default belassen!!

  3. Als Wake-Word nutze ich “Wake up on MQTT” da snips-hotword in das Topic herms/hotword/default/detected schreibt wenn “Hey Snips” gesagt wird
    Um zu vermeiden, dass nach dem Wake-Word bis ins Timeout (30 Sec) aufgezeichnet wird sollte man

  4. webrtcvad als VoiceDetection verwenden!!
    Somit wird vermieden, dass die .wav Datei dann 30s lang ist → STT benötigt dann sehr lange um alles zu analysieren.

  5. Als Speech-Recognition benutze ich pocketsphinx. Mit allen anderen Optionen hatte ich nur Probleme.

  6. Intent Recognition nehme ich Mycroft Adapt. Das funktionierte bei mir am schnellsten.

  7. Text-To-Speech nutze ich pico-tts, da es das “natürlichste” standard Voice-Model hat die man gut versteht. Dort als Language de-DE eintragen

  8. Audio Recording muss der Punkt Get microphone input remotely with MQTT gewählt werden. Dort läuft ein Audio-Stream über MQTT vom snips-audio-server
    Und der Punkt “Stream Forever” muss ausgewählt sein

  9. Audio Playing, je nach Anforderung, sollte an dem Lautsprecher des Satellite Servers ausgegeben werden, dann über MQTT → dann schickt Rhasspy den Stream zum snips-audio-server

Im Rhasspy unter dem Reiter Words kann man eigene Wörter definieren, die Rhasspy können sollte. (Incl. Pronunciation generator oben)
Unter Sentences können dann die Intents bzw Events erstellt werden die im Home Assistant dann angezapft werden.

HomeAssistant Event Handling (Automatisierung)

Erstelle eine beliebige Automatisierung

  1. Trigger
Ereignis:
rhasspy_NameVonRhasspyEvent 
zb: rhasspy_ChangeLightState -> [ChangeLightState] muss unter Sentences im Rhasspy angelegt sein

Dann beliebige Aktion setzen

Um eine Sprach-Ausgabe vom HA zum Rhasspy durchzuführen muss der Dienst rhasspy_Speak in der configuration.yaml vom HA angelegt werden.

Ich habe dazu folgende Zeile hinzugefügt:

rest_command: !include rest_commands.yaml

und ein neues File unter /config/ angelegt mit dem Namen rest_commands.yaml
mit folgendem Inhalt:

rhasspy_speak:
url: ‘httpURLofHA/api/text-to-speech’
method: ‘POST’
headers:
accept: ‘text/plain’
Content-Type: ‘text/plain’
payload: ‘{{ data_template }}’

Unter payload habe ich data_template anstatt “payload” eingesetzt, damit ich auch Sensor-Daten zurückgeben kann. Wie zb. Es ist {{ states.sensor.time.state }} Uhr.
Dann muss auch in der Automatisierung der Key “data_template” verwendet werden!!

In der configuration.yaml hab ich noch

tts:
- platform: marytts

hinterlegt. Bin nicht sicher ob das notwendig ist!

Steuern eines Medienplayers! (MDP) = Music Player Daemon-Server
https://strobelstefan.org/?p=4244

Ich hab am Satelliten Server, zusätzlich zum Snips, mdp und die alsa-utils installiert (sollten jedoch schon installiert sein durch snips)

sudo apt-get install mpd mpc alsa-utils

in der sudo nano /etc/mpd.conf habe ich dann folgendes angepasst:
bind_to_address “any”
und kompletter audio_output vom type httpd aus dem Kommentarblock ausgenommen,
damit dieser MDP Server auch gesteuert werden kann
music_directory habe ich noch auf meinen Mountpoint von der NAS gelenkt.

Dann das ganze neustarten und updaten
sudo /etc/init.d/mpd restart
sudo mpc update

Zum Playlist erstellen hab ich die Android App MPDroid benutzt, damit man dann diese auch vom HA abspielen kann.
In der configuration.yaml setze ich

media_player:
- platform: mpd
host: IP-OHNE-PORT vom MDP Host (Satellite Server

Als Test-Skript kann man dann zb folgendes erstellen:

Aktion: Dienst ausführen
Dienst: media_player.play_media
Name: mediaplayer.mdp
Dienstdaten:
media_content_id: Reggae
media_content_type: playlist

Mit weiteren Aktionen wie shuffle_set next_track oder pause kann man dann noch verfeinern.

Ich habe auch eine Automatisierung erstellt die auf das MQTT Topic
hermes/hotword/default/detected
hört
und dann an über den Dienst media_player.pause
die Musik pausiert, damit mich Snips besser versteht

Bin für Verbesserungs-Vorschläge gerne offen!

1 Like

Links:
https://docs.snips.ai/articles/platform/satellites

Why is Raspbian Stretch needed? (honest question)

I’m also waiting for some ongoing release cycles to use rhasspy (mega vielversprechend IMHO) as a voice-command-system but I think ReSpeaker and all other components are working just fine with Buster, or am I mistaken?