Tabla de contenido:

Agregue un control personalizado de Alexa al proyecto Raspberry Pi: 5 pasos
Agregue un control personalizado de Alexa al proyecto Raspberry Pi: 5 pasos

Video: Agregue un control personalizado de Alexa al proyecto Raspberry Pi: 5 pasos

Video: Agregue un control personalizado de Alexa al proyecto Raspberry Pi: 5 pasos
Video: TODO ESTO PUEDES HACER CON UNA RASPBERRY PI 😈💻 2024, Mes de julio
Anonim
Agregar control de Alexa personalizado al proyecto Raspberry Pi
Agregar control de Alexa personalizado al proyecto Raspberry Pi

Este proyecto está destinado a cualquiera que tenga un proyecto Raspberry Pi que utilice Python y desee agregar control por voz a través de sus dispositivos Amazon Echo existentes. No necesita ser un programador experimentado, pero debe sentirse cómodo usando la línea de comandos y adaptando el código existente para satisfacer sus necesidades.

Inicialmente me propuse un proyecto para permitir que mi Raspberry Pi se controlara por voz con Alexa para que pudiera calentar agua en un hervidor a una temperatura específica. Aunque la interacción que quería era bastante simple (pasar un número de Alexa a la Raspberry Pi), tomó mucho trabajo llegar a ese estado a partir de los tutoriales existentes. Espero que este tutorial haga que el proceso sea lo más rápido posible para otros.

En mi ejemplo, empiezo con una Raspberry Pi Zero W con Raspbian. Tengo un programa Python3 en mi Pi que es capaz de escribir texto en una pantalla SPI y tengo una sonda de termómetro que puedo leer. Para ti, este programa podría ser casi cualquier cosa, pero la idea es que tengas algunos dispositivos de entrada que quieras leer a través de Alexa y / o algunos dispositivos de salida que quieras controlar usando Alexa.

El objetivo es pasar de un programa básico como el descrito anteriormente a un dispositivo que puedas controlar fácilmente con mi Echo. Suponiendo que ya tenga este hardware, este proyecto no debería costarle dinero. Al final, llegará al punto en el que podrá decir cosas como:

Yo: "Alexa, pídele a mi dispositivo que compruebe la temperatura en el sensor 1".

Respuesta de Alexa: "La sonda lee 72,31 grados".

o

Yo: "Alexa, dile a mi dispositivo que escriba George Washington"

Respuesta: La pantalla conectada a mi Raspberry Pi ahora dice "George Washington"

En la siguiente sección, describiré lo que debe suceder detrás de escena para que esto funcione. Si solo desea que esto funcione en su proyecto y no le importa cómo funciona, no dude en omitirlo (aunque podría hacerlo más difícil si algo sale mal).

Paso 1: antecedentes

Fondo
Fondo

En esta imagen (crédito: https://developer.amazon.com/en-US/docs/alexa/alex… podemos ver la arquitectura general de los gadgets de Alexa.

Cuando le dices algo a tu dispositivo Echo, envía el audio a Alexa Cloud, donde se procesa y donde se genera una respuesta para responderte. Cuando preguntas qué tiempo hace, son solo estos dos los que se comunican. Ahora suponga que desea agregar control por voz a uno de sus pequeños proyectos en una Raspberry Pi. Procesar todo a bordo requeriría un hardware significativo y una base de código muy sofisticada para que todo funcione. Una mejor solución sería aprovechar Alexa Cloud, que es muy sofisticada y se ha vuelto muy buena para manejar patrones de voz complejos. Los gadgets de Alexa proporcionan una buena forma de hacer esto.

Un gadget de Alexa se comunica con un dispositivo Echo mediante bluetooth. Una vez que se establece esta conexión, los dos se pasan mensajes utilizando la codificación UTF-8. Cuando Echo pasa algo al dispositivo, se denomina directiva. La otra dirección se denomina evento. Antes de entrar en el flujo exacto de todo esto, debemos introducir otro elemento clave: las habilidades personalizadas de Alexa.

Alexa permite a los desarrolladores crear sus propias habilidades personalizadas, lo que les permite diseñar sus propias interacciones y comportamientos para usar en todos los dispositivos Echo. Por ejemplo, un desarrollador podría crear una habilidad personalizada para indicarle la distancia entre dos aeropuertos en los EE. UU. Un usuario diría: "Alexa, pregúntale a mi calculadora de distancia personalizada cuál es la distancia entre LAX y JFK" y podría responder con "2475 millas". ¿Como hace esto? Cuando un desarrollador crea una habilidad personalizada, define lo que se llama "intenciones personalizadas" con "expresiones de muestra" que contienen "espacios". Por ejemplo, en esta habilidad podría tener la intención "calc_dist" para calcular la distancia entre dos puntos. Un enunciado de muestra sería "cuál es la distancia entre {slot1} y {slot2}" o "qué tan lejos entre {slot1} y {slot2}". Las ranuras que se muestran entre paréntesis tienen tipos específicos. En este caso, esos tipos serían códigos de aeropuerto como LAX, JFK, BOS, ATL. Cuando un usuario solicita la habilidad personalizada, Alexa Cloud intenta hacer coincidir lo que dice el usuario con una intención personalizada utilizando las expresiones de muestra proporcionadas e intenta encontrar valores de espacio válidos para esa solicitud. En este ejemplo, encontraría que el usuario quería la intención "calc_dist" y que slot1 es LAX y slot2 es JFK. En este punto, Alexa Cloud pasa el trabajo al propio código del desarrollador. Básicamente, les dice al código de los desarrolladores qué intención recibió y cuáles fueron todos los valores de las ranuras, entre otros detalles.

El desarrollador decide dónde reside su código, pero una opción muy popular es utilizar una función de AWS Lambda. Si no sabe qué es eso, es esencialmente un servicio que le permite cargar código que se puede ejecutar en cualquier momento y luego le cobra solo por la cantidad de tiempo que se ejecuta su código. Si continuamos con nuestro ejemplo, el código del desarrollador podría ser una función de Python que recibe los dos códigos de aeropuerto, busca sus ubicaciones, calcula las distancias y luego envía una respuesta a Alexa Cloud para decirle algo al usuario. Alexa Cloud luego enviaría esa información de voz al dispositivo del usuario y obtendría la respuesta.

Ahora podemos volver al gadget. Podemos crear habilidades personalizadas que están diseñadas para funcionar específicamente con dispositivos. Un desarrollador puede escribir una habilidad que envía una directiva a un dispositivo conectado. Esa directiva tiene una carga útil que se puede usar sin embargo el dispositivo la necesita. Esa habilidad también puede enviar una directiva y luego escuchar un evento desde el dispositivo para que el código de la habilidad pueda tener acceso a la información enviada desde el dispositivo.

Establecer este flujo permite crear una herramienta muy poderosa porque los dispositivos económicos pueden tener la capacidad de comunicarse con el código en la nube y responder a los comandos de voz utilizando algunos de los mejores reconocimientos de voz disponibles.

Cabe señalar que la mayoría de las habilidades permiten varias formas de interactuar con ellas. Por ejemplo, un usuario puede saltar directamente a una intención diciendo "Alexa, pregúntale a mi calculadora de distancia personalizada cuál es la distancia entre LAX y JFK" (llamada invocación única) o simplemente puede usar una intención de lanzamiento: "Alexa, abrir mi calculadora de distancia personalizada ". Este último ejemplo normalmente sería seguido por Alexa respondiendo con un mensaje para obtener más información. Este tutorial omite intencionalmente el soporte para este último. Más específicamente, sin modificar la función Lambda, solo puede invocar la habilidad mediante una invocación única. Esta elección de diseño permite que el modelo sea más simple (no tiene que admitir intenciones de lanzamiento o flujo de conversación), y he descubierto que normalmente quiero interactuar con mis dispositivos utilizando invocaciones únicas de todos modos, ya que suelen ser más rápidos.

Paso 2: registre el gadget en la consola de desarrollo del servicio de voz de Alexa

La siguiente es una descripción de los pasos necesarios. He creado un video equivalente que muestra cómo realizar todos estos pasos. Puede utilizar uno o ambos para completar este paso.

  1. Vaya a
  2. Si aún no tiene una cuenta gratuita, cree una
  3. Haga clic en "Productos"
  4. Complete las etiquetas y seleccione "Alexa Gadget"
  5. Complete lo que desee para el resto de los campos
  6. Haga clic en Finalizar

Paso 3: cree la función AWS Lambda y la habilidad personalizada

Cree habilidades personalizadas en la consola de desarrollo del kit de habilidades de Alexa

El código para este tutorial se puede encontrar aquí

Antes de completar este paso, deberá crear un archivo.zip que contenga el paquete de implementación para la función AWS Lambda, como se muestra en el tutorial aquí.

  1. Descargue la carpeta "lambda" de mi Github que contiene "lambda_function.py" y "requirements.txt"
  2. Abra la terminal y cambie el directorio actual para que esté dentro de esta carpeta.
  3. Ejecute la siguiente secuencia:

pip install -r requirements.txt -t skill_env

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

Su archivo.zip ahora se ubicará en el directorio donde estaba la carpeta lambda y se llamará "skill-code.zip".

Una nota sobre el costo de hospedaje en AWS: este tutorial requiere que tenga una cuenta de AWS (de libre creación). Las funciones Lambda cuestan dinero, sin embargo, su precio actual en la región de Virginia del Norte es de $ 0.000000208 por uso de 100 ms con 128 MB de memoria. Como referencia, cada invocación de mi habilidad factura alrededor de 800 ms de uso en este nivel. Para acumular una factura de $ 1.00 USD, tendría que invocar esta función unas 600, 000 veces, lo que (si le toma 5 segundos por invocación) le tomaría más de 34 días sin parar llamando a su función. El costo no debería ser un problema importante a menos que publique su habilidad y una gran cantidad de personas comience a usarla. Si le preocupa recibir facturas en AWS, considere configurar alarmas de uso que le notifiquen si el uso supera un umbral definido.

La siguiente es una descripción de los pasos necesarios. He creado un video equivalente que muestra cómo realizar todos estos pasos. Puede utilizar uno o ambos para completar este paso.

  1. Vaya a https://aws.amazon.com/ e inicie sesión en la consola o cree una cuenta gratuita si no tiene una.
  2. Busque y haga clic en Lambda en servicios
  3. Haga clic en "Crear función"
  4. Seleccione "Autor desde cero", asígnele un nombre y elija la última versión de Python 3 para el tiempo de ejecución.
  5. Cambie "editar código en línea" por "cargar un archivo.zip" y seleccione el archivo.zip creado arriba
  6. En una nueva ventana, vaya a https://developer.amazon.com/alexa/console/ask e inicie sesión
  7. Haga clic en "Crear habilidad"
  8. Etiquételo, elija el modelo "Personalizado" y "Aprovisione el suyo" y haga clic en "Crear habilidad"
  9. Haga clic en "Comenzar desde cero" y haga clic en "Elegir"
  10. En "Intenciones", haz clic en "Agregar".
  11. Cree una intención personalizada llamada "alexa_to_pi" y complete "write {person}" como una expresión de muestra
  12. Crea un espacio de intención llamado "persona" con el tipo "AMAZON. Person"
  13. Cree una intención personalizada llamada "pi_to_alexa" y complete "verifique la temperatura del sensor {sensor_num}
  14. Cree un espacio de intención llamado "sensor_num" con el tipo "AMAZON. NUMBER"
  15. En Interfaces, active "Controlador de interfaz personalizado".
  16. En Endpoint, seleccione "AWS Lambda ARN" y copie "Your Skill ID"
  17. Vuelva a la consola de AWS
  18. Haga clic en "Agregar activador"
  19. Seleccione "Kit de habilidades de Alexa", marque "Habilitar" en la verificación de ID de habilidad, pegue la ID de habilidad que acaba de copiar y haga clic en agregar
  20. Copie el ARN de Lambda en la esquina superior derecha
  21. Vuelva a la Consola de desarrollador de Alexa y pegue el ARN de Lambda en el campo "Región predeterminada".
  22. En Invocación, establezca el nombre de la invocación de la habilidad como "mi gadget".
  23. Haga clic en "Guardar modelo" y luego en "Crear modelo"
  24. Haga clic en "Probar" en las pestañas superiores y cambie el selector de "Desactivado" a "Desarrollo".
  25. Tenga en cuenta que los registros de la función Lambda se encuentran en el servicio "CloudWatch" en AWS.

Paso 4: configura el código en tu Raspberry Pi

Para que su Raspberry Pi se comunique con el dispositivo Alexa, necesita algún código para facilitar el paso de información a través de bluetooth y mantener esa conexión, además de algunos otros archivos. La forma más fácil de comenzar con los archivos más actualizados de Amazon es clonar su repositorio Raspberry Pi Gadgets. Navegue al directorio de su proyecto actual y ejecute

clon de git

Esto cargará todo su repositorio con todo el código necesario en su Pi. Tiene algunos proyectos de ejemplo que muestran algunas de las capacidades de Alexa Gadgets. Si desea obtener más información, consulte el archivo Léame en su página de Github.

Ejecute su función de configuración para configurar todo.

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

sudo python3 launch.py --setup

Siga las indicaciones y responda "y" cuando se le pregunte si desea configurar utilizando sus credenciales de gadget. Recuerde el ID de Amazon y el secreto del gadget de la configuración de su gadget en la consola del desarrollador, ya que se le pedirá aquí. Elegí el modo de transmisión "bt" para mi Raspberry Pi Zero W. BLE no es compatible con todos los dispositivos Echo más antiguos, pero puedes buscar de qué es capaz tu hardware. Si está utilizando su Pi en modo de escritorio, Amazon recomienda hacer clic con el botón derecho en el icono de bluetooth en la parte superior derecha y hacer clic en "Eliminar" Bluetooth "del panel" para evitar problemas de conectividad.

Nota: este paso puede llevar un tiempo dependiendo de la cantidad que deba instalarse.

Ahora tendrá todos los archivos de soporte necesarios para volver a su proyecto y comenzar a agregar las funciones para permitir la comunicación con su Echo.

Si lo desea, puede eliminar la carpeta "ejemplos" en "Alexa-Gadgets-Raspberry-Pi-Samples / src"

Puede tener el código de su proyecto donde quiera, pero crearé una carpeta en el directorio de inicio para él, alternativamente, puede descargar la carpeta con el código de mi Github, solo asegúrese de editar los archivos.ini como se describe a continuación.

cd / home / pi

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

Ahora he creado dos archivos en una carpeta llamada "my_project". El archivo.ini es importante. Asegúrese de que contenga lo siguiente y sustitúyalo en su ID de Amazon y Gadget Secret:

[GadgetSettings]

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

Ahora, echemos un vistazo al archivo de Python antes de entrar en detalles:

importar json

desde agt import AlexaGadget

clase MyGadget (AlexaGadget):

def _init _ (yo):

super ()._ init _ ()

def on_custom_mygadget_alexatopi (self, directive):

payload = json.loads (directive.payload.decode ("utf-8")) print ("Datos recibidos:" + str (payload)) write_text (str (payload ['datos'] ['persona'] ['valor ']))

def on_custom_mygadget_pitoalexa (self, directive):

payload = json.loads (directive.payload.decode ("utf-8")) print ("Datos recibidos:" + str (payload)) payload = {'data': "La sonda lee" + str (get_temp (payload ['datos'] ['sensor_num'] ['valor'])) + "grados."} self.send_custom_event ('Custom. MyGadget', 'PiToAlexa', payload) MyGadget (). main ()

Primero notará que llama a dos funciones: write_text () y get_temp (). En mi código, defino estas funciones en el mismo archivo, pero dependen de mi hardware, por lo que he optado por omitirlas. He adjuntado este archivo con esas funciones definidas para imprimir y devolver datos ficticios en caso de que desee ejecutar este código exacto. Sugeriría probar con este código exacto antes de modificarlo para que funcione con su proyecto. También he adjuntado el archivo.ini, pero asegúrese de ingresar y cambiar la ID y el secreto del gadget. La función superior recibe datos transmitidos desde Alexa. La función inferior recibe datos en el mismo formato, pero el dispositivo Alexa esperará cinco segundos para que se devuelva un evento con su propia carga útil. Esta carga útil es especial porque el dispositivo Alexa hablará su contenido.

Una vez que tenga estos archivos, navegue hasta la carpeta "my_project" y ejecute el archivo python.

sudo reiniciar

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

Si es la primera vez que ejecuta el programa, deberá emparejarlo con su dispositivo Echo. Asegúrese de que su dispositivo Echo esté cerca de la Raspberry Pi, ya que necesitamos permitir una conexión bluetooth.

En la aplicación Alexa de su dispositivo móvil, haga clic en "dispositivos" en la esquina inferior derecha.

Haz clic en "Echo y Alexa" en la parte superior izquierda.

Haga clic en su dispositivo Echo.

En "INALÁMBRICO", toca "Dispositivos Bluetooth".

Toca "EMPAREJAR UN DISPOSITIVO NUEVO" y deberías ver tu dispositivo en la lista.

Toca tu gadget. Debería ver el informe de Pi de que se emparejó correctamente.

Mientras observa la salida en su Pi, intente darle un comando de voz al Echo:

Tú: "Alexa, pídele a mi dispositivo que verifique la temperatura del sensor uno"

Si todo funcionó correctamente, debería escuchar:

Eco: "La sonda lee 120,505 grados".

Tú: "Alexa, dile a mi dispositivo que escriba George Washington".

El Pi debería imprimir:

Datos recibidos: {'datos': {'persona': {'nombre': 'persona', 'valor': 'George Washington', 'confirmStatus': 'NONE'}}}

George Washington"

Paso 5: Conclusión

El video que se muestra aquí es un ejemplo del dispositivo que trabaja leyendo la temperatura (la misma sonda en F vs. C) y escribiendo nombres en una pantalla simple.

Ahora que, con suerte, tiene algo funcionando, debería intentar personalizarlo para que su propio proyecto sea más capaz. Recuerde que puede editar fácilmente las intenciones en la Consola de desarrollador de Alexa y que todas las ranuras que use se pasarán a su Pi en la carga útil. Además, puede hacer que Alexa diga lo que quiera simplemente editando la carga útil que devuelve en el evento desde su código Raspberry Pi.

Tenga en cuenta que este tutorial no pretende ser la solución final para todas las capacidades que podría desear con un gadget de Alexa. Está intencionalmente limitado para brindarle dos funciones simples para pasar datos en cada dirección entre Alexa y un Gadget. Si está interesado en crear modelos de interacción más sofisticados, le animo a leer todos los archivos Léame en https://github.com/alexa/Alexa-Gadgets-Raspberry-P… y probar todos los ejemplos que proporcionan.. También le sugiero que lea la documentación de Alexa Gadgets Toolkit y Alexa Skills Kit.

Recomendado: