Eine Sprachsteuerung für den Magic Mirror

Sprachsteuerung mit Amazon Alexa, Intel Movidius und einem Raspberry Pi

Der Anlass

Im Rahmen unseres "Tags der offenen Tür" hatten wir uns vorgenommen, das Thema Sprachsteuerung möglichst anschaulich zu präsentieren. Aus unserer Sicht war
ein "MAGIC MIRROR" - basierend auf der Idee von Michael Teeuw dafür besonders geeignet.

Unser Magic Mirror sollte sich durch verschiedene Technologien und Anforderungen von den normalen Magic Mirror abheben:

  • Eine (ausnahmsweise) cloud-basierte Spracherkennung mit Informationswiedergabe in Echtzeit
  • Maschinelles Lernen
  • Neuronale Netze
  • Echtzeit-Bilderkennung mit Hilfe von künstlicher Intelligenz
  • Informationsanzeige (z. B. Wetter, Kalendereinträge, aktuelle Nachrichten)

Alle notwendigen Komponenten sollten in einem Gehäuse verbaut werden. Der Magic Mirror  sollte in der Lage sein, mit dem Anwender zu sprechen und auch Bilder zu erkennen (z. B. in dieser Art: "Was ist das, was ich in der Hand habe?" - Antwort: "Das ist ein Fahrrad").

Wir entschieden uns schlussendlich für folgende Komponenten:

  • Cloud-basierte Spracherkennung Amazon Alexa
  • Raspberry Pi, verbunden mit einem Display hinter einem semi-transparenten Spiegel
  • Mikrofon zur Übertragung des Audioinputs an Alexa im Hintergrund
  • Kamera für die Objekterkennung (sobald eine Person vor den Magic Mirror tritt, wird diese erkannt und der Bildschirm eingeschalten)

 

Alexa Skill, Sprachsteuerung und Netzwerkverbindungen

Den Alexa Skill haben wir auf dem üblichen Weg definiert:

Wir wählten zunächst eine Wake-Up-Phrase und passende Beispielsätze aus, die unser Spiegel standardmäßig anzeigen sollte.

Dann definierten wir Use-Cases für unseren Magic Mirror. Er sollte z. B.:

  • Selfies aufnehmen und diese anschließend an einen Kollegen via Email senden (es ist ein Spiegel, es gibt eine Kamera: der perfekte Use-Case)
  • Sagen, was sich vor dem Spiegel befindet (Objekterkennung)
  • Die Hardware steuern (z.B. Herunterfahren, Neustarten). Diese Funktionen sollten natürlich per Sprachsteuerung bedienbar sein.

Der Skill sollte auf einem Server laufen, welcher durch Alexa bei jeder Nutzeranfrage kontaktiert wird. Amazon bietet diverse Wege an, diese Skills zu hosten, z.B. Amazon Lambda Funktionen oder die neueren Alexa-Hosted Skills. Beide dieser Methoden sind leicht einzurichten und kostenfrei nutzbar. Aber unsere Anwendung brauchte eine Eingabe von der Objekterkennung, welche auf dem Gerät selbst lief. Da wir eine Anwendung benötigten, welche diese Informationen an den Skill weiterleitet, entschieden wir uns, den gesamten Server auf dem Raspberry Pi bereitzustellen. Wir erstellten den Skill in JavaScript und installierten den nginx Server.

Nun konnte Alexa den Raspberry Pi direkt kontaktieren und die notwendigen Informationen erhalten. Hierfür benötigte es nur dessen IP Adresse. In unserem Fall sollte der Magic Mirror in jedem Haushalt aufgestellt und mit dessen WLAN verbunden werden können. Die neu zugewiesene IP Adresse musste Alexa dementsprechend bekannt sein.
Dies erreichten wir, in dem wir "ngrok" nutzten, einen Service der "Tunnel zu localhost" bereitstellt. Dieser stellte uns eine URL auf deren Domain bereit, die jederzeit auf unsere Plattform verwies, wo auch immer sich das Gerät befand. Eine Herausforderung dabei war, dass die kostenfreie Version von ngrok nach einem Neustart nicht die gleiche URL verwendete und wir somit die Skill-Einstellungen nach jedem Neustart neu anpassen mussten. Dieses Problem lies sich mit wenigen Zeilen Code lösen - während des Startvorgangs wurden nun die Skilleinstellungen immer aktualisiert. Alle anderen Anbieter, welche wir testeten, waren für unsere Anforderungen nicht ausreichend zuverlässig.

Anstatt den gesamten Code selbst zu schreiben, entschieden wir uns bei dem Skill dafür, das Jovo Framework zu nutzen. Hierbei handelt es sich um ein Framework, das es ermöglicht, Skills zu programmieren, die sowohl mit Alexa als auch mit Google's Assistent kompatibel sind.

Nachdem der Skill erstellt war, musste eine Alexa Client Anwendung eingerichtet werden. Hätten wir Amazon's Echo genutzt wäre diese Funktion bereits inkludiert gewesen, aber da wir unsere eigene Hardware verwenden wollten, brauchten wir eine Komponente, die das Mikrofonsignal an Alexa streamen würde. Auch die Wake-Up-Phrase sollte auf der Hardware erkannt werden, also bestand der Bedarf nach einem lokalen Spracherkenner, der nur für die Erkennung einer einzelnen Phrase zuständig sei. Hatte dieser "einfache" Spracherkenner die Phrase ("Alexa") erkannt, wurde das Eingangssignal des Mikrofons an Alexa gesendet. Glücklicherweise hat Amazon bereits solche Beispielapplikationen veröffentlicht. Die Zeiten, in denen wir reine HTTP/2 Verbindungen (mit mehreren Streams) selbst implementieren mussten, gehören der Vergangenheit an. Zuerst richteten wir die Java-Beispielapplikation ein, stießen dabei aber auf einige Herausforderungen wie z.B. Verbindungsunterbrechungen aus unerklärlichen Gründen. Am Ende nutzten wir die neu-erschienene SDK Applikation, welche problemlos lief (bis auf einen Fehler, durch den sie sich selbst unterbrach, wenn sie ein Wort aussprach, das "Alexa" beinhaltete. Z.B. wenn sie sagte "Ok, ich sende dein Selfie an Alexander" erkannte sie "Alexa" in "Alexander" und begann von neuem zuzuhören. Aber nehmen wir der Einfachheit halber an, dass unsere Besucher vorerst keine Selfies an Alexander senden möchte und wir daher das Thema Rückkopplungen aufschieben können.)

 

Objekterkennung, Deep Neural Networks und Intel Neural Compute Stick

Die Idee hinter diesem Arbeitspaket war einfach:

  • Nutzung des Eingangssignals der Raspberry PI Kamera und Erkennen der Hauptobjekte im Fokus
  • Auf die Frage des Nutzers nach einer Objektklassifizierung sollten die erkannten Objekte benannt werden

Objekterkennung ist bereits ein gut erforschtes Feld mit vielen verfügbaren Trainingsbibliotheken und vor-trainierten Modellen, die zu meist auf Deep Neural Networks (DNN) basiert sind.

Es stellte sich heraus, dass die Objekterkennung auch nützlich zum Energiesparen war: Mikrofon und Display wurden nur aktiviert, wenn eine Person vor dem Magic Mirror stand.

Wir entschieden uns vor-trainierte Modelle zur Objekterkennung zu verwenden. Hierfür gibt es eine große Auswahl von frei verfügbaren Modellen, die auf verschiedene Objektgruppen trainiert sind und in verschiedenen Komplexitäten vorliegen. Da wir sie auf einem Raspberry PI laufen lassen wollten, benötigten wir lediglich die einfachsten Modelle. Doch unabhängig davon, wie klein und einfach die Modelle waren, konnten wir keine akzeptablen Erkennungsgeschwindigkeiten erreichen. Es dauerte immer ein paar Sekunden pro Kamera-Frame, was eine bemerkenswerte Verzögerung bedeutete. Man sollte beachten, dass zusammen mit dieser Objekterkennung eine Kommunikation mit dem Alexa Server stattfand, was zusätzlich einen Bruchteil einer Sekunde dauerte (und dieser Skill Server lief einem Raspberry Pi mit WLAN-Verbindung - nicht die schnellste Konstellation...).

Wir benötigten einen Weg, um die Objekterkennung zu beschleunigen ohne gleichzeitig die Genauigkeit zu verlieren. Hierbei kam uns der Intel (Movidius) Neural Compute Stick (NCS) zur Hilfe. Er beschleunigte die Erkennung bemerkenswert und machte die Verzögerung nun absolut akzeptabel.

Allerdings ist der NCS nicht vollkommen reibungslos einzurichten, wie Rosebrock später bemerkte:

"The install process is not entirely isolated and can/will change existing libraries on your system."

Wir folgten dennoch der ursprünglichen Anleitung, was für unsere Anwendung ausreichend gut funktioniert hat.

Selfies via E-mail versenden

Ein Selfie aufzunehmen, war ganz unkompliziert. Wir  übertrugen das Kamerabild  an unseren Mailserver. Wichtig war uns jedoch zusätzlich, dass der Magic Mirror das erfolgreiche Senden des Selfies bestätigte. Dies war jedoch nicht ganz so einfach - es stellte sich heraus, dass unser Mail Server nicht immer sofort den Versand quittierte. Und Alexas Skills haben einen Timeout bis zu welchem der Skill geantwortet haben muss, ansonsten wird der Nutzer informiert, dass etwas nicht stimmt. Dieser Timeout war etwas, was wir nicht in Betracht gezogen hatten (und ehrlicherweise auch nicht kannten, da die meisten unserer Skills nahezu unverzüglich eine Antwort lieferten).

Eine andere Sache, die wir ebenfalls zunächst nicht bedacht hatten: wenn eine Person sich selbst im Spiegel sehen kann, muss dies nicht automatisch heißen, dass auch umgekehrt der Spiegel die Person sehen kann.  Hier half uns eine Kameralinse mit einer geringeren Brennweite weiter.

Magic Mirror

Für die Darstellung von Nachrichten auf dem Display, nutzten wir die "Magic Mirror" Software. Die Applikation ist in der Lage, verschiedene Arten von Informationen abzubilden. Sie verfügt über eine große Auswahl an personalisierbaren Erweiterungen. Wir entschieden uns für einen persönlichen Kalender, die lokalen Nachrichten und eine örtliche Wettervorhersage.

Die Hardware: ein überhitzter Raspberry PI

Zum Abschluss mussten wir noch eine Herausforderung bewältigen: all die genannten Komponenten liefen zusammen und ihre Temperatur wurde mittels eines roten Thermometers auf dem Bildschirm dargestellt.

Wir befanden uns im schlimmsten Fall bei 85 °C. Bei dieser Temperatur begann der Prozessor zu drosseln. Beides war für unseren sprechenden Spiegel von Nachteil: die konstant hohen Temperaturen konnten der Hardware schaden, das Drosseln verringerte die Performance. Dabei waren wir bereits am Limit der akzeptablen Verzögerungen.

Hier kamen unsere Kollegen aus der Hardware-Entwicklung ins Spiel. Zuerst fanden wir heraus, dass unser Lager keine große Auswahl an Kühlkörpern offenbarte, da unsere eigenen Boards nie solche hohen Temperaturen erreichen.

Wir recherchierten im Internet und fanden mit "ExplainingComputer" ein sehr informatives Video zur Montage von passiven Kühlern und den erzielbaren Temperaturunterschieden. Aufgrund der dafür nötigen, aufwändigen Arbeiten, entschieden wir uns für eine ganz simple Lösung: Thermalklebeband und ein kleinen Kühlkörper führten zum vergleichbaren Performancegewinn.

Als der Rahmen konzipiert wurde hatten wir die Wärmethematik nicht in Betracht gezogen, was dazu führte, dass die Luft nicht gut genug um den Kühlkörper zirkulieren konnte. Glücklicherweise konnten wir einen kleinen, nahezu nicht hörbaren Lüfter finden, welcher die warme Luft aus dem Holzrahmen nach außen befördern konnte. Dieser konnte direkt an die GPIOs des Raspberry Pi angeschlossen werden.

 

Das Resultat

Es ist uns pünktlich gelungen, trotz einiger Trial & Error-Phasen alle Features auf einem kleinen Raspberry PI zum Laufen zu bringen. Der sprechende Spiegel kam bei unseren Besuchern ausgezeichnet an und war den ganzen Tag "gefragt".

Einen Kommentar schreiben

Bitte rechnen Sie 7 plus 1.

Zurück

Weitere Blogbeiträge

Bauanleitung für einen Dart-Scorer

Projektarbeiten im Rahmen des Dualen Studiums für Informationstechnik können mitunter ganz kurzweilig und praxisnah sein. Warum nicht mal Hobby und Studium vereinen? Lesen Sie in unserem Blogbeitrag, wie man mit einfachen Mitteln einen Dart-Scorer baut.

Akustische Echokompensation (AEC)

Sie führen ein Telefonat oder eine Unterhaltung über eine Gegensprechstelle - und hören sich dabei mit einer kleinen Verzögerung selbst aus dem Lautsprecher. Das Echo führt dazu, dass die Verständigung zunehmend schwieriger wird oder das Gespräch mitunter ins Stocken gerät. Wie lässt sich dieses Problem lösen?

 

Eine Sprachsteuerung für den Magic Mirror

Zum Tag der offenen Tür präsentierten wir unseren Besuchern etwas ganz Besonderes: einen "Magic Mirror" mit einer Sprachsteuerung von Amazon Alexa und einem Raspberry Pi. Lesen Sie mehr darüber in unserer Bauanleitung.

Fragen?

+49 351 40752650
E-Mail senden