Spracherkennung ohne Cloud mit Snips und Raspberry Pi (Teil 1 Installation)

  • Einleitung

    Aufmerksam geworden bin ich auf SNIPS durch einen Beitrag von HoerMirAuf  hier und einen Beitrag in der c't in Heft 11/2019, S. 34-37. Ich fand Sprachsteuerung schon länger attraktiv, wollte mich aber auf keinen Fall noch weiter in die Fänge von Amazon, Google oder Apple begeben, genauso wenig wie in die Cloud irgendeines anderen Anbieters. Die Vorstellung, dass ständig irgend jemand mithört oder mithören kann, ist einfach nur gruselig. Deshalb war die Beschreibung eines Systems, das offline arbeitet und die Spracherkennung und -verarbeitung in meinem lokalen Netz betreibt eine richtiger Lichtblick und sofort von dem dringenden Gefühl des must-have bzw. must-make befeuert.


    Dieser Artikel befasst sich zunächst nur mit der Einrichtung von Snips auf einem Raspberry Pi und dem Anlegen einer Spracherkennung. In späteren Artikeln bzw. Ergänzungen zu diesem Artikel, werde ich auf folgende Themen eingehen:

    • Mit Satelliten arbeiten (Spracheingabe in mehreren Räumen),
    • Die Nutzung von Snips für die Heimautomation mittels MQTT (und später auch mittels HTTP),
    • Sprachausgabe mit Snips einrichten (TTS = Text To Speech bzw. Wiedergabe von WAV-Dateien),
    • Snips JSON-Ausdrücke mit Python auswerten.


    An Hard- und Sotware-Voraussetzungen hatte ich schon alles, was man dazu braucht: Einen Raspberry Pi

    Eine USB-Soundkarte mit Kopfhörer-Ausgang und Mikrofon-Eingang (China Billigmodell)

    Ein Headset – ebenfalls popelige Billigware



    Wer und was ist SNIPS und wie funktioniert es – Ein Kurzüberblick


    Wer mehr über SNIPS erfahren will, kann sich auf der Websiite snips.ai umsehen. Spannend ist, dass dieses kommerzielle Unternehmen seine KI zur Verfügung stellt, damit Privatanwender und Partner eigene Spracherkennungssysteme aufbauen können. Snips ist eine Anwendung, die auf der Grundlage von nodejs läuft, einen MQTT-Broker für den Nachrichtenaustausch benötigt und die Sprachanalyse als JSON-Ausdruck über den MQTT-Broker publiziert.

    Mit Hilfe von weiteren Programmier- oder Skriptsprachen (Python, bash, Perl) oder in Umgebungen wie OpenHab, IOBroker oder Domoticz können diese JSON-Ausdrücke vom MQTT-Broker abonniert (subscribe) und ausgewertet werden. Der MQTTBroker kann ein bereits vorhandener sein. Snips benutzt in der Standardinstallation seinen eigenen, der, wenn man will, auch mit einem vorhandenen gekoppelt werden kann. Ich habe mich dazu entschlossen, den bereits vorhandenen MQTT-Broker Mosquitto zu benutzen. Dazu später mehr.



    I. Installation von SNIPS


    Die Installation läuft größtenteils im Client-Server-Modus ab, d. h. Wir arbeiten nicht am Raspberry Pi direkt, sondern sind mit dem Raspberry Pi mittels SSH oder Putty verbunden. (Wie ein Raspberry Pi hergerichtet wird, erkläre ich hier nicht. Dazu gibt es hunderte von deutschsprachigen Webseiten. Ich gehe also davon aus, dass es sich um eine frische Installation handelt.)


    Der Client-Rechner (ein Linux- oder Windows-Rechner) ist also unser Arbeitsplatz. Dies wiederum bedeutet, dass sich der Snips-Rechner irgendwo in der Wohnung oder im Haus befinden könnte. Aus rein praktischen Gründen empfiehlt es sich für die ersten Schritte allerdings, wenn der Raspberry räumlich in der Nähe ist, weil Lautsprecher und Mikrofon in der Nähe sein sollten. Wie man mit Satelliten arbeitet, also mit in der Wohnung verteilten Mikrofonen und Lautsprechern, wird ebenfalls weiter unten erläutert.


    Nun geht’s aber los:


    Voraussetzung 1: Ein Raspberry mit aktueller Raspbian(-lite)-Version, eine externe USB-Soundkarte (für das Mikrofon), Lautsprecher am Analog-Ausgang (3,5 mm Klinkenbuchse), ins Netz eingebunden, SSH aktiviert.


    Voraussetzung 2: Ein anderer Rechner mit dem Paket/Programm npm. Mit Hilfe von npm wird der Raspberry Pi vom Client-Rechner aus konfiguriert.


    Schritt 1 Analog-Audio auf dem Raspberry Pi einrichten: Per SSH oder Putty auf den Raspberry Pi einloggen und mit sudo raspi-config das Konfigurationsprogramm des Raspberry Pi aufrufen.

    Dann Punkt 7 Advanced Options auswählen, danach Punkt 4 Audio und dort 1 Force 3.5mm (‘headphone‘) jack auswählen. Mit Auswahl von OK und Finish bestätigen; anschließend mit exit die SSH-Konsole des Raspberry Pi verlassen. Wir bleiben aber im Terminal des Client-Rechners


    Schritt 2 Auf dem Client-Rechner das Konfigurationsprogramm snips-sam installieren:

    Das Nachfolgende bezieht sich auf einen Ubuntu-Rechner, der als Client des Raspberry Pi eingesetzt wird.

    Im Terminal bleiben Per sudo apt install npm die nodejs-Paketverwaltung npm installieren. Alle Abhängigkeiten werden mit installiert. Danach sudo npm install -g snips-sam> abschicken. Ein Neustart des Rechners, mindestens des Terminals ist angeraten. (Auf Windows Rechner muss zunächst das Programm NodeJS und npm in der Windows-Version installiert und ohne sudo gearbeitet werden.)


    Schritt 3 Auf dem Raspberry snips installieren

    Wir öffnen nach dem Neustart des Client-Rechners wieder ein Terminal und geben sam connect raspberrypi ein und mit <enter> abschicken. Man wird nach dem Benutzernamen und nach dem Passwort gefragt. Standardmäßig sind „pi“ und „raspberrypi“ vorbelegt und können mit zweimal <enter> bestätigt werden. Hinweis: Dies funktioniert nur, wenn es nur genau einen Rechner mit dem Namen raspberrypi gibt. Sind mehrere Raspberry Pis im Netz aktiv, dann an Stelle des Rechnernamens die IP-Nummer des Gerätes angeben. Eine elegante Lösung ist es auch, dem Raspberry Pi mit dem Befehl sudo nano /etc/hostname einen anderen Hostnamen als raspberrypi zu geben. Dazu muss das Wort raspberrypi durch z. B. Snips-base ersetzt werden. Die Änderung speichern und den Raspberry Pi mit sudo reboot neustarten. Danach kann das Gerät auch mit dem Befehl sam connect snips-base.local angesprochen werden. Steht die Verbindung, dann wird mit sam init SNIPS auf dem Raspberry Pi installiert. Das dauert ein Weilchen, denn das System wird aktualisiert, neue Paketquellen eingerichtet und die snips-Komponenten werden heruntergeladen und installiert.



    Schritt 4 snips einrichten und testen

    Spätestens jetzt wird das Headset bzw. das Mikrofon mit der USB-Soundkarte und der Kopfhörer kann alternativ auch mit der 3,5 mm-Buchse des Raspberry verbunden werden. Als nächstes folgendes eingeben:

    sam setup audio

    Die Frage Is it a Snips Makers Kit? (Y/n) unbedingt verneinen mit „n“. Danach erscheint folgendes Bild:



    Da nur ein Eingabegerät (capture device = Mikrofon) entdeckt wurde, ist dies bereits ausgewählt. Allerdings verfügt der Raspberry über drei potentielle Ausgabegeräte: die 3,5 mm-Buchse (Karte 0, Gerät 0), der HDMI-Ausgang (Karte 0, Gerät 1) oder der Ausgang der USB-Soundkarte (Karte 1, Gerät 0). Je nach dem wo der Kopfhörer angeschlossen ist, mit der Cursortaste Karte und Gerät auswählen, anschließend <enter>.


    Nun Ausgang und Eingang testen:

    sam test speaker. Es sollte etwas zu hören sein. Mit <enter> den Test abbrechen. Danach:

    sam test microphone. Du wirst zum Sprechen augefordert. Zum Beenden irgendeine Taste drücken und das Gesprochene sollte zu hören sein. Jetzt testen wir noch, ob alle erforderlichen Dienste auf dem Raspberry Pi laufen. Dazu eingeben:

    sam status

    Es sollte sich folgendes Bild zeigen:




    Wenn es so aussieht, kannst du einen ersten Test machen, in dem du einfach die Worte „Hey snips“ sagst. Nach ein paar Sekundenbruchteilen erfolgt ein Ton. Normalerweise würde man dann einen Befehl sprechen. Damit kann snips aber noch nichts anfangen. Versuche es erst gar nicht. Nach weiteren Sekundenbruchteilen erfolgt ein weiterer Ton und eventuell ein tiefer, einen Fehler anzeigenden Ton.


    Zweiter Teil: Snips das Hören und Verstehen beibringen

  • Yeahh! Gefällt mir auch. Ich würde ja gerne mehrmals "danke" (:thumbup::thumbup::thumbup::thumbup:) drücken, aber das geht nicht. :)


    Im Moment bin ich beruflich eingespannt. Sobald ich im Herbst wieder etwas Luft habe, werde ich mal schauen, ob ich das hinbekomme.

    Meine Hardware@home: Fritzbox 7490, 3xFritzDect 200, 1xSonOff S20 u. Gosund SP1 mit Tasmota, Syno NAS, Raspberry Pi 3B f. PiHole, Docker, Portainer