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:
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:
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.:
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.)
Die Idee hinter diesem Arbeitspaket war einfach:
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.
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.
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.
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.
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".
Tipps aus der Praxis
Um Mikrofone und Lautsprecher optimal zu verbauen, gibt es einiges zu beachten. Wie sucht man die richtigen aus? Was muss bei der Platzierung berücksichtigt werden? Unser Blogbeitrag gibt Antwort auf diese Fragen.
Weiterlesen Montage von Mikrofonen und Lautsprechern in Intercomsystemen
Jeder kann ein Notrufsystem aus nur drei Bausteinen konfigurieren. Erfahren Sie in unserem Blogbeitrag, wie das geht.
Präzise Messungen und wirksame Störgeräuschisolation
MEMS Mikrofonmodule sind aus der modernen Audiotechnologie nicht mehr wegzudenken. Sie finden Anwendung in Smartphones, Wearables oder IoT-Geräten. Wie prüft man am besten Qualität und Zuverlässigkeit dieser Mikrofone? Lesen Sie dazu unseren Fachbeitrag.
+49 351 40752650
E-Mail senden
Einen Kommentar schreiben