Jak zamienić (nie)zwykłe RaspberryPi w AWS Echo komunikujące się z otoczeniem przy użyciu modułu konwersacyjnego AWS Alexa? Jak z jej pomocą zapytać o pogodę w Londynie, poprosić o wyłączenie świateł w domu czy umówić wizytę u dentysty? Jak w paru krokach rozszerzyć Aleksę o (praktycznie) dowolne funkcjonalności? Jak sprawdzić czy słuchający nas ludzie są zadowoleni, smutni albo nie daj Boże – przerażeni? Na te i inne pytania odpowie poniższy artykuł- materiał został przedstawiony podczas październikowej konferencji DevForge w Białymstoku w ramach prelekcji „Mów do mnie jeszcze – budujemy własną AWS Alexa na Raspberry Pi”.
Kilka słów o Amazon Echo
AWS Echo to urządzenie umożliwiające obsługę głosową (którą udostępnia poprzez AWS Alexa) przydatną w codziennej pracy, rozrywce czy zwykłych domowych czynnościach ( takich jak odtwarzanie muzyki, sterowanie inteligentnym domem, umawianie spotkań, przedstawianie prognozy pogody i wiele więcej).
Czy chcielibyście mieć takie urządzenie u siebie w domu? Teraz jest to możliwe nawet bez kupowania fabrycznie nowego, lśniącego produktu Amazona. Wystarczy RaspberryPi (albo tak naprawdę zwykły komputer osobisty) i odrobina osprzętu.
Mów do mnie jeszcze – budujemy własną AWS Alexa na Raspberry Pi krok po kroku:
1. Zakładamy konto Developerskie na Amazonie
Aby zacząć pracę musimy założyć konto na stronie developer.amazon.com i zarejestrować nasze urządzenie. Cały proces jest opisany na stronie – https://github.com/alexa/avs-device-sdk/wiki/Create-Security-Profile.
Po ukończonej instrukcji powinniśmy mieć zarejestrowane nowe urządzenie;
2. Konfigurujemy malinkę
Pierwszym krokiem jest zamienienie naszej malinki w tzw. „Alexa enabled device”, czyli po prostu urządzenie, które będzie w stanie konsumować serwis Alexy i z pomocą peryferii (mikrofon i głośniki) wchodzić w interakcję z otoczeniem. W tym momencie zakładamy że skonfigurowaliście sobie OS’a na malince, np. Raspbian, więc jeśli jeszcze tego nie zrobiliście zapoznajcie się z – https://github.com/alexa/alexa-avs-sample-app/wiki/Setting-up-the-Raspberry-Pi.
Następnie musimy zainstalować SDK Alex’y na naszym Raspberrym a zrobimy to wykonując prosty tutorial z oficjalnej strony projektu – https://github.com/alexa/avs-device-sdk/wiki
Na powyższej github’owej stronie znajdziecie przewodniki do Raspberry Pi, Ubuntu, macOS, Windowsa, iOS czy Androida. Jest w czym wybierać ale my skupimy się na wersji malinowej, która jest dostępny tutaj: https://github.com/alexa/avs-device-sdk/wiki/Raspberry-Pi-Quick-Start-Guide-with-Script
Po przeprowadzeniu kroków z przewodnika Wasz sprzęt będzie gotowy do przykładowych interakcji z Alexa Voice Service. Spróbujcie, korzystając z dostarczonego Sample App, zapytać np. jaka jest teraz pogoda albo sprawdźcie jaki rezultat przyniesie pytanie – „Alexa – tell me a joke”.
3. Zbudujmy coś więcej!
Po wstępnym rozpoznaniu i zabawie z Alexa Voice Service czas na projekt nieco ambitniejszy. Czy prowadząc wykład, rozmawiając ze znajomymi albo przeglądając zdjęcia z koncertu nie byłoby ciekawie wiedzieć w jakim nastroju są słuchacze? Oczywiście że byłoby! Spróbujmy zamodelować aplikację (tzw. Alexa skill – czyli umiejętność, która rozszerza zbiór domyślnych interakcji, przygotowanych przez Amazona i nie tylko dla AVS) która automatycznie wykona zdjęcie z pomocą kamery podłączonej do RaspberryPi i przeanalizuje nastrój widowni.
Zanim przystąpimy do budowy całej architektury – zamodelujmy Alexa Skill, który będzie mógł reagować na nasze polecenie i przekazywać sterowanie dalej (np. do modułu serverless oferowanego przez AWS – czyli AWS Lambda). W tym celu ponownie logujemy się na stronie developer.amazon.com by stworzyć nowy, prosty Skill, który zareaguje na kilka fraz (pytających o nastrój widowni) i odpali Lambdę by proces obrabiania zdjęcia i publikacji wyników mógł się toczyć wedle naszego życzenia. Wyczerpujący opis jak tworzyć Skilla i podpinać go z Lambdą znajdziecie tutaj – https://developer.amazon.com/docs/custom-skills/host-a-custom-skill-as-an-aws-lambda-function.html (nie wspominając o dziesiątkach filmików na YT, gdzie prowadzący implementują własne Skille w kilka(dziesiąt) minut na żywo). Docelowo chcemy aby nasz – nazwijmy go „Check Audience Mood” Skill reagował na poniższe frazy (tutaj zwane Intentami):
Widzimy, że nasz Skill będzie reagował gdy zapytamy Alexę frazami:
- are they happy
- check mood
- are they pleased
- check audience
Polecam w tym miejscu nieco „pobawić” się Intentami, i Skillami jako takimi jako, że Amazon udostępnia bogatą dokumentację i możliwość testowania „na sucho” interakcji głosowych – bez konieczności instalowania rozwiązań na fizycznych urządzeniach.
Wracając do naszego pomysłu sprawdzania nastroju publiczności – przykładowy projekt mógłby wyglądać następująco:
Przyjrzyjmy się po kolei składowym tego rozwiązania:
1. W pierwszym kroku aktywujemy Alexę by użyła naszego Skilla, odpowiednio wywołując Intent, np. „Alexa, ask – check audience mood – are they happy?” (uzbrójmy się w cierpliwość, Alexa ma czasem problem z homonimami i nie zawsze w 100% za pierwszym razem rozpozna nasze zdanie, dodatkowo czasem może polecieć NPE z Sample App… trzeba próbować 😊 )
2. Po poprawnym rozpoznaniu Skill wywoła Lambdę, którą w nim zdefiniowaliśmy by odłożyć na kolejce SQS informację, że potrzeba nam wykonania zdjęcia kamerą.
3. Do Raspberrego mamy podpiętą kamerę, która wykonuje zdjęcia za pomocą skrytpu czekającego na wiadomość odkładaną na SQS (oczywiście można to wykonać na inne sposoby, np. otwierając tunel i „rozmawiając” z jakimś mikro-serwisem, używając ngork’a etc.) i w moim przypadku wykonuje zdjęcie korzystając z programu fswebcam, którego do wykonania zdjęcia możemy zmusić następującą linijką:
fswebcam -r 1280×720 –no-banner /home/pi/webcam/$DATE.jpg
Oczywiście DATE to zmienna która w skrypcie jest generowana by nadać zdjęciu unikalną nazwę. Wykonane foto jest następnie ładowane do bucketu na S3 (hosting plików z grubsza rzecz biorąc na AWS).
4. Obiekt zdjęcia, który wyląduje w naszym dedykowanym buckecie S3 ma zapięty trigger powodujący odpalenie się Lambdy, w której zaszyjemy większość kodu potrzebnego do obsłużenia sekwencji rozpoznawania ludzkich emocji i publikacji wyników. W skrócie:
- Obiekt zdjęcia ląduje w S3 i wywołuje automatycznie dedykowaną Lambdę
- W Lambdzie wyłuskujemy obrazek i przekazujemy go do serwisu AWS Rekognition, który zwróci nam zidentyfikowane obiekty spośród których wyciągniemy twarze i rozpoznane nastroje, przykładowy skrypt wywołujący Rekognition w Pythonie 2.7:
Następnie budujemy listę zawierającą informację o emocjach ludzi rozpoznanych przez Rekognition (serwis ten zwraca nam bogatą odpowiedź o wyłuskanych danych wraz ze stopniem „pewności” dokonanej identyfikacji)
Posiadając taką listę nie pozostaje nam nic innego niż zbudować z niej czytelny wpis, który następnie możemy opublikować, np. na twitterze (w artykule pomijam rejestrowanie developerskiego konta i konsumowanie API Twittera, nie sprawi ono jednak nikomu większych problemów).
Jesteśmy gotowi do akcji!
4. Oglądamy nasze dzieło w działaniu!
Gotowy zestaw może wyglądać podobnie do poniższego:
Wystarczy wywołać Alexę i zapytać – „Alexa, ask Check Audience Mood – are they pleased?” by po chwili na skonfigurowanym zawczasu koncie twitterowym pojawiła się wykonana fotografia wraz z analizą nastrojów załączoną jako treść:
Podsumowując – analiza zdjęć czy ich publikacja na twitterze to co prawda nie rocket science (ani brain surgery – if You know what I mean 😉) ale w przypadku implementowania tego na stacku AWS widzę dwie zasadnicze korzyści:
- Czas – całość modelowania tego PoC to nie więcej niż dwa, luźnie wieczory zabawy. Nie trzeba znać się na sieciach neuronowych by zbudować całkiem interesujące projekty w niedużym czasie (polecam porozglądać się za inspirującymi projektami publikowanymi przez rozmaitych pasjonatów!)
- Skala – Amazon w materii zasięgu dotarcia do klientów daje nam sporą przewagę, bowiem ilość partnerów technologicznych a co za tym idzie – ilość urządzeń na ilu nasze rozwiązania mogą być odpalane (inteligentne domy, samochody, wsparcie osób niepełnosprawnych i wiele innych obszarów) powodują przyjemny zawrót głowy na myśl o potencjalnych możliwościach i korzyściach
Zachęcam do samodzielnego eksperymentowania i życzę inspirującej przygody z narzędziami Amazona – twórzcie wspaniałe rzeczy!