Spisu treści:
- Krok 1: Tło
- Krok 2: Zarejestruj gadżet w konsoli programisty usługi Alexa Voice Service
- Krok 3: Utwórz funkcję AWS Lambda i niestandardową umiejętność
- Krok 4: Skonfiguruj kod na swoim Raspberry Pi
- Krok 5: Podsumowanie
Wideo: Dodaj niestandardową kontrolę Alexa do projektu Raspberry Pi: 5 kroków
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:29
Ten projekt jest przeznaczony dla każdego, kto ma projekt Raspberry Pi używający Pythona, który chce dodać sterowanie głosowe za pośrednictwem istniejących urządzeń Amazon Echo. Nie musisz być doświadczonym programistą, ale powinieneś swobodnie korzystać z wiersza poleceń i dostosowywać istniejący kod do swoich potrzeb.
Początkowo zacząłem projekt, aby umożliwić sterowanie głosem mojego Raspberry Pi za pomocą Alexy, aby mógł podgrzać wodę w czajniku do określonej temperatury. Chociaż interakcja, której chciałem, była dość prosta (przekaż jeden numer z Alexy do Raspberry Pi), zajęło mi dużo pracy, aby uzyskać ten stan z istniejących samouczków. Mam nadzieję, że ten samouczek sprawi, że ten proces będzie jak najszybszy dla innych.
W moim przykładzie zaczynam od Raspberry Pi Zero W z Raspbianem. Mam program Python3 na moim Pi, który jest w stanie zapisywać tekst na wyświetlaczu SPI, i mam sondę termometru, którą mogę odczytać. Dla ciebie ten program może być prawie wszystkim, ale pomysł jest taki, że możesz mieć urządzenia wejściowe, które chcesz czytać za pośrednictwem Alexy i/lub niektóre urządzenia wyjściowe, którymi chcesz sterować za pomocą Alexy.
Celem jest przejście z podstawowego programu, takiego jak ten opisany powyżej, do urządzenia, którym można łatwo sterować za pomocą mojego Echo. Zakładając, że masz już ten sprzęt, ten projekt nie powinien Cię kosztować. W końcu dojdziesz do momentu, w którym będziesz mógł powiedzieć takie rzeczy jak:
Ja: „Alexa, poproś mój gadżet o sprawdzenie temperatury na czujniku 1.”
Odpowiedź Alexy: „Sonda odczytuje 72,31 stopnia”.
lub
Ja: „Alexa, powiedz mojemu gadżetowi, żeby napisał George Washington”
Odpowiedź: Wyświetlacz podłączony do mojego Raspberry Pi wyświetla teraz „George Washington”
W następnej sekcji opiszę, co musi się wydarzyć za kulisami, aby to zadziałało. Jeśli chcesz, aby to zadziałało w swoim projekcie i nie obchodzi Cię, jak to działa, możesz to pominąć (chociaż może to utrudnić, jeśli coś pójdzie nie tak).
Krok 1: Tło
Na tym obrazie (kredyt: https://developer.amazon.com/en-US/docs/alexa/alex… widzimy ogólną architekturę gadżetów Alexa.
Kiedy mówisz coś do urządzenia Echo, wysyła ono dźwięk do chmury Alexa, gdzie jest przetwarzany i gdzie generowana jest odpowiedź, aby odpowiedzieć. Kiedy pytasz, jaka jest pogoda, komunikują się tylko te dwie osoby. Załóżmy teraz, że chcesz dodać sterowanie głosowe do jednego ze swoich małych projektów na Raspberry Pi. Przetwarzanie wszystkiego na pokładzie wymagałoby znacznego sprzętu i bardzo wyrafinowanej bazy kodu, aby wszystko działało. Lepszym rozwiązaniem byłoby wykorzystanie chmury Alexa, która jest bardzo wyrafinowana i bardzo dobrze radzi sobie ze złożonymi wzorcami mowy. Gadżety Alexa zapewniają dobry sposób, aby to zrobić.
Gadżet Alexa komunikuje się z urządzeniem Echo za pomocą bluetooth. Po nawiązaniu tego połączenia oba przekazują sobie nawzajem komunikaty przy użyciu kodowania UTF-8. Kiedy Echo przekazuje coś do gadżetu, nazywa się to dyrektywą. Drugi kierunek nazywany jest wydarzeniem. Zanim przejdziemy do dokładnego przebiegu tego wszystkiego, powinniśmy wprowadzić kolejny kluczowy element: niestandardowe umiejętności Alexa.
Alexa pozwala programistom tworzyć własne niestandardowe umiejętności, co pozwala im projektować własne interakcje i zachowania do użytku na wszystkich urządzeniach Echo. Na przykład programista może stworzyć niestandardową umiejętność informującą o odległości między dwoma lotniskami w USA. Użytkownik powiedziałby: „Alexa, zapytaj mój niestandardowy kalkulator odległości, jaka jest odległość między LAX a JFK”, a może odpowiedzieć „2475 mil”. Jak to się robi? Kiedy programista tworzy niestandardową umiejętność, definiuje tak zwane „intencje niestandardowe” z „przykładowymi wypowiedziami” zawierającymi „sloty”. Na przykład w tej umiejętności mogę mieć zamiar "calc_dist", aby obliczyć odległość między dwoma punktami. Przykładowa wypowiedź brzmi: „jaka jest odległość między {slot1} a {slot2}” lub „jak daleko między {slot1} a {slot2}”. Szczeliny pokazane w nawiasach mają określone typy. W tym przypadku będą to kody lotnisk takie jak LAX, JFK, BOS, ATL. Gdy użytkownik prosi o niestandardową umiejętność, Alexa Cloud próbuje dopasować to, co mówi użytkownik, do niestandardowej intencji, korzystając z dostarczonych przykładowych wyrażeń i próbuje znaleźć prawidłowe wartości slotów dla tego żądania. W tym przykładzie okazałoby się, że użytkownik chciał mieć intencję „calc_dist” i że slot1 to LAX, a slot2 to JFK. W tym momencie Alexa Cloud przekazuje pracę własnemu kodowi programisty. Zasadniczo mówi programistom, jakie intencje otrzymali i jakie były wszystkie wartości slotów, między innymi.
Deweloper może zdecydować, gdzie znajduje się jego kod, ale bardzo popularną opcją jest użycie funkcji AWS Lambda. Jeśli nie wiesz, co to jest, jest to zasadniczo usługa, która pozwala przesłać kod, który można uruchomić w dowolnym momencie, a następnie pobiera opłatę tylko za czas uruchomienia kodu. Jeśli będziemy kontynuować nasz przykład, kod programisty może być funkcją Pythona, która odbiera dwa kody lotnisk, wyszukuje ich lokalizacje, oblicza odległości, a następnie wysyła odpowiedź z powrotem do Alexa Cloud, aby przekazać coś użytkownikowi. Alexa Cloud wysyłała następnie te informacje o mowie z powrotem do urządzenia użytkownika, a oni otrzymywali odpowiedź.
Teraz możemy wrócić do gadżetu. Możemy tworzyć niestandardowe umiejętności, które są zaprojektowane do pracy z gadżetami. Programista może napisać umiejętność, która wysyła dyrektywę do podłączonego gadżetu. Ta dyrektywa ma ładunek, którego można użyć, jednak jest to potrzebne gadżetowi. Ta umiejętność może również wysłać polecenie, a następnie nasłuchiwać zdarzenia z gadżetu, aby kod umiejętności miał dostęp do informacji wysyłanych z gadżetu.
Ustanowienie tego przepływu pozwala stworzyć bardzo potężne narzędzie, ponieważ niedrogie gadżety mogą komunikować się z kodem w chmurze i reagować na polecenia głosowe przy użyciu jednych z najlepszych dostępnych funkcji rozpoznawania głosu.
Należy zauważyć, że większość umiejętności pozwala na różne sposoby interakcji z nimi. Na przykład użytkownik może od razu przejść do intencji, mówiąc „Alexa, zapytaj mój niestandardowy kalkulator odległości, jaka jest odległość między LAX a JFK” (nazywane jednorazowym wywołaniem) lub może po prostu użyć intencji uruchomienia: „Alexa, otwórz mój niestandardowy kalkulator odległości . Po tym ostatnim przykładzie Alexa odpowiada, prosząc o więcej informacji. Ten samouczek celowo pomija obsługę tego drugiego. Mówiąc dokładniej, bez modyfikowania funkcji Lambda, można wywołać umiejętność tylko za pomocą jednokrotnego wywołania. Ten wybór projektu sprawia, że model jest prostszy (nie musi obsługiwać intencji uruchamiania ani przepływu konwersacji) i stwierdziłem, że zwykle i tak chcę wchodzić w interakcję z moimi gadżetami za pomocą wywołań jednorazowych, ponieważ są one zwykle szybsze.
Krok 2: Zarejestruj gadżet w konsoli programisty usługi Alexa Voice Service
Poniżej znajduje się opis niezbędnych kroków. Stworzyłem równoważny film, który pokazuje, jak wykonać wszystkie te kroki. Aby ukończyć ten krok, możesz użyć jednego lub obu.
- Przejdź do
- Jeśli nie masz jeszcze darmowego konta, załóż je
- Kliknij "Produkty"
- Wypełnij etykiety i wybierz „Alexa Gadget”
- Wypełnij co chcesz w pozostałych polach
- Kliknij Zakończ
Krok 3: Utwórz funkcję AWS Lambda i niestandardową umiejętność
Twórz niestandardowe umiejętności w konsoli programisty Alexa Skills Kit
Kod do tego samouczka można znaleźć tutaj
Przed wykonaniem tego kroku musisz utworzyć plik.zip, który zawiera pakiet wdrożeniowy dla funkcji AWS Lambda, jak pokazano w samouczku tutaj.
- Pobierz folder "lambda" z mojego Github, który zawiera "lambda_function.py" i "requirements.txt"
- Otwórz terminal i zmień bieżący katalog, aby znajdował się w tym folderze.
- Uruchom następującą sekwencję:
pip install -r wymagania.txt -t skill_env
cp lambda_function.py skill_env cd skill_env zip -r../../skill-code.zip
Twój plik.zip będzie teraz znajdował się w katalogu, w którym znajdował się folder lambda i będzie nosił nazwę „skill-code.zip”.
Uwaga na temat kosztów hostingu na AWS: Ten samouczek wymaga posiadania konta AWS (do utworzenia za darmo). Funkcje lambda kosztują, jednak ich aktualna cena w regionie N. Virginia wynosi 0,000000208 USD za 100 ms użycia przy 128 MB pamięci. Dla porównania, każde wywołanie moich umiejętności kosztuje około 800 ms użytkowania na tym poziomie. Aby zebrać rachunek w wysokości 1,00 USD, musiałbyś wywołać tę funkcję około 600 000 razy, co (jeśli zajmuje ci to 5 sekund na wywołanie) zajęłoby ci ponad 34 dni ciągłego wywoływania funkcji. Koszt nie powinien być znaczącym problemem, chyba że opublikujesz swoje umiejętności i ogromna liczba osób zacznie z nich korzystać. Jeśli martwisz się o rachunki za AWS, rozważ ustawienie alarmów użytkowania, które informują Cię, jeśli użycie przekroczy określony próg.
Poniżej znajduje się opis niezbędnych kroków. Stworzyłem równoważny film, który pokazuje, jak wykonać wszystkie te kroki. Możesz użyć jednego lub obu, aby ukończyć ten krok.
- Wejdź na https://aws.amazon.com/ i zaloguj się do konsoli lub utwórz darmowe konto, jeśli go nie masz
- Wyszukaj i kliknij Lambda pod usługami
- Kliknij „Utwórz funkcję”
- Wybierz „Autor od podstaw”, nadaj mu nazwę i wybierz najnowszą wersję Pythona 3 do uruchomienia
- Zmień „edytuj kod inline” na „prześlij plik.zip” i wybierz plik.zip utworzony powyżej
- W nowym oknie przejdź do https://developer.amazon.com/alexa/console/ask i zaloguj się
- Kliknij „Utwórz umiejętność”
- Oznacz go, wybierz model „Niestandardowy” i „Dostarcz własny” i kliknij „Utwórz umiejętność”
- Kliknij „Rozpocznij od podstaw” i kliknij „Wybierz”
- W sekcji „Intencje” kliknij „Dodaj”.
- Utwórz niestandardową intencję o nazwie „alexa_to_pi” i wypełnij „write {person}” jako przykładową wypowiedź
- Utwórz boks intencji o nazwie „osoba” z typem „AMAZON. Person”
- Utwórz własną intencję o nazwie "pi_to_alexa" i wypełnij "sprawdź temperaturę z czujnika {sensor_num}
- Utwórz boks intencji o nazwie „sensor_num” z typem „AMAZON. NUMBER”
- W obszarze Interfejsy włącz „Niestandardowy kontroler interfejsu”
- W punkcie końcowym wybierz „AWS Lambda ARN” i skopiuj „Twój identyfikator umiejętności”
- Wróć do konsoli AWS
- Kliknij „Dodaj wyzwalacz”
- Wybierz „Alexa Skills Kit”, zaznacz „Włącz” w obszarze weryfikacji identyfikatora umiejętności, wklej właśnie skopiowany identyfikator umiejętności i kliknij dodaj
- Skopiuj Lambda ARN w prawym górnym rogu
- Przejdź z powrotem do konsoli programisty Alexa i wklej Lambda ARN w polu „Region domyślny”
- W sekcji Inwokacja ustaw nazwę wywołania umiejętności na „mój gadżet”
- Kliknij „Zapisz model”, a następnie „Zbuduj model”
- Kliknij „Test” w górnych zakładkach i zmień selektor z „Wyłącz” na „Rozwój”
- Zauważ, że logi dla funkcji Lambda znajdują się w usłudze „CloudWatch” na AWS.
Krok 4: Skonfiguruj kod na swoim Raspberry Pi
Aby Twoje Raspberry Pi mogło komunikować się z urządzeniem Alexa, potrzebuje trochę kodu, aby ułatwić przekazywanie informacji przez bluetooth i utrzymywanie tego połączenia, oprócz kilku innych plików. Najłatwiejszym sposobem na rozpoczęcie korzystania z najbardziej aktualnych plików z Amazon jest sklonowanie repozytorium gadżetów Raspberry Pi. Przejdź do katalogu bieżącego projektu i uruchom
git klon
Spowoduje to załadowanie całego ich repozytorium z całym niezbędnym kodem do twojego Pi. Ma kilka przykładowych projektów, które pokazują niektóre możliwości gadżetów Alexa. Jeśli chcesz uzyskać więcej informacji, zobacz readme na ich stronie Github.
Uruchom ich funkcję konfiguracji, aby wszystko skonfigurować.
cd /home/pi/Alexa-Gadgets-Raspberry-Pi-Samples
sudo python3 launch.py --setup
Postępuj zgodnie z wyświetlanymi instrukcjami i odpowiedz „y” na pytanie, czy chcesz skonfigurować przy użyciu danych logowania gadżetu. Przypomnij sobie identyfikator Amazon ID i tajny gadżet gadżetu podczas konfigurowania gadżetu na konsoli programisty, ponieważ zostanie on tutaj poproszony. Wybrałem tryb transmisji "bt" dla mojego Raspberry Pi Zero W. BLE nie jest obsługiwany przez wszystkie starsze urządzenia Echo, ale możesz sprawdzić, do czego jest zdolny twój sprzęt. Jeśli używasz Pi w trybie pulpitu, Amazon zaleca kliknięcie prawym przyciskiem myszy ikony Bluetooth w prawym górnym rogu i kliknięcie „Usuń „Bluetooth” z panelu”, aby uniknąć problemów z łącznością.
Uwaga: ten krok może chwilę potrwać w zależności od tego, ile trzeba zainstalować.
Teraz będziesz mieć wszystkie niezbędne pliki wsparcia, aby wrócić do swojego projektu i zacząć dodawać funkcje umożliwiające komunikację z Echo.
Jeśli chcesz, możesz usunąć folder „przykłady” w „Alexa-Gadgets-Raspberry-Pi-Samples/src”
Możesz mieć swój kod projektu, gdziekolwiek chcesz, ale stworzę dla niego folder w katalogu domowym, alternatywnie możesz pobrać folder z kodem z mojego Github, po prostu pamiętaj, aby edytować pliki.ini, jak opisano poniżej.
cd /home/pi
mkdir my_project cd my_project dotknij my_gadget.py dotknij my_gadget.ini
Utworzyłem teraz dwa pliki w folderze o nazwie „mój_projekt”. Plik.ini jest ważny. Upewnij się, że zawiera on następujące elementy i zastępuje je w Twoim identyfikatorze Amazon i tajnym gadżecie:
[Ustawienia gadżetu]
amazonId = INSERT_AMAZON_ID_HERE alexaGadgetSecret = INSERT_ALEXA_GADGET_SECRET_HERE [GadgetCapabilities] Custom. MyGadget = 1.0
Teraz przyjrzyjmy się plikowi Pythona, zanim przejdziemy do szczegółów:
importuj json
z agt import AlexaGadget
klasa MyGadget(AlexaGadget):
def _init_(self):
super()._init_()
def on_custom_mygadget_alexatopi(self, dyrektywa):
payload = json.loads(directive.payload.decode("utf-8")) print("Odebrane dane: " + str(payload)) write_text(str(payload['data']['person']['value ']))
def on_custom_mygadget_pitoalexa(self, dyrektywa):
payload = json.loads(directive.payload.decode("utf-8")) print("Otrzymane dane: " + str(payload)) payload = {'data': "Sonda odczytuje " + str(get_temp(payload) ['data'] ['sensor_num']['value'])) + " stopnie."} self.send_custom_event('Custom. MyGadget', 'PiToAlexa', payload) MyGadget().main()
Najpierw zauważysz, że wywołuje dwie funkcje: write_text() i get_temp(). W moim kodzie definiuję te funkcje w tym samym pliku, ale są one zależne od mojego sprzętu, więc zdecydowałem się je pominąć. Załączyłem ten plik z funkcjami zdefiniowanymi do drukowania i zwracania fikcyjnych danych na wypadek, gdybyś chciał uruchomić ten dokładny kod. Sugerowałbym przetestowanie tego dokładnego kodu, zanim zmodyfikujesz go do pracy z twoim projektem. Załączyłem również plik.ini, ale upewnij się, że wchodzisz i zmieniasz identyfikator i sekret gadżetu. Funkcja top odbiera dane przekazywane z Alexy. Dolna funkcja odbiera dane w tym samym formacie, ale urządzenie Alexa będzie czekać pięć sekund na przekazanie zdarzenia z własnym ładunkiem. Ten ładunek jest wyjątkowy, ponieważ urządzenie Alexa wypowiada swoją zawartość.
Po uzyskaniu tych plików przejdź do folderu „my_project” i uruchom plik Pythona.
ponowne uruchomienie sudo
cd /home/pi/mój_projekt sudo python3./my_gadget.py
Jeśli uruchamiasz program po raz pierwszy, musisz sparować go z urządzeniem Echo. Upewnij się, że Twoje urządzenie Echo znajduje się w pobliżu Raspberry Pi, ponieważ musimy umożliwić połączenie Bluetooth.
W aplikacji Alexa na urządzeniu mobilnym kliknij „urządzenia” w prawym dolnym rogu.
Kliknij „Echo i Alexa” w lewym górnym rogu.
Kliknij swoje urządzenie Echo.
W sekcji „BEZPRZEWODOWE” dotknij „Urządzenia Bluetooth”.
Dotknij "SPARUJ NOWE URZĄDZENIE" i powinieneś zobaczyć swój gadżet na liście.
Stuknij w swój gadżet. Powinieneś zobaczyć raport Pi, że został pomyślnie sparowany.
Oglądając dane wyjściowe na swoim Pi, spróbuj wydać polecenie głosowe Echo:
Ty: "Alexa, poproś mój gadżet o sprawdzenie temperatury z czujnika pierwszego"
Jeśli wszystko działało poprawnie, powinieneś usłyszeć:
Echo: „Sonda odczytuje 120,505 stopnia”.
Ty: „Alexa, powiedz mojemu gadżetowi, żeby napisał George Washington”.
Pi powinno wydrukować:
„Otrzymane dane: {'data': {'person': {'name': 'person', 'value': 'George Washington', 'confirmationStatus': 'NONE'}}}
Jerzego Waszyngtona”
Krok 5: Podsumowanie
Pokazany tutaj film jest przykładem gadżetu pracującego z odczytem temperatury (ta sama sonda w F vs. C) i zapisywaniem nazw na prostym wyświetlaczu.
Teraz, gdy miejmy nadzieję, że coś działa, powinieneś spróbować dostosować to, aby Twój własny projekt był bardziej wydajny. Pamiętaj, że możesz łatwo edytować intencje w konsoli programisty Alexa i że wszystkie używane sloty zostaną przekazane do twojego Pi w ładunku. Co więcej, możesz poprosić Alexę o powiedzenie wszystkiego, co chcesz, po prostu edytując ładunek, który przekazujesz w zdarzeniu z kodu Raspberry Pi.
Pamiętaj, że ten samouczek nie ma być ostatecznym rozwiązaniem dla wszystkich możliwości, jakie możesz chcieć od gadżetu Alexa. Celowo ogranicza się do udostępnienia dwóch prostych funkcji przekazywania danych w każdym kierunku między Alexą a gadżetem. Jeśli jesteś zainteresowany budowaniem bardziej wyrafinowanych modeli interakcji, zachęcam do przeczytania wszystkich plików readme na https://github.com/alexa/Alexa-Gadgets-Raspberry-P… i wypróbowania wszystkich dostarczanych przez nie przykładów. Sugerowałbym również zapoznanie się z dokumentacją Alexa Gadgets Toolkit i Alexa Skills Kit.
Zalecana:
Dodaj funkcję niestandardową w Arkuszach Google: 5 kroków
Dodaj funkcję niestandardową w Arkuszach Google: Jestem pewien, że w pewnym momencie swojego życia musiałeś używać oprogramowania do arkuszy kalkulacyjnych, takiego jak Microsoft Excel lub Arkusze Google. Są stosunkowo proste i proste w użyciu, ale także bardzo wydajne i łatwo rozszerzalne.Dzisiaj przyjrzymy się Goo
Kontrolowanie jasności diod LED przez Raspberry Pi i niestandardową stronę internetową: 5 kroków
Kontrolowanie jasności diody LED przez Raspberry Pi i niestandardową stronę internetową: Korzystając z serwera Apache na moim pi z php, znalazłem sposób na kontrolowanie jasności diody LED za pomocą suwaka z dostosowaną stroną internetową, która jest dostępna na dowolnym urządzeniu podłączonym do tej samej sieci co twoje pi .Istnieje wiele sposobów, w jakie można to
Domowa niestandardowa karta rozszerzeń Raspberry Pi: 8 kroków
Raspberry Pi Homemade Custom Expansion Board: Od 2015 roku ulepszam ten wspaniały projekt, aby mieć prawie nieograniczone niestandardowe centrum multimedialne w moim samochodzie. Pewnego dnia postanowiłem doprowadzić organizację do przewodów za pomocą niestandardowej, domowej roboty płytki drukowanej. Powyższe zdjęcia są na szerokiej fazie prototypowej, więc
Niestandardowa obudowa Lego Raspberry Pi: 19 kroków
Lego Raspberry Pi Custom Case: Niedawno kupiłem Raspberry Pi 3 i zdecydowałem, że chcę zbudować swoją własną niestandardową obudowę. Jako ojciec 4-letniego dziecka mam również dużą ilość Lego:) To jest po prostu idealne! Więc po wielu prototypach wymyśliłem coś, z czego jestem całkiem zadowolony
Dodaj wideo i audio do swojego projektu mikrokontrolera: 7 kroków
Dodaj wideo i dźwięk do swojego projektu z mikrokontrolerem: 7-segmentowe wyświetlacze LED są przydatne do wyświetlania liczb, a wyświetlacze LCD z mapami bitowymi mogą wykonywać prostą grafikę, ale czasami najprostszym sposobem jest uzyskanie rzeczywistego, kolorowego sygnału wideo: Wideo kompozytowe (inaczej gniazdo RCA) jest wszechobecny i współpracuje z 3” - 60&q