Raspberry Pi Sprachsteuerung selber bauen (Hausautomatisierung)

Siri, Amazon’s Echo und „S Voice“ sind alles Spracherkennungprogramme, die das Leben einfacher machen sollen. Auch eine Raspberry Pi Sprachsteuerung kann einfach selbst gebaut werden. Denn solch eine Spracherkennung ist natürlich auch sehr vorteilhaft für eine Hausautomatisierung.

In diesem Tutorial zeige ich wie die Spracheingabe über ein Mikrofon digitalisiert, in Text umgewandelt wird und anschließend darauf reagiert wird.

 

Die Spracherkennungsfunktion kann (in Chrome) bereits hier getestet werden.

Hardware für die Raspberry Pi Sprachsteuerung

Alternativ kannst du auch ein USB Mikrofon nehmen, ich habe es allerdings damit nicht getestet. Dennoch sollte es funktionieren.

Falls du per Spracheingabe z.B: die GPIOs steuern möchtest, ist ein Breadboard sowie Jumper Kabel hilfreich für die Verbindung zum Raspberry Pi.

 

Vorbereitung

Als Spracherkennungdienst dient Google. Um die API nutzen zu können, musst du mit deinem Google Account dieser Gruppe beitreten.

Als nächstes öffnest du die Developer Console und drückst auf „Projekt erstellen“. Nachdem es erstellt wurde klickst du links auf „APIs und Authentifizierung“ -> „APIs“ und suchst nach „Speech API“. Diese aktivierst du für dein Projekt und klickst links auf „Zugangsdaten“. Hier musst du einen neuen öffentlichen Schlüssel (Browserschlüssel) erzeugen.

Den nun erstellten API Schlüssel musst du gleich im Skript einfügen.

Dazu sei gesagt, dass täglich 50 Anfragen kostenlos sind. Wer mehr braucht kann diese entweder bei Google kaufen oder ein zweites Projekt erstellen und einen weiteren Schlüssel bekommen 😉

Raspberry Pi Sprachsteuerung – Software

Das Prinzip ist folgendes. Es wird eine Audiodatei erstellt, diese an Google gesendet und als Text zurückgesendet. Fangen wir also an:

sudo apt-get update
sudo apt-get install flac

Nun prüfen wir ob die USB Karte korrekt erkannt wurde:

lsusb

Dabei sollte u.a. so ein Eintrag sein:

Bus 001 Device 004: ID 1130:f211 Tenx Technology, Inc. TP6911 Audio Headset

Nun lassen wir die Aufnahmegeräte ausgeben:

arecord -l

Bei mir sieht der Output folgendermaßen aus. Wichtig ist dabei die Nummer:

**** List of CAPTURE Hardware Devices ****
card 1: AUDIO [USB  AUDIO], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

 

An dieser Stelle empfehle ich das Mikrofon zu testen. Bei mir war das Mikrofon stumm gestellt (was mit amixer -c 1 rückgängig gemacht werden kann). Wir nehmen also eine kurze Testdatei auf und lassen sie abspielen:

arecord -d 10 -f cd -t wav -D plughw:1,0 test.wav
aplay -f dat test.wav

Wenn du etwas hörst, hat alles geklappt und es kann weiter gehen.

 

Wir erstellen eine Datei, die die Anfrage sendet und auswertet.

sudo nano speech2text.sh

Die Datei hat folgenden Inhalt. Oben musst du noch deinen API Schlüssel eintragen.

Anschließend muss dem Skript noch erforderliche Rechte zugeteilt werden.

chmod +x speech2text.sh

Nun kann es gestartet werden und gesprochen werden.

./speech2text.sh

Ich habe im unteren Teil des Skripts zwei Beispiel Abfragen eingefügt, mit denen auf die Spracheingabe reagiert werden kann. Bspw. könnte ein anderes Skript oder ein Befehl ausgeführt werden. Wofür du dies benutzt bleibt ganz dir überlassen.

Der Vollständigkeit halber hier meine Test Ausgabe:

pi@raspberrypi ~ $ ./speech.sh
Aufnahme... Zum stoppen STRG+C drücken und warten.
^C
Ausführen...
Google Antwort: "mach das Licht an"

Licht wird eingeschaltet

 

 

Falls Interesse bestehen sollte könnte ich dazu auch eine Nutzung per Smartphone erstellen und posten.

93 Kommentare

    • Wie genau meinst du das? Das das Android Gerät ein Sprachassistent ist oder das man das Android nur als Mikrofon verwendet und der Raspberry Antwortet?

      Antworten
    • Irgendwie ist es doch gaga, Google deinen Text zu senden, damit die Datenkrake alles ordentlich speichert. So etwas kann man ja wohl selbst anlernen. Aber in diesen Zeiten hat man nicht zu verbergen und auch nichts mehr zu sagen. Höchst bedenklich.

      Antworten
  1. Tolles Tutorial! Was mich interessieren würde: Wie groß ist die Latenz, sprich die Zeit zwischen erfolgter Spracheingabe und Aktion?

    Antworten
      • Hey Felix,
        Weißt du eigentlich, dass mein Name auch Felix ist?
        Wenn du willst können wir uns mal treffen.

        Dein Felix

  2. Immer wenn ich versuche das Script zu starten, startet es auch ganz normal und nimmt meine Aussage auf. Bei der Antwort und Auswertung kommt aber jedes mal diese Fehlermeldung.

    pi@raspberrypi ~ $ ./speech2text.sh
    Aufnahme… Zum stoppen STRG+C drücken und warten.
    ^C
    Ausführen…
    ./speech2text.sh: Zeile 10: gt: Kommando nicht gefunden.
    ./speech2text.sh: Zeile 10: stt.txt: Kommando nicht gefunden.
    Google Antwort: cat: stt.txt: Datei oder Verzeichnis nicht gefunden

    ./speech2text.sh: Zeile 18: Syntaxfehler beim unerwarteten Wort `;&‘
    ./speech2text.sh: Zeile 18: `rm file.flac > /dev/null 2>&1′

    kann mir da jemand helfen?

    Antworten
    • Hallo Gary,
      leider macht WordPress manchmal aus „&“ bzw „<>“ Zeichen z.B. die HTML Variante „&“. Daher die Fehler.
      Ich habe es aber nun verbessert und mit diesem Code sollte es klappen. Entferne am besten den vorherigen Code und ersetze es mit dem aktuellen.
      LG Felix

      Antworten
      • Hallo Gary,
        Ich habe mich gefragt ob dein Name wirklich Gary ist.
        Der Name ist nämlich sehr selten da wo ich herkomme.
        Ich heiße Felix und möchte dich fragen ob du lust hast dich mit mir zu treffen.

        Dein Felix

  3. Hey Leute,
    als ich die beschriebenen Schritte durchgeführt habe, um mein USB-Mikro zu testen, wurde der gesamte Ordner mit über 5000 Wave-Dateien, die nur eine 10telsekunde lang sind, zugemüllt, und erst durch killen des Prozesses konnte ich dies stoppen. Habe ich irgendetwas falsch gemacht?
    Ich habe überall exakt die gleichen Werte und Selektoren verwendet.

    Antworten
  4. Bei mir klappt das mit dem Stoppen nicht. Wenn ich STRG+C drücke, wird das gesamte Skript abgebrochen:

    pi@raspberry ~ $ ./speech2text.sh
    Aufnahme… Zum stoppen STRG+C drücken und warten.
    ^C
    pi@raspberry ~ $

    Woran könnte dies liegen?

    Antworten
    • Ich habe leider das gleiche Problem. Habs immer wieder anders versucht, aber es tut nicht. Der ganze Prozess wird irgendwie gekillt.

      Antworten
  5. Hallo Felix, erst einmal danke für die coole Anleitung hier.
    Soweit hab ich alles wie oben beschrieben umgesetzt,
    doch es kommt keine Antwort von Google.
    Wenn ich das Skript starte und dein Beispielsatz spreche oder sonstige Wörter,
    (hier ein Auszug):
    —————————————————————————————————
    pi@raspberrypi ~ $ ./speech2text.sh
    Aufnahme… Zum stoppen STRG+C drücken und warten.
    ^C
    Ausführen…
    Google Antwort:

    pi@raspberrypi ~ $
    —————————————————————————————————–
    bleibt nach „Google Antwort:“ das Feld leer!
    Mikrofon und Lautsprecher funktionieren (habe den oben beschriebenen Mikro-Test erfolgreich durchgeführt)
    Auch auf der Google Developer Console konnte ich in der Statistikübersicht Aktivitäten erkennen
    (also muss ja ein Zugriff stattfinden?)
    Wo könnte ich noch nach Fehlern suchen?
    Viele Grüße Sebi

    Antworten
    • Hallo Sebi,
      hm das ist merkwürdig. In der Google Statistik siehst du also, dass eine Anfrage stattgefunden hat? Ansonsten würde ich einfach mal alles was möglich ist loggen (was gesendet wurde, Antwort etc.) Außerdem kannst du mal eine vorgefertigte Test Audio File senden (ohne das Mikro zu verwenden). Irgendwo muss der Fehler ja liegen.

      Antworten
    • Hallo Felix, ja genau in der Google-Statistik sind z.B. 14 Anfragen (ich habe dein Skript 14 mal gestartet). Also wir auf jeden Fall eine Verbindung aufgebaut. Aber keine Antwort. Wie würde das mit deinem Vorschlag einer „Test Audio File senden“ funktionieren? Was muß ich da mach um diese zu versenden?
      Und vorallen wie weis ich nach dem Test ob eine Antwort kommt?
      Gruß Sebi

      Antworten
      • Du nimmst eine vorgefertigte flac Datei mit aufgenommen Sätzen (oder nimmst etwas auf und speicherst es als Datei mit arecord). Dann sendest du es (Zeile mit wget) und schaust dir den Output an, der im Skript als stt.txt gespeichert wird. Der Inhalt davon ist wichtig und enthält die Informationen.
        Im Grunde musst du die Schritte des Skriptes nur in der Reihe ausführen und jeden Schritt überprüfen, um den Fehler zu finden.

  6. Hallo Felix, erst einmal danke für die coole Anleitung hier.
    Soweit hab ich alles wie oben beschrieben umgesetzt,
    doch es kommt keine Antwort von Google.
    Wenn ich das Skript starte und dein Beispielsatz spreche oder sonstige Wörter,
    (hier ein Auszug):
    —————————————————————————————————
    pi@raspberrypi ~ $ ./speech2text.sh
    Aufnahme… Zum stoppen STRG+C drücken und warten.
    ^C
    Ausführen…
    Google Antwort:

    pi@raspberrypi ~ $
    —————————————————————————————————–
    bleibt nach „Google Antwort:“ das Feld leer!
    Mikrofon und Lautsprecher funktionieren (habe den oben beschriebenen Mikro-Test erfolgreich durchgeführt)
    Auch auf der Google Developer Console konnte ich in der Statistikübersicht Aktivitäten erkennen
    (also muss ja ein Zugriff stattfinden?)
    Wo könnte ich noch nach Fehlern suchen?
    Viele Grüße Sebi

    Antworten