Raspberry Pi Spracherkennung

Projekte, Webserver

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.

 

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.



, , , , , , ,


26 Kommentare

  1. Rich sagt:

    Wäre nicht schlecht wenn die Sprachsteuerung über smartphone (Android) steuern läst

    • Retch sagt:

      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?

  2. Flo sagt:

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

  3. Gary sagt:

    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?

    • Felix sagt:

      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

    • Gary sagt:

      Ja, daran hat es gelegen.
      Vielen Dank für das wirklich sehr gute Tutorial!

    • Felix sagt:

      Freut mich, dass es dir gefallen hat 🙂

  4. Dominik sagt:

    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.

  5. Zeebo sagt:

    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?

    • Patti sagt:

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

  6. Sebi sagt:

    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

    • Felix sagt:

      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.

    • Sebi sagt:

      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

    • Felix sagt:

      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.

  7. marcus sagt:

    hey vielen dank für das tutorial aber bei mir kommt bei der flac datei nur ein rauschen und piepsen. aber die wav ist sauber… ich weis nicht warum es nicht funktioniert…

  8. Philipp sagt:

    Hallo,
    vielen dank für diese ausführliche Anleitung!
    Jedoch habe ich ein Problem:
    alles funktionier ich bekomme eine Google Antwort.
    Doch dann meldet er mir folgende Fehler :

    ./speech2text.sh: 49: ./speech2text.sh: [[: not found
    ./speech2text.sh: 59: ./speech2text.sh: 7: not found
    ./speech2text.sh: 49: ./speech2text.sh: [[: not found
    ./speech2text.sh: 63: ./speech2text.sh: 7: not found

    Ich würde mich über Hilfe sehr freuen!

    • Felix sagt:

      Bist du sicher, dass das Skript übereinstimmt? Zumindest kommt in dem Skript keine „7“ vor und auch die Zeilennummern sind unterschiedlich.

  9. Philipp sagt:

    Hallo Leute,

    bei mir funktioniert das nicht so recht. Führe ich das Programm aus, dann passiert folgendes:
    pi@raspberrypi:~ $ ./speechtotext.sh
    Aufnahme… Zum stoppen STRG+C drücken und warten.
    ^C
    pi@raspberrypi:~ $
    Führe ich folgenden Befehl aus:
    arecord -D plughw:1,0 -f cd -t wav -d 0 -q -r 44100 | flac – -s -f –best –sample-rate 44100 -o file.flac
    und im Anschluss:
    aplay file.flac
    kommt folgender Fehler:
    Wiedergabe: Rohdaten ‚file.flac‘ : Unsigned 8 bit, Rate: 8000 Hz, mono
    aplay: set_params:1233: Sample-Format nicht unterstützt
    Available formats:
    – S16_LE

    • Felix sagt:

      Ist deine USB Soundkarte als Device 0 oder 1 erkannt worden?

    • Philipp sagt:

      Die wurde als 1 erkannt.
      Wenn ich als Test „arecord -D plughw:1,0 -f cd -t wav -d 0 test.wav“ eingebe und das dann mit „aplay test.wav“ abspiele, dann höre ich auch das gesprochene.

    • Philipp sagt:

      Lösung gefunden! Einfach bei der folgenden Zeile -c 1 ergänzen.

      arecord -D plughw:1,0 -f cd -t wav -d 0 -c 1 -q -r 44100 | flac – -s -f –best –sample-rate 44100 -o file.flac

  10. Michael sagt:

    Bei mir kommt beim Start des Skripts eine Meldung

    ./speech2text.sh: Zeile 7: flac: Kommando nicht gefunden.

    Was muss ich nun tun?

  11. Patrick sagt:

    Hi, ich hätte sehr großes Interesse an der Möglichkeit mit dem Smartphone das ganze zu nutzen. Ein Mikrofon müsste ja in geringer Nähe sein um die Hintergrundgeräusche mit meine Stimme überlagernd zu empfangen.
    Mein Raspi soll im Flur in der Wand verbaut werden aber wenn ich im Wohnzimmer sitze möchte ich, dass der bei einem Befehl die Leinwand und den Beamer aus der Decke fährt. So müsste ich nicht direkt vorm Raspi die Befehle geben..

    • Felix sagt:

      An sich sollte es kein Problem sein das Smartphone als Mikropphon zu nutzen, sofern du Programmierkenntnisse hast: Statt einer Native App (mMn zu viel Aufwand dafür) würde ich einen Webserver (Apache) aufsetzen und die Hardwareunterstützung des Browsers verwenden. Mit einer kleinen PHP/JS Seite kannst du dich Aufnehmen und das Skript starten lassen.

  12. Alex sagt:

    habe leider auch das problem das sich das programm mit strg+c beendet.
    hat jemand eine lösung?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Blog abonnieren

Abonniere Tutorials-RaspberryPi, um kein Tutorial mehr zu verpassen!