Cuprins:

Adăugați control Alexa personalizat la Raspberry Pi Project: 5 pași
Adăugați control Alexa personalizat la Raspberry Pi Project: 5 pași

Video: Adăugați control Alexa personalizat la Raspberry Pi Project: 5 pași

Video: Adăugați control Alexa personalizat la Raspberry Pi Project: 5 pași
Video: High Density 2022 2024, Iulie
Anonim
Adăugați control personalizat Alexa la Raspberry Pi Project
Adăugați control personalizat Alexa la Raspberry Pi Project

Acest proiect este destinat oricui are un proiect Raspberry Pi care utilizează Python care dorește să adauge control vocal prin intermediul dispozitivelor Amazon Echo existente. Nu trebuie să fiți un programator cu experiență, dar ar trebui să vă simțiți confortabil folosind linia de comandă și să adaptați codul existent pentru a se potrivi nevoilor dvs.

Am început inițial un proiect pentru a permite Raspberry Pi să fie controlat vocal cu Alexa, astfel încât să poată încălzi apa într-un ceainic la o temperatură specifică. Deși interacțiunea dorită a fost destul de simplă (treceți un număr de la Alexa la Raspberry Pi), a fost nevoie de multă muncă pentru a ajunge la acea stare din tutorialele existente. Sper că acest tutorial va face acest proces cât mai rapid posibil pentru ceilalți.

În exemplul meu, încep cu un Raspberry Pi Zero W cu Raspbian. Am un program Python3 pe Pi care este capabil să scrie text pe un afișaj SPI și am o sondă termometru pe care o pot citi. Pentru dvs., acest program ar putea fi aproape orice, dar ideea este că este posibil să aveți câteva dispozitive de intrare pe care doriți să le citiți prin Alexa și / sau unele dispozitive de ieșire pe care doriți să le controlați folosind Alexa.

Scopul este de a trece de la un program de bază, cum ar fi cel descris mai sus, la un dispozitiv pe care îl puteți controla cu ușurință cu Echo-ul meu. Presupunând că aveți deja acest hardware, acest proiect nu ar trebui să vă coste niciun ban. În cele din urmă, veți ajunge la punctul în care puteți spune lucruri precum:

Eu: "Alexa, cereți gadgetului meu să verifice temperatura la senzorul 1."

Răspunsul lui Alexa: „Sonda citește 72,31 grade”.

sau

Eu: „Alexa, spune-i gadgetului meu să scrie George Washington”

Răspuns: Afișajul conectat la Raspberry Pi acum scrie „George Washington”

În secțiunea următoare, voi descrie ce trebuie să se întâmple în culise pentru ca acest lucru să funcționeze. Dacă doriți doar să faceți acest lucru la proiectul dvs. și nu vă pasă cum funcționează, nu ezitați să-l ignorați (deși s-ar putea îngreuna dacă ceva nu merge bine).

Pasul 1: fundal

fundal
fundal

În această imagine (credit: https://developer.amazon.com/en-US/docs/alexa/alex… putem vedea arhitectura generală pentru dispozitivele Alexa.

Când spuneți ceva dispozitivului dvs. Echo, acesta trimite sunetul către Alexa Cloud, unde este procesat și unde este generat un răspuns pentru a vă răspunde. Când întrebați ce vreme este, acestea sunt doar două în comunicare. Acum, să presupunem că doriți să adăugați control vocal la unul dintre proiectele dvs. mici pe un Raspberry Pi. Prelucrarea a tot ce este la bord ar necesita hardware semnificativ și o bază de cod foarte sofisticată pentru a face lucrurile să meargă. O soluție mai bună ar fi să folosim Alexa Cloud, care este foarte sofisticat și a devenit foarte bun în gestionarea tiparelor de vorbire complexe. Gadgeturile Alexa vă oferă o modalitate bună de a face acest lucru.

Un gadget Alexa comunică cu un dispozitiv Echo utilizând Bluetooth. Odată stabilită această conexiune, cei doi își transmit reciproc mesaje folosind codificarea UTF-8. Când Echo transmite ceva gadgetului, se numește directivă. Cealaltă direcție este denumită eveniment. Înainte de a intra în fluxul exact al tuturor acestor lucruri, ar trebui să introducem un alt element cheie: abilitățile personalizate Alexa.

Alexa le permite dezvoltatorilor să își creeze propriile abilități personalizate, ceea ce le permite să își proiecteze propriile interacțiuni și comportamente pentru a fi utilizate pe toate dispozitivele Echo. De exemplu, un dezvoltator ar putea crea o abilitate personalizată pentru a vă spune distanța dintre două aeroporturi din SUA. Un utilizator ar spune: „Alexa, întreabă calculatorul meu personalizat de distanță care este distanța dintre LAX și JFK” și ar putea răspunde cu „2475 mile”. Cum face asta? Când un dezvoltator realizează o abilitate personalizată, acesta definește ceea ce se numește „intenții personalizate” cu „exemple de enunțuri” care conțin „sloturi”. De exemplu, în această abilitate aș putea avea intenția „calc_dist” de a calcula distanța dintre două puncte. Un exemplu de enunț ar fi „care este distanța dintre {slot1} și {slot2}” sau „cât de departe este între {slot1} și {slot2}”. Sloturile prezentate între paranteze au tipuri specifice. În acest caz, aceste tipuri ar fi coduri de aeroport precum LAX, JFK, BOS, ATL. Când un utilizator solicită abilitatea personalizată, Alexa Cloud încearcă să potrivească ceea ce spune utilizatorul cu o intenție personalizată folosind exemplele de enunțuri furnizate și încearcă să găsească valori valide ale sloturilor pentru acea solicitare. În acest exemplu, s-ar găsi că utilizatorul dorea intenția „calc_dist” și că slotul 1 este LAX și slotul 2 este JFK. În acest moment, Alexa Cloud transmite lucrarea la propriul cod al dezvoltatorului. Practic, spune codului dezvoltatorilor ce intenție a primit și care au fost toate valorile sloturilor, printre alte detalii.

Dezvoltatorul trebuie să decidă unde locuiește codul lor, dar o opțiune foarte populară este utilizarea unei funcții AWS Lambda. Dacă nu știți ce este, acesta este în esență un serviciu care vă permite să încărcați cod care poate fi rulat în orice moment și apoi vă taxează doar pentru perioada de timp în care codul dvs. este rulat. Dacă vom continua cu exemplul nostru, codul dezvoltatorului ar putea fi o funcție Python care primește cele două coduri de aeroport, caută locațiile lor, calculează distanțele și apoi trimite un răspuns înapoi la Alexa Cloud pentru a vorbi ceva utilizatorului. Cloudul Alexa ar trimite apoi acele informații de vorbire înapoi pe dispozitivul utilizatorului și vor primi răspunsul.

Acum putem reveni la gadget. Putem crea abilități personalizate care sunt concepute pentru a funcționa în mod special cu gadgeturi. Un dezvoltator poate scrie o abilitate care trimite o directivă către un gadget conectat. Această directivă are o sarcină utilă care poate fi utilizată, totuși este necesară pentru gadget. Această abilitate poate trimite, de asemenea, o directivă și apoi poate asculta un eveniment din gadget, astfel încât codul de calificare să aibă acces la informațiile trimise de gadget.

Stabilirea acestui flux permite crearea unui instrument foarte puternic, deoarece gadgeturile ieftine pot avea capacitatea de a comunica cu codul în cloud și de a răspunde la comenzile vocale utilizând unele dintre cele mai bune recunoașteri vocale disponibile.

Trebuie remarcat faptul că majoritatea abilităților permit diverse modalități de interacțiune cu ele. De exemplu, un utilizator ar putea sări direct într-o intenție spunând „Alexa, întreabă calculatorul meu personalizat de distanță care este distanța dintre LAX și JFK” (numită invocare one-shot) sau ar putea folosi pur și simplu o intenție de lansare: „Alexa, deschide calculatorul meu personalizat de distanță . Acest ultim exemplu ar fi de obicei urmat de Alexa care răspunde cu un prompt pentru mai multe informații. Acest tutorial omite intenționat suportul pentru acesta din urmă. Mai precis, fără a modifica funcția Lambda, puteți invoca abilitatea doar folosind o invocare dintr-o singură dată. Această alegere de proiectare permite modelului să fie mai simplu (nu trebuie să accepte intențiile de lansare sau fluxul de conversație) și am constatat că doresc, de obicei, să interacționez cu gadgeturile mele folosind invocări one-shot oricum, deoarece acestea sunt de obicei mai rapide.

Pasul 2: Înregistrați gadgetul pe consola pentru dezvoltatori Alexa Voice Service

Următoarea este o descriere a pașilor necesari. Am creat un videoclip echivalent care arată cum să faci toți acești pași. Puteți utiliza oricare sau ambele pentru a finaliza acest pas.

  1. Navigați la
  2. Dacă nu aveți deja un cont gratuit, creați unul
  3. Faceți clic pe „Produse”
  4. Completați etichetele și selectați „Alexa Gadget”
  5. Completați orice doriți pentru restul câmpurilor
  6. Faceți clic pe Finalizare

Pasul 3: Creați funcția AWS Lambda și abilitatea personalizată

Creați abilități personalizate pe consola pentru dezvoltatori Alexa Skills Kit

Codul pentru acest tutorial poate fi găsit aici

Înainte de a finaliza acest pas, va trebui să creați un fișier.zip care conține pachetul de implementare pentru funcția AWS Lambda așa cum se arată în tutorialul de aici.

  1. Descărcați folderul „lambda” din Github care conține „lambda_function.py” și „requirements.txt”
  2. Deschideți terminalul și schimbați directorul curent pentru a fi în acest folder.
  3. Rulați următoarea secvență:

pip install -r requirements.txt -t skill_env

cp lambda_function.py skill_env cd skill_env zip -r../../skill-code.zip

Fișierul dvs..zip va fi acum situat în directorul în care se afla folderul lambda și va fi numit „skill-code.zip”.

O notă cu privire la costul găzduirii pe AWS: acest tutorial necesită să aveți un cont AWS (de creat gratuit). Funcțiile Lambda costă bani, cu toate acestea, prețurile lor actuale în regiunea N. Virginia sunt de 0,000000208 USD pe 100 ms de utilizare cu 128 MB de memorie. Pentru referință, fiecare invocare a abilității mele facturează aproximativ 800 ms de utilizare la acest nivel. Pentru a obține o factură de 1,00 USD, ar trebui să invocați această funcție de aproximativ 600 000 de ori, ceea ce (dacă vă durează 5 secunde pe invocație) vă va dura peste 34 de zile de apelare continuă a funcției. Costul nu ar trebui să fie o problemă semnificativă, cu excepția cazului în care vă publicați abilitățile și un număr mare de oameni încep să o folosească. Dacă sunteți îngrijorat de obținerea facturilor pe AWS, luați în considerare setarea unor alarme de utilizare care să vă anunțe dacă utilizarea depășește un prag definit.

Următoarea este o descriere a pașilor necesari. Am creat un videoclip echivalent care arată cum să faci toți acești pași. Puteți utiliza oricare sau ambele pentru a finaliza acest pas.

  1. Navigați la https://aws.amazon.com/ și conectați-vă la consolă sau creați un cont gratuit dacă nu aveți unul
  2. Căutați și faceți clic pe Lambda sub servicii
  3. Faceți clic pe „Creați funcția”
  4. Selectați „Autor de la zero”, dați-i un nume și alegeți cea mai recentă versiune Python 3 pentru runtime
  5. Schimbați „editați codul în linie” la „încărcați un fișier.zip” și selectați fișierul.zip creat mai sus
  6. Într-o fereastră nouă, navigați la https://developer.amazon.com/alexa/console/ask și conectați-vă
  7. Faceți clic pe „Creați abilități”
  8. Etichetați-l, alegeți modelul „Personalizat” și „Furnizați-vă propriul” și faceți clic pe „Creați abilități”
  9. Faceți clic pe „Începeți de la zero” și faceți clic pe „Alegeți”
  10. Sub „Intenții”, faceți clic pe „Adăugați”
  11. Creați o intenție personalizată numită „alexa_to_pi” și completați „write {person}” ca exemplu de enunț
  12. Creați un spațiu de intenție numit „persoană” cu tipul „AMAZON. Person”
  13. Creați o intenție personalizată numită „pi_to_alexa” și completați „verificați temperatura de la senzor {sensor_num}
  14. Creați un spațiu de intenție numit „sensor_num” cu tipul „AMAZON. NUMBER”
  15. Sub Interfețe, activați „Controler de interfață personalizat”
  16. Sub Endpoint, selectați „AWS Lambda ARN” și copiați „ID-ul dvs. de abilitate”
  17. Navigați înapoi la AWS Console
  18. Faceți clic pe „Adăugați un declanșator”
  19. Selectați „Trusa de abilități Alexa”, bifați „Activați” sub Verificarea ID-ului de abilități, lipiți în ID-ul de abilități pe care tocmai l-ați copiat și faceți clic pe adăugare
  20. Copiați Lambda ARN în colțul din dreapta sus
  21. Navigați înapoi la Consola pentru dezvoltatori Alexa și lipiți ARN-ul Lambda în câmpul „Regiune implicită”
  22. Sub Invocare, setați Numele invocării abilităților să fie „obiectul meu gadget”
  23. Faceți clic pe „Salvați modelul” și apoi pe „Construiți modelul”
  24. Faceți clic pe „Testați” în filele de sus și schimbați selectorul din „Dezactivat” în „Dezvoltare”
  25. Rețineți că jurnalele pentru funcția Lambda se găsesc în serviciul „CloudWatch” de pe AWS.

Pasul 4: Configurați codul pe Raspberry Pi

Pentru ca Raspberry Pi să comunice cu dispozitivul Alexa, are nevoie de un anumit cod pentru a facilita transmiterea informațiilor prin Bluetooth și menținerea acelei conexiuni, în plus față de alte câteva fișiere. Cel mai simplu mod de a începe cu cele mai actualizate fișiere de la Amazon este clonarea depozitului Raspberry Pi Gadgets. Navigați la directorul proiectului curent și rulați

git clone

Aceasta va încărca întregul depozit cu tot codul necesar pe Pi. Are câteva exemple de proiecte care arată câteva dintre capacitățile Alexa Gadgets. Dacă doriți mai multe informații, consultați readme-ul pe pagina lor Github.

Rulați funcția de configurare pentru a configura totul.

cd / home / pi / Alexa-Gadgets-Raspberry-Pi-Samples

sudo python3 launch.py --setup

Urmați instrucțiunile și răspundeți „y” când sunteți întrebat dacă doriți să configurați folosind acreditările gadget. Reamintim ID-ul Amazon și Secretul gadgetului de la configurarea gadgetului pe consola pentru dezvoltatori, deoarece acesta va fi solicitat aici. Am ales modul de transmisie „bt” pentru Raspberry Pi Zero W. BLE nu este acceptat de toate dispozitivele Echo mai vechi, dar puteți căuta de ce este capabil hardware-ul dvs. Dacă utilizați Pi în modul Desktop, Amazon vă recomandă să faceți clic dreapta pe pictograma bluetooth din dreapta sus și să dați clic pe „Eliminați„ Bluetooth”din panou„ pentru a evita problemele de conectivitate.

Notă: acest pas poate dura ceva timp, în funcție de cât trebuie instalat.

Acum veți avea toate fișierele de asistență necesare pentru a reveni la proiectul dvs. și a începe să adăugați funcțiile pentru a permite comunicarea cu Echo.

Dacă alegeți, puteți șterge folderul „exemple” din „Alexa-Gadgets-Raspberry-Pi-Samples / src”

Puteți avea codul de proiect oriunde doriți, dar voi crea un folder în directorul de start pentru acesta, alternativ, puteți descărca folderul cu codul de pe Github, doar asigurați-vă că editați fișierele.ini așa cum este descris mai jos.

cd / home / pi

mkdir my_project cd my_project atinge my_gadget.py atinge my_gadget.ini

Acum am creat două fișiere într-un folder numit „proiectul_meu”. Fișierul.ini este important. Asigurați-vă că conține următoarele și înlocuiți în ID-ul dvs. Amazon și secretul gadgetului:

[GadgetSettings]

amazonId = INSERT_AMAZON_ID_HERE alexaGadgetSecret = INSERT_ALEXA_GADGET_SECRET_HERE [GadgetCapabilities] Custom. MyGadget = 1.0

Acum, să aruncăm o privire asupra fișierului python înainte de a intra în detalii:

import json

din agt import AlexaGadget

clasa MyGadget (AlexaGadget):

def _init _ (auto):

super ()._ init _ ()

def on_custom_mygadget_alexatopi (auto, directivă):

payload = json.loads (directive.payload.decode ("utf-8")) print ("Date primite:" + str (payload)) write_text (str (payload ['data'] ['person'] ['value ']))

def on_custom_mygadget_pitoalexa (auto, directivă):

payload = json.loads (directive.payload.decode ("utf-8")) print ("Date primite:" + str (payload)) payload = {'data': "Sonda citește" + str (get_temp (payload ['date'] ['sensor_num'] ['value'])) + + grade. "} self.send_custom_event ('Custom. MyGadget', 'PiToAlexa', sarcină utilă) MyGadget (). main ()

Mai întâi veți observa că apelează două funcții: write_text () și get_temp (). În codul meu, definesc aceste funcții în același fișier, dar acestea depind de hardware-ul meu, așa că am ales să le omit. Am atașat acest fișier cu acele funcții definite doar pentru a imprima și a returna date fictive în cazul în care doriți să rulați acest cod exact. Aș sugera testarea cu acest cod exact înainte de al modifica pentru a lucra cu proiectul dvs. Am atașat și fișierul.ini, dar asigurați-vă că intrați și schimbați ID-ul și secretul gadgetului. Funcția de sus primește date transmise de la Alexa. Funcția de jos primește date în același format, dar dispozitivul Alexa va aștepta cinci secunde pentru ca un eveniment să fie transmis înapoi cu propria sa sarcină utilă. Această sarcină utilă este specială, deoarece dispozitivul Alexa își va spune conținutul.

După ce aveți aceste fișiere, navigați la folderul „proiectul_meu” și rulați fișierul python.

sudo reboot

cd / home / pi / my_project sudo python3./my_gadget.py

Dacă este prima dată când rulați programul, va trebui să îl asociați la dispozitivul dvs. Echo. Asigurați-vă că dispozitivul dvs. Echo este aproape de Raspberry Pi, deoarece trebuie să permitem o conexiune bluetooth.

În aplicația Alexa de pe dispozitivul dvs. mobil, dați clic pe „dispozitive” în colțul din dreapta jos.

Faceți clic pe „Echo & Alexa” în partea stângă sus.

Faceți clic pe dispozitivul dvs. Echo.

Sub „WIRELESS”, atingeți „Dispozitive Bluetooth”.

Atingeți „ASOCIAȚI UN NOU DISPOZITIV” și ar trebui să vă vedeți gadgetul pe listă.

Atingeți gadgetul. Ar trebui să vedeți raportul Pi că s-a asociat cu succes.

În timp ce urmăriți ieșirea pe Pi, încercați să dați o comandă vocală Ecoului:

Dumneavoastră: „Alexa, cereți gadgetului meu să verifice temperatura de la senzorul unu”

Dacă totul a funcționat corect, ar trebui să auziți:

Ecou: „Sonda citește 120.505 grade”.

Tu: „Alexa, spune-i gadgetului meu să scrie George Washington”.

Pi ar trebui să tipărească:

Date primite: {'data': {'person': {'name': 'person', 'value': 'George Washington', 'confirmationStatus': 'NONE'}}}

George Washington"

Pasul 5: încheierea

Videoclipul prezentat aici este un exemplu de gadget care funcționează cu citirea temperaturii (aceeași sondă în F vs. C) și scrierea numelor pe un afișaj simplu.

Acum, că sperăm că aveți ceva de lucru, ar trebui să încercați să mergeți și să personalizați acest lucru pentru a vă face propriul proiect mai capabil. Amintiți-vă că puteți edita cu ușurință intențiile în Consola pentru dezvoltatori Alexa și că toate sloturile pe care le utilizați vor fi transmise către Pi în sarcina utilă. Mai mult, poți să-i faci lui Alexa să spună orice ai dori, doar editând încărcătura utilă pe care o trimiți înapoi în eventualitatea respectivă din codul tău Raspberry Pi.

Rețineți că acest tutorial nu este destinat să fie soluția finală pentru toate funcționalitățile pe care le-ați putea dori cu un gadget Alexa. Este limitat în mod intenționat să vă oferim două funcții simple pentru transmiterea datelor în fiecare direcție între Alexa și un gadget. Dacă sunteți interesat să creați modele de interacțiune mai sofisticate, v-aș încuraja să citiți toate fișierele readme din https://github.com/alexa/Alexa-Gadgets-Raspberry-P… și să încercați toate exemplele pe care le oferă. Aș sugera, de asemenea, să citiți documentația pentru Alexa Gadgets Toolkit și Alexa Skills Kit.

Recomandat: