Sprachsteuerung auf dem Raspberry Pi mit Jarvis – Teil 3 offline Spracherkennung
Das Problem an den Spracherkennungen wie Alexa von Amazon, Ok Google von Google, Siri von Apple, Cortana von Microsoft ist, dass die Systeme permanent mithören und alle Gespräche analysieren. Das müssen die Spracherkennungen auch, um die Schlüsselwörter zu identifizieren. Wird ein Schlüsselwort identifiziert, wird das folgende Gespräch an die jeweiligen Server geschickt, gespeichert, verarbeitet und eine Antwort generiert. Es kann sogar vorkommen, dass die Gespräche bei starken Abwandlungen der Schlüsselwörter abgehört werden, wie zum Beispiel bei Google. Wenn zum Beispiel „okay, gut“ gesagt wird, springt die Google Spracherkennung an, obwohl dieses Schlüsselwort nicht gewollt ist / eingetragen wurde. (Quelle: https://www.focus.de/digital/computer/technik-sprachassistenten-springen-auch-ungewollt-an_id_8604878.html).
Auch ist nicht klar was die Firmen wirklich mit den gespeicherten Gesprächen anfangen und ob sie die Daten evtl. für Werbezwecke verwenden oder an Dritte weitergeben.
Schön wäre eine offline Spracherkennung. Für Jarvis ist dies möglich. Hier folgt eine Anleitung wie ein bestehendes oder ein neu installiertes Jarvis dafür konfiguriert werden muss.
Bei Neuinstallationen von Jarvis können die ersten 3 Bilder übersprungen werden.
Jarvis starten:
cd jarvis
jarvis
Hier geht es auch bei Neuinstallationen weiter:
Die offline Spracherkennung ist nun eingerichtet. Die Kommandos müssen aber wie folgt trainiert werden:
Um Wörter zu trainieren oder das Schlüsselwort zu ändern, benötigt man einen Account auf Snowboy. Hier kann ein Account erstellt werden, vorhandene öffentliche Schlüsselwörter gesucht werden, eigene Schlüsselwörter erstellt werden und unter „Account settings“ der benötigte API-Key kopiert werden: https://snowboy.kitt.ai. Dieser API-Key kann hier eingegeben werden:
Die Schlüsselwörter oder Kommandos können hier trainiert werden:
Unter „Show trained hotwords/commands“ stehen alle trainierten Wörter.
Wichtig:
Es müssen alle verwendeten Schlüsselwörter und Kommandos einzeln trainiert werden. Das dauert am Anfang etwas Zeit, dafür hat man dann aber eine offline Spracherkennung.
Weitere Beiträge zu dem Projekt Sprachsteuerung mit Jarvis:
Teil 1 – Installation
Teil 2 – Start und Konfiguration
Teil 3 – offline Spracherkennung
Erweiterungen:
Raspberry Pi – Shell Script zum steuern der GPIOs
Jarvis automatisch starten
Raspberry Pi – Sprachausgabe von Textdateien / Vorlesefunktion
25 Kommentare
Manfred K. · 11. Oktober 2018 um 16:16
Hallo,
danke für das tolle Tutorial – wirklich alles super erklärt.
Mein Jarvis habe ich installiert aber es läuft nur teilweise,
das Hotword wird erkannt (mit Schwierigkeiten) und er erwartet dann auch ein Kommando .
Diese Kommandos werden aber nicht erkannt obwohl diese im Terminal angezeigt werden.
Es erscheint nach einiger Zeit die Meldung timeout.
Woran kann das liegen ?
Manfred K. · 11. Oktober 2018 um 18:03
Nachtrag zu meinem vorstehend geschilderten Problem.
Ich habe nur die Offline-Version von Jarvis (snowboy) geladen.
Nach Durchführung der 3 Trainingstests bekomme ich folgende Meldung und Fehlermeldung:
Meldung {„detail“: „Authentication credentials were not provided“}
Fehlermeldung ERROR:Missing/Invalid Snowboy token
Help: Your token: 277………….45367
Help:Set it in menue Settings / Voice Reco / Snowboy Settings / Token
Also den Key kopiere ich korrekt unter Snowboy Settings / Token(), denn er wird ja dort angezeigt.
Wie kann man das Problem lösen ?
Marc · 22. Dezember 2019 um 19:34
Kann man Jarvis irgendwie in den Iobroker einbinden?
CS · 12. Oktober 2018 um 7:58
Hallo Manfred,
das Problem konnte ich leider nicht reproduzieren, von dem her kann ich nur Vermutungen aufstellen.
Ich bin so vorgegangen (aus dem Gedächtnis):
1. Einloggen auf https://snowboy.kitt.ai/
2. Neues Hotword erstellen
3. Hotword eingeben und 3x trainieren
4. Datei herunterladen und in das Verzeichnis stt_engines/snowboy/resources/ kopieren (bei dem Schritt bin ich mir nicht mehr sicher, ich müsste es erst selber noch einmal probieren)
5. Key merken / im Jarvis eingeben
Kommt die Meldung immer noch?
Wenn Du Dich auf https://snowboy.kitt.ai/ einloggst, kannst Du rechts oben auf „Profil settings“ klicken. Dort wird Dir dann der aktuelle API-Key angezeigt. Kopiere den nochmal frisch. Wenn das auch nicht geht, dann drücke dort rechts neben den Key auf aktualisieren des Keys.
Kommt die Meldung immer noch?
Gruß Christian
Manfred K. · 15. Oktober 2018 um 18:12
Hallo Christian,
Danke für deine schnelle Antwort.
Leider konnte ich mich erst heute wieder mit dieser Sache beschäftigen.
Vorweg: Javis läuft jetzt einwandfrei im offline -Modus.
Ich habe Javis nochmal neu installiert und dabei andere Audioeinstellungen vorgenommen.
Mit dem Erfolg das dass Hotword „snowboy“ jetzt schneller und zuverlässiger erkannt wird.
Wichtig ist meiner Meinung auch das die Kommandos überall klein geschrieben werden, denn das System speichert unter – jarvis/stt_engines/snowboy/resources – die Kommandowörter in kleinen Buchstaben ab.
CS · 16. Oktober 2018 um 6:57
Hallo Manfred,
danke für die Rückmeldung. Super das es jetzt klappt.
Gruß Christian
MvR · 12. November 2018 um 15:20
Hallo Christian,
es funktioniert mit deinen perfekten Anleitungen alles bestens.
Ich möchte jetzt noch einen Schritt weiter kommen und mit einem Sprachkommando keine Audio-Ausgabe initiieren sondern das Shell-Skript /home/pi/gpio.sh aufrufen, um z.B. einen Ausgang zu schalten.
Meine Frage: wo hinterlege ich diesen Aufruf?
Gruß Manfred
MvR · 12. November 2018 um 18:24
…hat sich erledigt, hab’s im Internet gelernt.
Man gibt den vollen Pfad in den Jarvis-Kommandos ein z.B.: *licht an*== /home/pi/lampe_ein.sh
Gewusst wie ;>)
Gruß Manfred
Alexandra · 30. Januar 2019 um 10:12
Wie kann ich mit Jarvis meinen Pi steuern? Das er zum Beispiel ein Programm öffnet? Offline, natürlich. Muss man dafür ein Script schreiben? Und wenn ja, wie genau?
Gruß Alexandra
CS · 1. Februar 2019 um 7:35
Hallo Alexandra,
dafür brauchst Du ein Skript. Dieser Eintrag bei den Kommandos startet zum Beispiel ein Skript:
*Starte Skript*== /home/pi/meinscript.sh
Inhalt des Skripts könnte zum Beispiel so aussehen:
#!/bin/sh
echo „Starte Anwendung“
/home/pi/meineAnwendung
Wegen Inhalt/Aufbau und Rechte des Skripts, schau Dir bitte kurz diesen Beitrag an:
https://schmidt-feldberg.de/raspberry-pi-jarvis-automatisch-starten/
Viele Grüße
Christian
Alexandra · 5. Februar 2019 um 11:03
Funktioniert mittlerweile alles einwandfrei, danke.
Kann man Jarvis aus mehr dynamisch verwalten, weil durch die Skripte ist ja doch alles sehr statisch. Gibt es da eine Mögklichkeit?(Hab bis jetzt mal noch keine gefunden, bin aber für Ideen offen)
Jarvis ist mein Abschlussprojekt in der Schule 🙂
CS · 6. Februar 2019 um 6:06
Hallo Alexandra,
Du könntest Dir evtl. ein Skript schreiben, welches mit Parametern arbeitet. D.h. Du übergibst den Sprachbefehl in das Skript und wertest das gesprochene im Skript aus. Dann könntest Du alle Anwendungen per Sprache mit nur einem Skript starten. Das ist jetzt aber nur eine Idee. Probiere es mal aus. Über eine Rückmeldung würde ich mich natürlich freuen.
Viele Grüße
Christian
René · 8. Februar 2019 um 9:26
Hallo Christian,
vielen Dank für die super Artikel zu Jarvis. Ich konnte das System sehr gut mit deinen Anleitungen einrichten. Bei der Verwendung von Snowboy stehe ich aber noch vor ein paar dicken Fragezeichen. Was genau muss ich da trainieren: einzelne Wörter oder ganze Formulierungen? Ich habe mir bspw. das Plugin für die deutsche Wikipedia installiert. Eines der möglichen Kommandos ist da „*was ist ein (*)*“. Wie muss ich nun Snowboy trainieren, daß dieses Kommando aufgerufen wird? Erschwerend kommt da ja auch noch die Wildcard für den gesuchten Begriff dazu. Ist das mit Snowboy überhaupt möglich?
Viele Grüße,
René
CS · 8. Februar 2019 um 12:43
Hallo René,
mit dem Anlernen musst Du etwas experimentieren. Auf jeden Fall musst Du die ganze Kommandostruktur anlernen. Evtl. probierst Du auch alle Wörter zusammenzuschreiben, bei einer Rückmeldung von einem anderen Kommentator hat auch die Groß- und Kleinschreibung eine Rolle gespielt. Versuche es einfach ein bisschen. Eigentlich klappt das ganz gut.
Viele Grüße
Christian
René · 8. Februar 2019 um 22:15
Also ich hab mir das jetzt mal im Code angesehen. Mit Snowboy sollte man nicht einzelne Wörter anlernen, sondern genau die Kommandos, die man geben möchte. Platzhalter sind mit Snowball nicht möglich. Irgendeinen Begriff aus der Wikipedia abzurufen, geht also nicht.
Daher hab ich nun doch einen externen Dienst eingebunden. Da es bei Bing einen kostenlosen Key wohl inzwischen nur noch zeitlich begrenzt gibt, habe ich mich für Wit entschieden. Das funktioniert sehr gut. Aufpassen muss man bei Umlauten und Sonderzeichen in den Kommandos. Diese werden von Jarvis in ASCII umgewandelt. Aus ä wird ae, auf ß wird ss. Die Frage nach der Uhrzeit muss dann bspw. so aussehen:
*wie spaet ist es*|uhrzeit==say „es is $(date +%H) uhr $(date +%M)“
Die Groß- oder Kleinschreibung ist dagegen vollkommen egal. Vielleicht hilft das ja noch jemanden.
Viele Grüße,
René
Dirk · 9. Juni 2019 um 11:16
Hallo,
super Tutorial aber ein kleines Problem habe ich. Ich benutze die Offline Erkennung, habe daher ein Wort angelernt (licht) und unter command folgende Zeile Hinzugefügt:
*licht* == Say „Licht wird angeschaltet“
Spreche ich nun den Befehl wird folgende Meldung angezeigt:
snowboy: i did not understand licht
Frage nun was mache ich Falsch.
Dirk · 9. Juni 2019 um 11:39
OK Fehler gefunden
in der Command Liste dürfen keine Leerzeichen vor und nach dem == sein.
Aber andere Frage wie kann ich das Keyword ändern so das er auf einem anderen Namen hört?
Wie kann ich das Timeout beeinflussen?
CS · 12. Juni 2019 um 6:02
Hallo Dirk,
ich bin aktuell nicht in der Nähe des Raspis, deswegen kann ich es nicht genau sagen. Aber das Hotword/ Aktivierungswort müsste eigentlich unter Settings oder unter Commands zu finden sein.
Welchen Timeout meinst Du?
Gruß Christian
Moritz · 25. Dezember 2019 um 16:22
Hallo Christian,
danke für das deutsche Toutorial von Jarvis. Ich nutze die Offlinespracherkennung und sie funktioniert auch ganz gut.
Jetzt starte ich über Jarvis einen Webradiostream. Dadurch stürzt Jarvis nach dem Timeout ab, da das device belegt ist.
Durch einiges suchen bin ich auf die Plugins von Jarvis gestoßen, konnte aber noch keines erfolgreich betreiben. Geht das bei Offlinespracherkennung und kennst du dich da genauer aus, als nur die Installation?
Viele Grüße
Moritz
CS · 4. Januar 2020 um 9:11
Hallo Moritz,
ein paar Plugins funktionieren offline ganz gut. Allerdings gibt es auch welche die nur Online laufen, wie zum Beispiel die Wikipediaanbindung. Da muss man natürlcih online sein 😉
Du kannst mir auch gerne direkt eine Nachricht schreiben mit spzifischen Fragen. Evtl. habe ich eine Antowrt.
Viele Grüße
Christian
Markus · 5. Mai 2020 um 20:30
Hallo,
ich möchte offline arbeiten. Dazu benutze ich snowboy. Wenn ich meinen „token“ dann mal habe, war auf Anhieb nicht möglich. Aufnahme funktionierte nicht immer. Ich lerne ein Hotword (zum starten, oder? ich denke ja) und Commands, die werden in der dafür vorgesehen Liste entweder mit Sprachausgabe (dafür Svox_pico ?) oder script eingetragen und ausgeführt. Hier stehen bei mir schon französische Commands? Wann kommt das Hotword zum „Einsatz“, in starteJarvis ?
Funktioniert das Ganze auch auf Buster? Brauche ich Svox_pico und plugins auch wenn ich nur scripts ausführen möchte? Gibt es eine Sprech-Testmöglichkeit? Ich weis, viele Fragen aber kurze Antworten würden mir „mächtig“ helfen. Vielenm Dank, Markus
Markus · 24. Mai 2020 um 20:52
Hallo, es hat sich alles selbst erklärt, nachdem ich einen funktionierenden token hatte. Aber wie kann man Wörter kombinieren, z.B.: „Radio“, „TV“ oder „Licht“ dann „an“ „Lauter“ „leiser“. Gruß Markus
Jan · 8. September 2020 um 17:13
Hi CS,
Danke für deine Anleitung.
Mit den ganzen schon existierenden Projekten kann man mitlerweile doch einiges witziges anstellen.
Meine Frage wäre, ob du mit PocketSphinx erfahrungen hast.
Snowboy scheint ja mit leichten variationen in den Befehlen etwas schwierigkeiten zu haben, sowie Module wie Wikipedia.
Ist da die CMU von Sphinx evtl geeignter?
Habe mit beiden noch nicht wirklich Erfahrungen.
Vielen Dank Dir/Euch
Grüße Jan
Leon · 26. Dezember 2020 um 14:54
Hallo zusammen,
hallo CS,
dir erstmal vielen Dank für das Tutorial. Ich würde gerne meine Steckdosen über ein geschriebenes Pythonskript ausführen lassen. Kann ich dies auch mit bspw. dem Befehl „Schalte Steckdose 1 aus“ im Hintergrund ausführen lassen (also das dieser Befehl dann das dafür vorgesehende Skript ausführt?)? Oder funktioniert dies genauso wie oben in einem anderen Beitrag bereits beschrieben?
Liebe Grüße
Leon D · 26. Dezember 2020 um 14:54
Hallo zusammen,
hallo CS,
dir erstmal vielen Dank für das Tutorial. Ich würde gerne meine Steckdosen über ein geschriebenes Pythonskript ausführen lassen. Kann ich dies auch mit bspw. dem Befehl „Schalte Steckdose 1 aus“ im Hintergrund ausführen lassen (also das dieser Befehl dann das dafür vorgesehende Skript ausführt?)? Oder funktioniert dies genauso wie oben in einem anderen Beitrag bereits beschrieben?
Liebe Grüße