Inhaltsverzeichnis:

Benutzerdefinierte Alexa-Steuerung zum Raspberry Pi-Projekt hinzufügen - Gunook
Benutzerdefinierte Alexa-Steuerung zum Raspberry Pi-Projekt hinzufügen - Gunook

Video: Benutzerdefinierte Alexa-Steuerung zum Raspberry Pi-Projekt hinzufügen - Gunook

Video: Benutzerdefinierte Alexa-Steuerung zum Raspberry Pi-Projekt hinzufügen - Gunook
Video: Amazon Echo selber bauen?! :: Alexa auf dem Raspberry Pi | Tutorial 2024, Juli
Anonim
Benutzerdefinierte Alexa-Steuerung zum Raspberry Pi-Projekt hinzufügen
Benutzerdefinierte Alexa-Steuerung zum Raspberry Pi-Projekt hinzufügen

Dieses Projekt ist für alle gedacht, die ein Raspberry Pi-Projekt haben, das Python verwendet und die Sprachsteuerung über ihre vorhandenen Amazon Echo-Geräte hinzufügen möchte. Sie müssen kein erfahrener Programmierer sein, aber Sie sollten mit der Befehlszeile vertraut sein und vorhandenen Code an Ihre Bedürfnisse anpassen.

Ich hatte zunächst ein Projekt gestartet, um meinen Raspberry Pi mit Alexa sprachgesteuert zu machen, um Wasser in einem Wasserkocher auf eine bestimmte Temperatur zu erhitzen. Obwohl die Interaktion, die ich wollte, ziemlich einfach war (eine Nummer von Alexa an den Raspberry Pi weitergeben), war es sehr arbeitsintensiv, diesen Zustand aus den vorhandenen Tutorials zu erreichen. Ich hoffe, dieses Tutorial wird diesen Prozess für andere so schnell wie möglich machen.

In meinem Beispiel starte ich mit einem Raspberry Pi Zero W mit Raspbian. Ich habe ein Python3-Programm auf meinem Pi, das Text auf ein SPI-Display schreiben kann, und ich habe eine Thermometersonde, die ich lesen kann. Für Sie könnte dieses Programm fast alles sein, aber die Idee ist, dass Sie möglicherweise einige Eingabegeräte haben, die Sie über Alexa lesen möchten und / oder einige Ausgabegeräte, die Sie mit Alexa steuern möchten.

Das Ziel ist es, von einem Basisprogramm wie dem oben beschriebenen zu einem Gerät zu gelangen, das Sie mit meinem Echo einfach steuern können. Vorausgesetzt, Sie haben diese Hardware bereits, sollte Sie dieses Projekt kein Geld kosten. Am Ende kommst du an den Punkt, an dem du Dinge sagen kannst wie:

Ich: "Alexa, bitte mein Gadget, die Temperatur von Sensor 1 zu überprüfen."

Antwort von Alexa: "Die Sonde zeigt 72,31 Grad an."

oder

Ich: "Alexa, sag meinem Gerät, es soll George Washington schreiben"

Antwort: Das mit meinem Raspberry Pi verbundene Display zeigt jetzt "George Washington" an

Im nächsten Abschnitt werde ich beschreiben, was hinter den Kulissen passieren muss, damit dies funktioniert. Wenn Sie dies nur in Ihrem Projekt zum Laufen bringen möchten und sich nicht darum kümmern, wie es funktioniert, können Sie es gerne überspringen (obwohl es es schwieriger machen könnte, wenn etwas schief geht).

Schritt 1: Hintergrund

Hintergrund
Hintergrund

In diesem Bild (Credit: https://developer.amazon.com/en-US/docs/alexa/alex…) sehen wir die allgemeine Architektur der Alexa-Gadgets.

Wenn Sie etwas zu Ihrem Echo-Gerät sagen, sendet es das Audio an die Alexa Cloud, wo es verarbeitet und eine Antwort generiert wird, um Ihnen zu antworten. Wenn man fragt, wie das Wetter ist, sind es nur diese beiden in Kommunikation. Angenommen, Sie möchten einem Ihrer kleinen Projekte auf einem Raspberry Pi Sprachsteuerung hinzufügen. Alles an Bord zu verarbeiten würde erhebliche Hardware und eine sehr ausgeklügelte Codebasis erfordern, um die Dinge in Gang zu bringen. Eine bessere Lösung wäre die Nutzung der Alexa Cloud, die sehr ausgereift ist und sehr gut im Umgang mit komplexen Sprachmustern geworden ist. Alexa Gadgets bieten hierfür eine gute Möglichkeit.

Ein Alexa-Gadget kommuniziert über Bluetooth mit einem Echo-Gerät. Sobald diese Verbindung hergestellt ist, übergeben sich die beiden Nachrichten mit UTF-8-Codierung. Wenn das Echo etwas an das Gadget übergibt, wird dies als Direktive bezeichnet. Die andere Richtung wird als Ereignis bezeichnet. Bevor wir auf den genauen Ablauf von all dem eingehen, sollten wir ein weiteres Schlüsselelement vorstellen: benutzerdefinierte Alexa-Skills.

Mit Alexa können Entwickler ihre eigenen benutzerdefinierten Fähigkeiten erstellen, die es ihnen ermöglichen, ihre eigenen Interaktionen und Verhaltensweisen für die Verwendung auf allen Echo-Geräten zu entwerfen. Ein Entwickler könnte beispielsweise einen benutzerdefinierten Skill erstellen, um Ihnen die Entfernung zwischen zwei Flughäfen in den USA mitzuteilen. Ein Benutzer würde sagen: "Alexa, frage meinen benutzerdefinierten Entfernungsrechner, wie groß die Entfernung zwischen LAX und JFK ist" und er könnte mit "2475 Meilen" antworten. Wie geht das? Wenn ein Entwickler einen benutzerdefinierten Skill erstellt, definiert er sogenannte "benutzerdefinierte Absichten" mit "Beispieläußerungen", die "Slots" enthalten. Zum Beispiel könnte ich in dieser Fertigkeit die Absicht "calc_dist" haben, den Abstand zwischen zwei Punkten zu berechnen. Eine Beispieläußerung wäre "wie weit ist der Abstand zwischen {slot1} und {slot2}" oder "wie weit zwischen {slot1} und {slot2}". Die in Klammern gezeigten Steckplätze haben bestimmte Typen. In diesem Fall wären dies Flughafencodes wie LAX, JFK, BOS, ATL. Wenn ein Benutzer nach dem benutzerdefinierten Skill fragt, versucht die Alexa Cloud, das, was der Benutzer sagt, mithilfe der bereitgestellten Beispieläußerungen mit einem benutzerdefinierten Intent abzugleichen, und versucht, gültige Slot-Werte für diese Anfrage zu finden. In diesem Beispiel würde er feststellen, dass der Benutzer die Absicht "calc_dist" haben wollte und dass Slot1 LAX und Slot2 JFK ist. An dieser Stelle übergibt die Alexa Cloud die Arbeit an den eigenen Code des Entwicklers. Im Grunde teilt es dem Entwicklercode unter anderem mit, welche Absicht er erhalten hat und wie alle Slot-Werte waren.

Der Entwickler kann entscheiden, wo sein Code gespeichert ist, aber eine sehr beliebte Option ist die Verwendung einer AWS Lambda-Funktion. Wenn Sie nicht wissen, was das ist, handelt es sich im Wesentlichen um einen Dienst, der es Ihnen ermöglicht, Code hochzuladen, der jederzeit ausgeführt werden kann, und Ihnen dann nur die Zeit in Rechnung stellt, die Ihr Code ausgeführt wird. Wenn wir mit unserem Beispiel fortfahren, könnte der Code des Entwicklers eine Python-Funktion sein, die die beiden Flughafencodes empfängt, ihre Standorte nachschlägt, die Entfernungen berechnet und dann eine Antwort zurück an die Alexa Cloud sendet, um dem Benutzer etwas mitzuteilen. Die Alexa Cloud würde diese Sprachinformationen dann zurück an das Gerät des Benutzers senden, und dieser würde die Antwort erhalten.

Jetzt können wir zum Gadget zurückkehren. Wir können benutzerdefinierte Fähigkeiten erstellen, die speziell für die Verwendung mit Gadgets entwickelt wurden. Ein Entwickler kann einen Skill schreiben, der eine Anweisung an ein verbundenes Gadget sendet. Diese Direktive hat eine Nutzlast, die verwendet werden kann, wie auch immer sie vom Gadget benötigt wird. Dieser Skill kann auch eine Anweisung senden und dann auf ein Ereignis vom Gadget warten, damit der Skillcode auf die vom Gadget gesendeten Informationen zugreifen kann.

Die Einrichtung dieses Flows ermöglicht ein sehr leistungsfähiges Werkzeug, da kostengünstige Gadgets die Möglichkeit haben können, mit Code in der Cloud zu kommunizieren und auf Sprachbefehle mit einigen der besten verfügbaren Spracherkennungen zu reagieren.

Es sollte beachtet werden, dass die meisten Fähigkeiten verschiedene Arten der Interaktion mit ihnen ermöglichen. Zum Beispiel könnte ein Benutzer direkt in eine Absicht springen, indem er sagt "Alexa, frage meinen benutzerdefinierten Entfernungsrechner, was die Entfernung zwischen LAX und JFK ist" (einer einmaligen Aufruf genannt) oder er könnte einfach eine Startabsicht verwenden: "Alexa, öffne meinen benutzerdefinierten Entfernungsrechner". Auf dieses letzte Beispiel folgt normalerweise Alexa, die mit einer Aufforderung zur Eingabe weiterer Informationen antwortet. In diesem Tutorial wird bewusst auf die Unterstützung für letzteres verzichtet. Genauer gesagt können Sie den Skill nur mit einem einmaligen Aufruf aufrufen, ohne die Lambda-Funktion zu ändern. Durch diese Designwahl kann das Modell einfacher sein (muss keine Startabsichten oder Konversationsabläufe unterstützen), und ich habe festgestellt, dass ich normalerweise sowieso mit meinen Gadgets mit einmaligen Aufrufen interagieren möchte, da sie normalerweise schneller sind.

Schritt 2: Registrieren Sie das Gadget in der Alexa Voice Service Developer Console

Im Folgenden finden Sie eine Beschreibung der erforderlichen Schritte. Ich habe ein entsprechendes Video erstellt, das zeigt, wie all diese Schritte ausgeführt werden. Sie können einen oder beide verwenden, um diesen Schritt abzuschließen.

  1. Navigieren Sie zu
  2. Wenn Sie noch kein kostenloses Konto haben, erstellen Sie eines
  3. Klicken Sie auf "Produkte"
  4. Füllen Sie die Etiketten aus und wählen Sie „Alexa-Gadget“aus.
  5. Füllen Sie die restlichen Felder aus, was Sie wollen
  6. Klicken Sie auf Fertig stellen

Schritt 3: AWS Lambda-Funktion und benutzerdefinierten Skill erstellen

Benutzerdefinierten Skill in der Alexa Skills Kit Developer Console erstellen

Code für dieses Tutorial finden Sie hier

Bevor Sie diesen Schritt ausführen, müssen Sie eine ZIP-Datei erstellen, die das Bereitstellungspaket für die AWS Lambda-Funktion enthält, wie im Tutorial hier gezeigt.

  1. Laden Sie den Ordner "lambda" von meinem Github herunter, der "lambda_function.py" und "requirements.txt" enthält.
  2. Öffnen Sie das Terminal und ändern Sie das aktuelle Verzeichnis in diesen Ordner.
  3. Führen Sie die folgende Sequenz aus:

pip install -r requirements.txt -t skill_env

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

Ihre.zip-Datei befindet sich nun in dem Verzeichnis, in dem sich der Lambda-Ordner befand und heißt "skill-code.zip".

Ein Hinweis zu den Kosten für das Hosten auf AWS: Für dieses Tutorial benötigen Sie ein AWS-Konto (kostenlos zu erstellen). Lambda-Funktionen kosten zwar Geld, ihre aktuellen Preise in der Region N. Virginia betragen jedoch 0,000000208 USD pro 100 ms Nutzung mit 128 MB Speicher. Als Referenz kostet jeder Aufruf meiner Fertigkeit etwa 800 ms Nutzung auf dieser Stufe. Um eine Rechnung von 1,00 USD zu sammeln, müssten Sie diese Funktion etwa 600.000 Mal aufrufen, was (wenn Sie pro Aufruf 5 Sekunden dauern) über 34 Tage dauern würden, um Ihre Funktion ununterbrochen aufzurufen. Die Kosten sollten kein wesentliches Problem darstellen, es sei denn, Sie veröffentlichen Ihren Skill und eine große Anzahl von Leuten beginnt damit, ihn zu verwenden. Wenn Sie Bedenken haben, Rechnungen auf AWS zu erhalten, sollten Sie Nutzungsalarme einrichten, die Sie benachrichtigen, wenn die Nutzung einen definierten Schwellenwert überschreitet.

Im Folgenden finden Sie eine Beschreibung der erforderlichen Schritte. Ich habe ein entsprechendes Video erstellt, das zeigt, wie all diese Schritte ausgeführt werden. Sie können einen oder beide verwenden, um diesen Schritt abzuschließen.

  1. Navigieren Sie zu https://aws.amazon.com/ und melden Sie sich bei der Konsole an oder erstellen Sie ein kostenloses Konto, wenn Sie noch kein Konto haben
  2. Suchen Sie nach Lambda und klicken Sie unter Dienste darauf
  3. Klicken Sie auf "Funktion erstellen"
  4. Wählen Sie "Autor von Grund auf", geben Sie ihm einen Namen und wählen Sie die neueste Python 3-Version für die Laufzeit
  5. Ändere "Code inline bearbeiten" in "Zip-Datei hochladen" und wähle die oben erstellte ZIP-Datei aus
  6. Navigieren Sie in einem neuen Fenster zu https://developer.amazon.com/alexa/console/ask und melden Sie sich an
  7. Klicken Sie auf "Fähigkeit erstellen"
  8. Beschriften Sie es, wählen Sie "Benutzerdefiniert" und "Bereitstellen Sie Ihre eigenen" und klicken Sie auf "Skill erstellen".
  9. Klicken Sie auf "Von Grund auf neu starten" und klicken Sie auf "Auswählen".
  10. Klicken Sie unter "Intents" auf "Hinzufügen".
  11. Erstellen Sie einen benutzerdefinierten Intent namens "alexa_to_pi" und geben Sie "write {person}" als Beispieläußerung ein
  12. Erstellen Sie einen Intent-Slot namens "person" mit dem Typ "AMAZON. Person"
  13. Erstellen Sie einen benutzerdefinierten Intent namens "pi_to_alexa" und geben Sie "check the temperature from sensor {sensor_num}" ein.
  14. Erstellen Sie einen Intent-Slot namens "sensor_num" mit dem Typ "AMAZON. NUMBER"
  15. Aktivieren Sie unter Schnittstellen "Benutzerdefinierter Schnittstellen-Controller".
  16. Wählen Sie unter Endpunkt "AWS Lambda ARN" aus und kopieren Sie die "Your Skill ID"
  17. Navigieren Sie zurück zur AWS-Konsole
  18. Klicken Sie auf "Auslöser hinzufügen"
  19. Wählen Sie „Alexa Skills Kit“, aktivieren Sie „Aktivieren“unter der Skill-ID-Verifizierung, fügen Sie die soeben kopierte Skill-ID ein und klicken Sie auf Hinzufügen
  20. Kopieren Sie den Lambda-ARN in der oberen rechten Ecke
  21. Navigieren Sie zurück zur Alexa Developer Console und fügen Sie den Lambda-ARN in das Feld "Standardregion" ein
  22. Legen Sie unter Aufruf den Skill-Aufrufnamen auf "mein Gadget" fest.
  23. Klicken Sie auf "Modell speichern" und dann auf "Modell erstellen".
  24. Klicken Sie in den oberen Registerkarten auf "Test" und ändern Sie die Auswahl von "Aus" auf "Entwicklung"
  25. Beachten Sie, dass Protokolle für die Lambda-Funktion im Service „CloudWatch“auf AWS zu finden sind.

Schritt 4: Richten Sie den Code auf Ihrem Raspberry Pi ein

Damit Ihr Raspberry Pi mit dem Alexa-Gerät kommunizieren kann, benötigt er neben einigen anderen Dateien einen Code, der die Weitergabe von Informationen über Bluetooth und die Aufrechterhaltung dieser Verbindung erleichtert. Der einfachste Weg, um mit den aktuellsten Dateien von Amazon zu beginnen, besteht darin, ihr Raspberry Pi Gadgets-Repository zu klonen. Navigieren Sie zum Verzeichnis Ihres aktuellen Projekts und führen Sie es aus

Git-Klon

Dadurch wird das gesamte Repository mit dem erforderlichen Code auf Ihren Pi geladen. Es enthält einige Beispielprojekte, die einige der Fähigkeiten von Alexa Gadgets demonstrieren. Weitere Informationen finden Sie in der Readme-Datei auf der Github-Seite.

Führen Sie ihre Setup-Funktion aus, um alles zu konfigurieren.

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

sudo python3 launch.py --setup

Folgen Sie den Anweisungen und antworten Sie mit "y", wenn Sie gefragt werden, ob Sie die Konfiguration mit Ihren Gadget-Anmeldeinformationen vornehmen möchten. Rufen Sie die Amazon-ID und das Gadget-Geheimnis von der Einrichtung Ihres Gadgets in der Entwicklerkonsole ab, da sie hier abgefragt werden. Ich habe für meinen Raspberry Pi Zero W den Übertragungsmodus "bt" gewählt. BLE wird nicht von allen älteren Echo-Geräten unterstützt, aber Sie können nachsehen, wozu Ihre Hardware in der Lage ist. Wenn Sie Ihren Pi im Desktop-Modus verwenden, empfiehlt Amazon, mit der rechten Maustaste auf das Bluetooth-Symbol oben rechts zu klicken und auf "Bluetooth" aus dem Panel entfernen" zu klicken, um Verbindungsprobleme zu vermeiden.

Hinweis: Dieser Schritt kann eine Weile dauern, je nachdem, wie viel installiert werden muss.

Jetzt haben Sie alle notwendigen Support-Dateien, um zu Ihrem Projekt zurückzukehren und die Funktionen hinzuzufügen, die die Kommunikation mit Ihrem Echo ermöglichen.

Wenn Sie möchten, können Sie den Ordner "examples" in "Alexa-Gadgets-Raspberry-Pi-Samples/src" löschen.

Sie können Ihren Projektcode haben, wo immer Sie möchten, aber ich werde dafür einen Ordner im Home-Verzeichnis erstellen, alternativ können Sie den Ordner mit dem Code von meinem Github herunterladen, nur stellen Sie sicher, dass die.ini-Dateien wie unten beschrieben bearbeitet werden.

cd /home/pi

mkdir my_project cd my_project touch my_gadget.py touch my_gadget.ini

Ich habe jetzt zwei Dateien in einem Ordner namens "my_project" erstellt. Die.ini-Datei ist wichtig. Stellen Sie sicher, dass es Folgendes enthält und ersetzen Sie es in Ihrer Amazon-ID und Ihrem Gadget-Geheimnis:

[Gadget-Einstellungen]

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

Werfen wir nun einen Blick auf die Python-Datei, bevor wir auf die Details eingehen:

json importieren

von agt importieren AlexaGadget

Klasse MeinGadget(AlexaGadget):

def _init_(selbst):

super()._init_()

def on_custom_mygadget_alexatopi(self, Anweisung):

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

def on_custom_mygadget_pitoalexa(self, Anweisung):

payload = json.loads(directive.payload.decode("utf-8")) print("Received data: " + str(payload)) payload = {'data': "Die Sonde liest " + str(get_temp(payload ['data'] ['sensor_num']['value'])) + "degrees."} self.send_custom_event('Custom. MyGadget', 'PiToAlexa', payload) MyGadget().main()

Zuerst werden Sie feststellen, dass es zwei Funktionen aufruft: write_text() und get_temp(). In meinem Code definiere ich diese Funktionen in derselben Datei, aber sie hängen von meiner Hardware ab, daher habe ich sie weggelassen. Ich habe diese Datei mit diesen Funktionen angehängt, die nur zum Drucken und Zurückgeben von Dummy-Daten definiert sind, falls Sie genau diesen Code ausführen möchten. Ich würde vorschlagen, mit genau diesem Code zu testen, bevor Sie ihn ändern, damit er mit Ihrem Projekt funktioniert. Ich habe auch die.ini-Datei angehängt, aber stellen Sie sicher, dass Sie die ID und das Gadget-Geheimnis ändern. Die Top-Funktion empfängt die von Alexa übergebenen Daten. Die untere Funktion empfängt Daten im gleichen Format, aber das Alexa-Gerät wartet fünf Sekunden, bis ein Ereignis mit seiner eigenen Nutzlast zurückgesendet wird. Diese Nutzlast ist insofern besonders, als das Alexa-Gerät seinen Inhalt spricht.

Sobald Sie diese Dateien haben, navigieren Sie zum Ordner "my_project" und führen Sie die Python-Datei aus.

sudo neu starten

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

Wenn Sie das Programm zum ersten Mal ausführen, müssen Sie es mit Ihrem Echo-Gerät koppeln. Stellen Sie sicher, dass sich Ihr Echo-Gerät in der Nähe des Raspberry Pi befindet, da wir eine Bluetooth-Verbindung zulassen müssen.

Klicken Sie in der Alexa-App auf Ihrem Mobilgerät unten rechts auf "Geräte".

Klicken Sie oben links auf "Echo & Alexa".

Klicken Sie auf Ihr Echo-Gerät.

Tippen Sie unter "DRAHTLOS" auf "Bluetooth-Geräte".

Tippen Sie auf „NEUES GERÄT KOPPELN“und Sie sollten Ihr Gadget in der Liste sehen.

Tippen Sie auf Ihr Gadget. Sie sollten den Pi-Bericht sehen, dass es erfolgreich gekoppelt wurde.

Versuchen Sie, dem Echo einen Sprachbefehl zu geben, während Sie sich die Ausgabe auf Ihrem Pi ansehen:

Sie: "Alexa, bitte mein Gerät, die Temperatur von Sensor 1 zu überprüfen"

Wenn alles richtig funktioniert hat, sollten Sie Folgendes hören:

Echo: "Die Sonde zeigt 120,505 Grad an."

Sie: "Alexa, sag meinem Gerät, es soll George Washington schreiben."

Der Pi sollte drucken:

Empfangene Daten: {'data': {'person': {'name': 'person', 'value': 'George Washington', 'confirmationStatus': 'NONE'}}}

George Washington"

Schritt 5: Einpacken

Das hier gezeigte Video ist ein Beispiel für das Gadget, das mit dem Lesen der Temperatur (derselbe Fühler in F vs. C) und dem Schreiben von Namen auf ein einfaches Display arbeitet.

Nun, da Sie hoffentlich etwas funktionierendes haben, sollten Sie versuchen, dies anzupassen, um Ihr eigenes Projekt leistungsfähiger zu machen. Denken Sie daran, dass Sie die Intents einfach in der Alexa Developer Console bearbeiten können und dass alle von Ihnen verwendeten Slots in der Payload an Ihren Pi übergeben werden. Darüber hinaus können Sie Alexa sagen lassen, was Sie möchten, indem Sie einfach die Nutzlast bearbeiten, die Sie im Ereignis von Ihrem Raspberry Pi-Code zurückgeben.

Bitte beachten Sie, dass dieses Tutorial nicht als endgültige Lösung für alle Funktionen gedacht ist, die Sie sich von einem Alexa-Gadget wünschen könnten. Es ist absichtlich darauf beschränkt, Ihnen zwei einfache Funktionen zum Übertragen von Daten in jede Richtung zwischen Alexa und einem Gadget zu bieten. Wenn Sie daran interessiert sind, komplexere Interaktionsmodelle zu erstellen, empfehle ich Ihnen, alle Readme-Dateien in https://github.com/alexa/Alexa-Gadgets-Raspberry-P zu lesen und alle darin enthaltenen Beispiele auszuprobieren. Ich würde Ihnen auch empfehlen, die Dokumentation für das Alexa Gadgets Toolkit und das Alexa Skills Kit zu lesen.

Empfohlen: