DIY Sprachsteuerung (fast) komplett offline
Nach langer Zeit endlich mal wieder ein Post ;) Und heute geht es um … genau, eine Sprachsteuerung à la Alexa & Co., nur Marke Eigenbau und (fast) komplett offline.
Warum das ganze?
Nun, Ende letzten Jahres gab es auf den einschlaegigen Fach-Sites einen Artikel ueber den Kollegen Zuckerberg und sein „100-Tage“-Projekt: er hat in 100 Tagen Arbeit seine eigene KI fuer sein Haus programmiert, inkl. Sprachsteuerung. Ok, „eigene KI“ ist etwas uebertrieben, natuerlich kann er auf die ganzen Facebook-Ressourcen zurueckgreifen. Aber egal, nettes Projekt … das kann ich doch auch ;) Zugegeben: ich nutze Teile bestehende OpenSource-Projekte um alles zu erreichen, eine echte „KI“ hab ich nicht integriert (spaeter mehr dazu), aber es funktioniert … zumindest fuer meine Anwendungsfaelle.
Die Herausforderung:
Sprachassistenten und „KI“-Dienste gibt es mittlerweile ja einige, sogar kostenlos (siehe api.ai, wit.ai …). Selbst komplett fertige Systeme wie Jasper oder Mycroft kann man sich einfach herunterladen und installieren. Ich persoenlich habe mit diesen Loesungen allerdings ein paar … Probleme: zum einen mag ich meine (Sprach-)Daten nicht unbedingt Google, Facebook, Amazon oder sonst wem in den Rachen werfen. Z.T. sind die Nutzungsbedienungen echt haarstraeubend, ich mag es lieber offline und unter meiner Kontrolle. Zum anderen haben die fertigen Systeme eine grossen Nachteil: sie sind sehr unflexibel und nur als standalone-Loesung zu gebrauchen, ich haette aber gerne eine Client-/Server-Struktur.
Also hab ich mich Anfang des Jahres hingesetzt und angefangen, mein eigenes System zu programmieren. Anfangs in Ruby … allerdings kam ich schnell zu der Ueberzeugung, dass Python hier doch eher das Mittel der Wahl ist. Natuerlich kann ich kein Python, und was bietet sich besser zum Lernen als so ein Projekt ;)
Hey Sarah!
Das „Projekt“ hoert bei mir auf den Working Title „Sarah“, frei nach dem Namen der KI einer Serie ;) Aufgeteilt ist „Sarah“ in folgende Komponenten:
* Client-Connectors, die einen rein textlichen Input liefern (aktuell XMPP und IRC)
* Skills, die „KI“
* Logik, die von den Skills getriggert wird
* STT, Umwandlung von Sprache in Text
* TTS, Umwandlung von Text in Sprache
* Speech Input
Die Kommunikation der einzelnen Komponenten untereinander erfolgt per MQTT. Die ausfuehrende „Logik“ uebernimmt Node-RED. Alle Komponenten laufen zusammen in einer Linux-VM, mit Ausnahme des Speech Input natuerlich. Hierfuer nutze ich einen Pi 2 mit einem USB-Mikrofon (Jabra SPEAK 410).
Ich habe mich auch bewusst fuer die Moeglichkeit eines reinen Text-Inputs entschieden … zum einen um mir fuer Tests nicht den Mund fusselig reden zu muessen, zum anderen kann ein „stiller“ Input auch mal praktisch sein. Und ja, man kann Sarah auch von unterwegs per Sprache steuern! Dafuer gibt es extra einen Websocket-Listener an den Sprache von einem Smartphone aus uebertragen werden kann (VPN vorausgesetzt).
Die „stationaere“ Sprachsteuerung per Pi und Mikrofon erfolgt per Hotword-Erkennung mit pocketsphinx lokal auf dem Pi, der anschliessende Input wird lokal aufgezeichnet und dann per MQTT an die STT-Komponente uebergeben. Bei einer Steuerung per Smartphone entfaellt das Hotword (man muss nur einen Button druecken), und der Befehlt wird ueber den Websocket gestreamt. Das spart enorm Zeit, da nicht erst aufgenommen und dann die Datei uebertragen werden muss.
Die Spracherkennung ist aktuell noch der Teil des ganzen Projektes, der am meisten Arbeit macht. Fuer die Entwicklung greife ich tatsaechlich noch auf den Service von wit.ai zurueck, da das Training der lokalen Software (pocketsphinx bzw. kaldi) doch sehr aufwaendig und zeitintensiv ist. Nach meinen Tests werde ich wohl zur Spracherkennung eher kaldi + gstreamer nutzen, hier ist die Erkennung wesentlich besser als bei pocketsphinx. Allerdings werden dafuer auch wesentlich mehr Ressourcen benoetigt, auf einem Pi oder einer kleinen VM mit weniger als 4GB RAM kommt man nicht weit.
Fuer die Skills habe ich mich bei Mycroft bedient: deren „KI“ ist als eigenstaendiges OpenSource-Projekt (Mycroft Adapt) verfuegbar. Im Prinzip ist das ganze nichts weiter als ein besserer Text-Parser: anhand von unterschiedlichen Keywords oder regular expressions, die dann als „zwingend“ oder „optional“ gekennzeichnet werden, wird der eingegebene Text ausgewertet und der evtl. vorhandene Match eines Skills zurueckgeliefert. Simpler Ansatz, aber er funktioniert. Das Ergebnis wird aktuell per MQTT an die „Logik“ uebergeben, man koennte aber auch direkt per Callback im Skill-Code etwas ausfuehren.
Ich hatte kurz spaCy rumprobiert um eine „echte“ KI zu integrieren, allerdings fehlen mir dazu schlichtweg die Resourcen ;) Theoretisch koennte man mit spaCy und TensorFlow sowohl STT als auch die KI programmieren … wenn man denn genug Power hat.
Die Logik hinter den Skills wird ganz „banal“ mit Node-RED realisiert, je nach erkanntem Skill wird ein Flow ausgefuert. Derzeit habe ich z.B. eine Abfrage an OpenWeatherMap drin, meine Homematic Komponenten (Heizung, Licht, Rollaeden), meinen SAT-Receiver und ein paar „persoenliche“ Interaktionen fuer Sarah.
Sobald die Logik abgearbeitet wurde erfolgt eine Ausgabe ueber den jeweiligen Client der die Eingabe getaetigt hat. Sofern die Eingab per Sprache kam erfolgt die Ausgabe natuerlich auch wieder als Sprache (entweder offline per MaryTTS oder online mit ivona, wenn man denn noch einen Developer-Account hat).
Soweit, so gut. Das ganze Projekt ist aktuell im „works-for-me“-Status … sowohl vom Funktionsumfang, als auch von der Code-Qualitaet. Die groessten Probleme, bzw. Huerden, sind noch bei der Spracherkennung. Es fehlt einfach an einem Mikrofon-Array wie z.B. Alexa es nutzt. Das Jabra ist zwar ok auf kurze/mittlere Entfernung, aber ab mehreren Metern muss doch etwas lauter werden. Ein weiteres Problem sind Umgebungsgeraeusche … ich weiss nicht wie gut Alexa mit der Erkennung ist wenn sich mehrere Leute unterhalten, aber bei Sarah ist das fast aussichtslos. Genauso die Umwandlung von Sprache in Text … hier hat man lokal laengst nicht die Qualitaet wie bei den grossen Online-Services, zumindest nicht ohne viel Arbeit und Rechenpower. Aber man hat zumindest die Moeglichkeit alles lokal zu betreiben … und Sarah kann auch Werte auslesen und wiedergeben, das kann Alexa aktuell (noch) nicht ;)
Hallo ich finde dein Projekt sehr intressant und würde es gerne bei meinen Ideen mit Einbinden, was ich jedoch Brauch ist Sprache zu MQTT und von daus geht es dann zur WAGO SPS bzw zum Adruino NANO für IR Anbindung für HeimKino und co.
Das finde ich äußerst interessant und bin auch in die Richtung interessiert selbst so etwas zu realisieren. Ich bin noch nicht ganz sicher in wie weit ich meine KI bzw. AI integriere oder für den Anfang nicht einfach mit einer Standard Grammar arbeite, die aus Befehlen Ausführungen macht. Es wäre cool mehr davon zu erfahren und wie es heute so aussieht :)
Auf jedenfall ein gutes Projekt und weiterhin viel Erfolg :D