III. Mit Satelliten arbeiten
Für eine angestrebte Sprachsteuerung macht es wenig Sinn, wenn man Sprachbefehle nur an einer Stelle eingeben kann und dazu sich noch einen Headset aufsetzen muss. Der folgende Artikel befasst sich zum einen mit der Konfiguration von Snips-Basis und Snips-Satelliten und zum anderen mit der Installation eines sogenannten Mikrofon-Arrays am Beispiel des preisgünstigen Respeaker-4-Mic. Am Ende des Artikel beschrebe ich die Installation eines Mikrofon-Arrays und gebe ein paar Tips zur Verstärkung der Tonausgabe.
Als Satelliten sind andere Raspberry Pis sehr gut geeignet. Ein Zero-Modell oder ein Raspberry Pi 2 reichen völlig aus. Folgende Schritte sollten an diesem Raspberry Pi mittels SSH-Konsole vorgenommen werden:
sudo apt update
sudo apt upgrade
sudo apt install -y dirmngr
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 --keyserver pgp.surfnet.nl --recv-keys D4F50CDCA10A2849
sudo apt update
sudo apt install snips-hotword-model-heysnipsv4
sudo apt install snips-satellite
Das Paket snips-satellite beinhaltet alle Komponenten, die vor Ort erforderlich sind. Die Verarbeitung findet auf der Snips-Basis statt. Als nächstes sicherstellen, dass der Snips-Satellit die richtige Hardware benutzt, also mit sudo raspi-config die 3,5 mm Klinkenbuchse als Audio-Ausgabe konfigurieren: Punkt 7 - Advanced Options ansteuern, danach Punkt 4 - Audio und dort 1 Force 3.5mm (‘headphone‘) jack auswählen.
Nun durch sudo nano /etc/hostname den Rechnernamen von raspberrypi auf einen eindeutigen ändern z. B. satellite01 oder wohnzimmer usw. Mit Strg-X[tt] anschließend [tt]y die Änderung speichern und den Satelliten neu starten. Anschließend wieder per SSH (z. B. ssh pi@satellite01.local) neu einloggen und mit sudo nano /etc/snips.toml die Konfigurationsdatei des Satelliten bearbeiten. Im Abschnitt [snips-common] in der zweiten Zeile das Kommentarzeichn # und den Leerschritt löschen und die IP-Nummer (oder rechnername.local) des Snips-Basis-Gerätes eingeben, sodass dort z. B. mqtt = "192.168.168.XXX:1883"[tt] (oder z. B. mqtt = "snips-base.local:1883"[tt] - wenn der hostname des Gerätes snips-base lautet) steht.
Die zweite Änderung findet im Abschnitt [tt][snips-audio-server] statt. Hier muss die Zeile bind = ... auskommentiert werden (also das Zeichen # löschen) und folgendes eingegeben werden bind = "satellite01.local@mqtt" wenn der Satelliten-Raspi den hostname satellite01 trägt. Man kann an dieser Stelle natürlich auch die IP-Nummer des Satelliten eingeben. Mit Strg-X[tt] anschließend [tt]y die Änderung speichern und den Satelliten neu starten.
Im nächsten Schritt per SSH in den Raspi, der die Snips-Basis ist, einloggen und ebenfalls mit sudo nano /etc/snips.toml die Konfigurationsdatei der Snips-Basis bearbeiten. Wir gehen zum Abschnitt [snips-audio-server] und entfernen dort von der Zeile bind = ... das Kommentarzeichen # und geben anstelle des default den Rechnernamen der Snips-Basis (oder die IP-Nummer) an. Wenn an der Basis ebenfalls Spracheingaben erfolgen sollen muss im Abschnitt [snips-hotword] die Zeile audio = ... bearbeitet werden. Sie wird auskommentiert und anstelle des Plus-Zeichens wird der hostname oder die IP-Nummer der Snips-Basis eingegeben. Anschließend auch dieses Gerät neu starten bzw. mit sudo systemctl restart snips-* alle Snips-Dienste neu starten und ausloggen.
Als nächsten die USB-Soundkarte am Satelliten anschließen und auf dem Client-Rechner (siehe Beschreibung der Arbeitsumgebung in Teil 1) zur Sicherheit zunächst sam disconnect eigeben und anschließen sam connect satellite01.local eingeben bzw. den vergebenen Namen oder die IP-Nummer. Anmeldenamen und Passwort eingeben bzw. bestätigen. Nun konfigurieren wir den Satelliten. Mit sam setup audio überprüfen wir, ob snips die Audio-Hardware richtig erkennt (siehe Teil 1). Durch die Eingabe von sam test speaker und sam test microphone können wir zusätzliche Test machen. Wenn alles läuft, sollte nach einem beherzt gesprochenem "Hey snips" ein Ton zu hören sein: Die Basis hat das "Hotword" empfangen und warten auf weitere Ansagen.
Auf diese Weise kann man weitere Satelliten-Geräte konfigurieren, wobei nur noch die Datei /etc/snips.toml auf den Satelliten bearbeitet werden muss.
Ein Laptop, der unter Ubuntu 18.04 läuft, lässt sich ebenfalls als Satellit installieren. Dazu sind allerdings andere Paketquellen und ein anderer Signaturschlüssel anzugeben:
sudo bash -c ‘echo “deb https://debian.snips.ai/stretch 10 stable main” > /etc/apt/sources.list.d/snips.list’
sudo apt-key adv --keyserver pgp.mit.edu --recv-keys F727C778CCB0A455
sudo apt update
sudo apt install snips-hotword-model-heysnipsv4
sudo apt install snips-satellite
Nun kann ich mit "Hey Snips - Schalte den Drucker ein!" den Drucker unter Strom setzen, wenn ich ihn brauche. Ausgeschaltet wird er natürlich mit "Hey Snips - Schalte den Drucker aus!". Doch dazu später...
IV Freisprecheinrichtung mit einem Mikrofon-Array: Respeaker-4-mic
Sicherlich kann man sich auch eine Freisprecheinrichtung bauen, indem man einen Raspberry Pi 3 als Satellit einsetzt und einen Bluetooth-Headset benutzt. Damit befasse ich mich hier nicht, wäre aber eine interessante Ergänzung.
Ich habe mir für meine beiden Satelliten zwei MakerHawk ReSpeaker 4-Mic Array aus dieser Quelle bestellt, die zügig geliefert wurden. Im Wesentlichen bin ich der Anleitung auf der Website des Herstellers gefolgt (). Danach geht man folgendermaßen vor:
Im stromlosen Zustand die Erweiterungskarte aufstecken, danach Stromversorgung anschließen und sich per SSH verbinden. Dann:
sudo apt-get update
sudo apt-get upgrade
git clone https://github.com/respeaker/seeed-voicecard.git
cd seeed-voicecard
sudo ./install.sh
sudo reboot
Anschließend wieder verbinden und mit
arecord -L
prüfen, ob die Treiber installiert wurden und die Aufzeichnungsgeräte erkannt werden. Das Ergebnis sollte so aussehen:
null
Discard all samples (playback) or generate zero samples (capture)
playback
capture
dmixed
array
ac108
default:CARD=seeed4micvoicec
seeed-4mic-voicecard,
Default Audio Device
sysdefault:CARD=seeed4micvoicec
seeed-4mic-voicecard,
Default Audio Device
dmix:CARD=seeed4micvoicec,DEV=0
seeed-4mic-voicecard,
Direct sample mixing device
dsnoop:CARD=seeed4micvoicec,DEV=0
seeed-4mic-voicecard,
Direct sample snooping device
hw:CARD=seeed4micvoicec,DEV=0
seeed-4mic-voicecard,
Direct hardware device without any conversions
plughw:CARD=seeed4micvoicec,DEV=0
seeed-4mic-voicecard,
Hardware device with all software conversions
Alles anzeigen
Nun von der SSH-Konsole abmelden und mit sam connect satellite01.local mit dem Satelliten verbinden und anschließen sam setup audio aufrufen. Die Frage nach dem Maker Kit unbedingt mit 'n' beantworten! Geräte wie bereits oben beschrieben auswählen nzw. bestätigen und anschließend Lautsprecher und Mikrofon testen. Falls es Probleme gibt, die Tipps von dieser Seite (https://github.com/snipsco/snips-issues/issues/148) durcharbeiten. Bei mir hat ziemlich weit unten der Tipp von cpoisson vom 27. Mai geholfen: Das innere Objekt slave in slave.pcm. Mit dem Mikrofon-Array kann man bis zu 5 Meter entfernt sein und Spracheingaben machen.
Tipp für die Audio-Ausgabe: Die Lautstärke, die der Kopfhörer-Ausgang am Raspberry Pi liefert, ist echt mikrig. Ich habe mir zwei Miniverstärker besorgt (z. B. hier ) und zwei kleine 5-Watt-Lautsprecher von Pollin. Den Strom hole ich mir von der GPIO-Leiste (Pin 2 +5 V, Pin 6 GND). Man kann die Kabel gut an dem Anschlusstecker des ReSpeakers anlöten. Das ist physisch alles recht groß ausgeführt, sodass man auch als nicht sehr geübter Löter die Kabel für die Stromversorgung der Verstärkerplatine angebracht bekommt. Das Audio-Signal greife ich mir von einem 3,5 mm Stereo-Klinkenstecker ab. Die Spitze ist der linke Kanal, das zweite Segment der rechte Kanal und der hintere Abschnitt ist das gemeinsame Ground-Signal.
Nun kann ich frei sprechen und der Quittungs-Ton ist deutlich zu hören. Auch die Sprachausgabe (wird später erläutert) ist in der Verstärkung gut zu verstehen. Natürlich kein HiFi, aber das wird hier auch nicht gebraucht.