Hardware
Zur Entwicklung wurde folgende Hardware benutzt, die hier als Referenz dient:
Typ | Modell |
---|---|
Einplatinencomputer | Raspberry Pi 3 B+ |
Mikrofon | ReSpeaker 4-Mic Array |
ZigBee USB-Stick | CC2531 |
ZigBee Lampe | Philips Hue white and color (929001573) |
Lautsprecher | Logitech Z120 |
Tooling
Rhasspy
Rhasspy ist ein Open Source Dienst, welcher es ermöglicht einen eigenen Sprachassistenten zu entwickeln. Der Service liefert einige Dienste von Haus aus mit. Die verwendeten Dienste sind hier im Folgenden aufgelistet und erläutert
Rhasspy Raven
Rhasspy Raven ist ein Dienst zur Erkennung des Wake-Words. Ein Wake-Word ist das Wort, welches den Sprachassistenten “weckt” und signalisiert, dass die folgenden gesprochenen Wörter interpretiert werden sollen. Raven benötigt ein Training um das Wake-Word zu erkennen - hierzu werden drei Audiodateien händisch aufgenommen und gespeichert. Raven bietet auch die Möglichkeit einige Parameter wie Sensitivität und die Anzahl der übereinstimmenden Trainingsdateien zu definieren.
Es lassen sich auch unterschiedliche Wake-Words erstellen.
Pocketsphinx
Pocketsphinx ist der Dienst, der unsere gesprochene Sprache transkribiert. Die Umwandlung erfolgt dabei komplett offline. Pocketsphinx bietet auch einige Parameter zur Feinabstimmung - insbesondere den Start- und Stopp-Zeitpunkt des Transkribierens. Das Wörterbuch sowie die entsprechende Aussprache lässt sich hier über Textdateien definieren und ergänzen.
Die Entwicklungsdokumentation dazu findet sich hier.
Fsticuffs
Fsticuffs wird verwendet um Sätze bzw. Befehle zu erkennen, die gesprochen werden. Alle möglichen Befehle müssen definiert werden. Nach eigener Aussage ist Fsticuffs dafür extrem performant.
Die Entwicklungsdokumentation dazu findet sich hier.
Espeak
Espeak (Rhasspy GitHub) ist ein Text-To-Speech Dienst. Er bietet Stimmunterstützung für verschiedene Sprachen.
Die Entwicklungsdokumentation dazu findet sich hier.
Rhasspy (Dialogue Management)
Der hauseigene Rhasspy Dialogue Manager kümmert sich um die Sitzungsverwaltung. Dieser Service stellt einen Vermittler dar, der die anderen Services benachrichtigt, sobald diese mit ihrer Arbeit beginnen sollen.
MQTT
Bei dem Message Queuing Telemetry Transport (MQTT) handelt es sich um ein Client-Server-Netzwerkprotokoll. Es eignet sich besonders gut für Machine-To-Machine Kommunikation und ist deshalb im IoT-Bereich weit vertreten.
Dabei gibt es einen sogenannten MQTT-Broker, der hier den Server darstellt. Clients senden Nachrichten an den Broker in
ein bestimmtes Topic. Topics stellen hier eine hierarchische Ordnung dar und sind nicht fest definiert. Ein Mögliches
Topic wäre zum Beispiel /Wohnzimmer/Rauchmelder/Rauchsensor
- hier würde beispielsweise der Rauchsensor des
Rauchmelders die aktuellen Sensordaten schreiben (PUBLISH
).
Wenn man jetzt einen möglichen Rauchmelder im Schlafzimmer koppeln möchte, kann dieser das Topic
abbonieren (SUBSCRIBE
). Der Broker wird dann die aktuellen Sensordaten weiterleiten.
MQTT definiert drei unterschiedliche Qualitiy of Service (QoS) - most once (Einmaliges Senden), at least once (Mehrfaches Senden bis Empfang bestätigt wird) und exactly once (Mehrfaches Senden, exakt einmaliger Empfang).
Zusätzlich kann eine Retain-Flag gesetzt werden, die dem Broker mitteilt die Nachrichten zwischenzuspeichern auch wenn es keinen Subscriber des Topics gibt.
Das Protokoll wird von der OASIS verwaltet und weiterentwickelt.
Weitere Informationen: https://mqtt.org/
Mosquitto
Mosquitto ist eine Open Source implementierung des MQTT Brokers, der von der Eclipse Foundation entwickelt wird.
MQTT Explorer
Der MQTT Explorer eignet sich hervorragend dafür seinen MQTT-Broker zu debuggen. Er bietet eine Übersicht über die MQTT Topics und ermöglicht es, eigene Nachrichten zu versenden.
Zigbee2MQTT
Zigbee2MQTT ist ein Service, der es ermöglicht smarte Geräte, die auf der Zigbee Spezifikation basieren über MQTT Nachrichten zu verwenden.
Wir verwenden den Service um eine (oder mehrere) Lampe über den Sprachassistenten anzusteuern. Der Entwicklungsprozess ist hier beschrieben.
Node-Red
Node-Red ist eine visuelle Programmierumgebung, die es ermöglicht Abläufe zu definieren.
Docker
Um die implementierten Anwendungen isoliert laufen zu lassen, verwenden wir Docker. Wie man Deep Thought mit Docker startet ist hier beschrieben.
Docker Image hermes-led
Das Docker Image hermes-led
stellt eine Schnittstelle zwischen ReSpeaker Treiber zu MQTT dar. Es ist für ARM-Geräte
auf Docker Hub zu finden.
Damit das Image verwendet werden kann, müssen dem Container einige Geräte übergeben werden, das ganze geschiet über die
entsprechenden Dateideskriptoren /dev/gpiomem
, /dev/mem
, /dev/spidevv0.0
und /dev/spidev0.1
.
Der Container startet HermesLedControl
und kann über die Umgebungsvariable HLC_ARGUMENTS
parametisiert werden. Die
zur Verfügung stehenden Parameter finden sich
hier.
Eine Beispielkonfiguration, wie sie in Deep Thought verwendet wird sieht folgendermaßen aus. Wir verwenden hier das
ReSpeaker 4-Mic-Array, übergeben unsere Rhasspy-Konfiguration und unseren den MQTT-Broker.
hermes-led:
container_name: hermes-led
image: thund/hermes-led:0.0.1
volumes:
- ./rhasspy/profiles/de:/tmp/rhasspy
environment:
- TZ=Europe/Berlin
- HLC_ARGUMENTS=--hardware=respeaker4 --pathToConfig=/tmp/rhasspy/profile.json --engine=rhasspy --mqttServer=mosquitto
devices:
- /dev/gpiomem:/dev/gpiomem
- /dev/mem:/dev/mem
- /dev/spidev0.0:/dev/spidev0.0
- /dev/spidev0.1:/dev/spidev0.1
restart: unless-stopped
privileged: true
Jekyll
Die Dokumentation wird mit Jekyll generiert. Hierzu kann man ebenfalls einen Docker-Container verwenden, anstatt Jekyll lokal zu installieren.
Lokale Testversion hosten:
export JEKYLL_VERSION=3.8
cd ./docs
docker run --rm -p 4000:4000 --volume="/$(PWD):/srv/jekyll" -it jekyll/jekyll:$JEKYLL_VERSION jekyll serve --force-polling
Die Dokumentation ist anschließend unter http://localhost:4000 aufrufbar.
Flask
Die API welche die Logik der Intents steuert wird mit dem Python-Framework Flask umgesetzt. Wir haben bei der Implementierung der API drauf geachtet die einzelnen Features (Lichtsteuerung, Wecker, etc.) in einzelne Module zu schreiben.
Entwicklungswerkzeuge
Visual Studio Code
Die einfachste Möglichkeit um direkt auf dem Raspberry Pi zu entwickeln gibt es mit Visual Studio Code in Kombination mit den Folgenden Addons um Medienbrüche zu vermeiden:
Remote - SSH
Remote - SSH bietet eine einfache Möglichkeit über Visual Studio Code direkt auf den Raspberry Pi zuzugreifen. So kann man auf das Dateisystem und auf die Kommandozeile zugreifen.
Remote - Containers mit Docker
Mit Remote - Containers und Docker ist es möglich die Docker-Umgebung, die sich auf dem Raspberry Pi befindet direkt in Visual Studio zu verwalten.
Python
Sollte man am Python-Code arbeiten wollen, ist das Python Addon ein nützlicher Helfer.