[PYTHON] Bringe Alexa den Mülltag in Nakano Ward bei, indem du Lambda verbindest

Was du machen willst

Ruft Lambda von Alexa an und gibt den Tag des Mülls in Nakano Ward zurück. Ich habe es geschrieben, damit selbst Leute, die es noch nie berührt haben, es von Grund auf neu machen können.

alexa.png

Ich habe versucht, die Entwicklung mit ALEXA einzuführen, daher werde ich sie auf meine eigene Weise zusammenfassen Ich habe es mit Bezug auf diesen Artikel gemacht. Es war sehr lehrreich, weil es ausführlich erklärt wurde, Ich bin auf dem Weg wegen einer Änderung der AWS-Spezifikationen gestolpert, daher werde ich diesen Bereich auch in diesem Artikel beschreiben.

Dinge notwendig

Alexa Skill Kit

Extrahieren Sie ** Variablen ** aus dem vom Echo empfangenen Audio Erstelle eine Fertigkeit, die an Lambda weitergegeben werden soll.

Fähigkeiten schaffen

Drücken Sie "Alexa Skills Kit" vom Amazon-Entwickler

alexa-Page-3.png

Klicken Sie in der Amazon-Entwicklerkonsole auf "Fähigkeit erstellen"

alexa-Page-2.png

Geben Sie Folgendes ein und drücken Sie "Fähigkeit erstellen"

Name der Fertigkeit: TrashDay Standardsprache: Japanisch Wählen Sie ein Modell aus, das Sie Ihrer Fähigkeit hinzufügen möchten: "Benutzerdefiniert" Wählen Sie aus, wie die Backend-Ressourcen Ihrer Fertigkeit gehostet werden sollen: Benutzerdefinierte Bereitstellung (diesmal Hosting auf Lambda unabhängig)

alexa-Page-4.png

Spitzname

Geben Sie den Rufnamen ein, um die Fertigkeit aufzurufen

Name des Fertigkeitsrufs: Thermy Gomi

"Alexa, öffne Thermy Gomie" aktiviert die Fertigkeit alexa2-Page-2.png

Steckplatztyp

Bereiten Sie die in der Anweisung enthaltenen Variablen im Voraus vor, wenn Sie die Aktion aufrufen.

Klicken Sie neben dem Steckplatztyp auf "Hinzufügen", um einen neuen zu erstellen. alexa2-Page-3.png

Setzen Sie den Namen des Steckplatztyps auf "Typ" und klicken Sie auf "Benutzerdefinierten Steckplatztyp erstellen" alexa2-Page-4.png

Die folgenden Steckplatzwerte wurden hinzugefügt. Der Wert von Alexa ist nicht wesentlich (etwas verspielt * später beschrieben). alexa2-Page-1.png

Absicht

Definiert die Aktion, die von der aufgerufenen Fertigkeit ausgeführt werden soll (= Thermy Gomi). Dieses Mal wird nur die Aktion erstellt, die auf den Tag des Mülls reagiert.

Klicken Sie neben der Absicht, eine neue zu erstellen, auf "Hinzufügen". alexa2-Page-5.png

Setzen Sie den Intent-Namen auf "TellTrashDay" und drücken Sie "Create Custom Intent" alexa2-Page-6.png

Setzen Sie den Intent-Slot-Namen auf "Typ" und wählen Sie den zuvor erstellten Slot-Typ "Typ" aus. alexa2-Page-7.png

Der Beispielrede wurde Folgendes hinzugefügt. Beachten Sie, dass nach {type} ein ** halber Abstand ** steht. alexa2-Page-8.png

Aus dem Obigen wird der Teil {Typ} als Variable extrahiert, wenn Sie eine Aussage in der Beispieläußerung machen.

AWS lambda

Hostet eine Funktion, die eine Antwort basierend auf den von Alexa übergebenen Variablen auswählt und darauf reagiert.

Eine Funktion erstellen

Wechseln Sie von der AWS-Verwaltungskonsole zum Lambda-Bildschirm und klicken Sie auf "Funktion erstellen" alexa2-Page-9.png

Wählen Sie "alexa-Skills-Kit-Color-Expert-Python" von AWS Es hat eine eingebaute Beispielanwendung, die Alexa nach ihrer Lieblingsfarbe fragt. alexa2-Page-10.png

Setzen Sie den Anwendungsnamen und TopicNameParameter auf "TrashDay" und drücken Sie "Deploy" TopicNameParameter wird in dem von CloudFormation übergebenen Parameter gespeichert. Es gibt keine Hinweise darauf, dass es in der Funktion verwendet wird, daher ist jeder Wert in Ordnung. alexa2-Page-11.png

Stellen Sie TrashDay.py bereit

Wählen Sie eine Funktion aus dem linken Menü und drücken Sie die Funktion mit dem zuvor genannten Anwendungsnamen. alexa2-Page-12.png

Wählen Sie die Lambda-Funktion aus und ersetzen Sie den Editor auf dem unteren Bildschirm durch den Inhalt von TrashDay.py. alexa2-Page-13.png

TrashDay.py


# coding:utf-8
"""
This sample demonstrates a simple skill built with the Amazon Alexa Skills Kit.
The Intent Schema, Custom Slots, and Sample Utterances for this skill, as well
as testing instructions are located at http://amzn.to/1LzFrj6

For additional samples, visit the Alexa Skills Kit Getting Started guide at
http://amzn.to/1LGWsLG
"""

from __future__ import print_function


# --------------- Helpers that build all of the responses ----------------------

###Funktion, die verwendet wird, um nach der Verarbeitung jeder Absicht zu Alexa zurückzukehren
def build_speechlet_response(title, output, reprompt_text, should_end_session):
    return {
        'outputSpeech': {
            'type': 'PlainText',
            'text': output
        },
        'card': {
            'type': 'Simple',
            'title': "SessionSpeechlet - " + title,
            'content': "SessionSpeechlet - " + output
        },
        'reprompt': {
            'outputSpeech': {
                'type': 'PlainText',
                'text': reprompt_text
            }
        },
        'shouldEndSession': should_end_session
    }

### build_speechlet_Eine Funktion, die den durch die Antwort erstellten JSON im JSON für die Antwort speichert und zurückgibt.
def build_response(session_attributes, speechlet_response):
    return {
        'version': '1.0',
        'sessionAttributes': session_attributes,
        'response': speechlet_response
    }


# --------------- Functions that control the skill's behavior ------------------

def get_welcome_response():
    """ If we wanted to initialize the session to have some attributes we could
    add those here
    """

    session_attributes = {}
    card_title = "Welcome"
    speech_output = "Hallo, das ist Thermy Gomie," \
                    "Wir werden auf den festgelegten Tag des Mülls antworten, den Sie wegwerfen möchten!" 
    
    # If the user either does not reply to the welcome message or says something
    # that is not understood, they will be prompted again with this text.
    reprompt_text = "Wir werden auf den festgelegten Tag des Mülls antworten, den Sie wegwerfen möchten!" 

    should_end_session = False
    return build_response(session_attributes, build_speechlet_response(
        card_title, speech_output, reprompt_text, should_end_session))


def handle_session_end_request():
    card_title = "Session Ended"
    speech_output = "Bitte komm wieder" 

    # Setting this to true ends the session and exits the skill.
    should_end_session = True
    return build_response({}, build_speechlet_response(
        card_title, speech_output, None, should_end_session))


# --------------- Events ------------------

def on_session_started(session_started_request, session):
    """ Called when the session starts """

    print("on_session_started requestId=" + session_started_request['requestId']
          + ", sessionId=" + session['sessionId'])


def on_launch(launch_request, session):
    """ Called when the user launches the skill without specifying what they
    want
    """

    print("on_launch requestId=" + launch_request['requestId'] +
          ", sessionId=" + session['sessionId'])
    # Dispatch to your skill's launch
    return get_welcome_response()

###Eine Funktion, die die einer Anweisung entsprechende Absicht bestimmt und zu jeder Funktion verzweigt
def on_intent(intent_request, session):
    """ Called when the user specifies an intent for this skill """

    print("on_intent requestId=" + intent_request['requestId'] +
          ", sessionId=" + session['sessionId'])

    intent = intent_request['intent']
    intent_name = intent_request['intent']['name']

    # Dispatch to your skill's intent handlers

    ###Verzweigen Sie zu jeder Absicht, einschließlich TellTrashDay
    if intent_name == "TellTrashDay":
        return set_TellTrashDay_text(intent, session)
    elif intent_name == "AMAZON.HelpIntent":
        return get_welcome_response()
    elif intent_name == "AMAZON.CancelIntent" or intent_name == "AMAZON.StopIntent":
        return handle_session_end_request()
    else:
        raise ValueError("Invalid intent")


def on_session_ended(session_ended_request, session):
    """ Called when the user ends the session.

    Is not called when the skill returns should_end_session=true
    """
    print("on_session_ended requestId=" + session_ended_request['requestId'] +
          ", sessionId=" + session['sessionId'])
    # add cleanup logic here


# --------------- Main handler ------------------
###Die erste Funktion, die ausgeführt wird, wenn Lambda aufgerufen wird
###Anforderungsinformationen an Lambda werden im Ereignis gespeichert
def lambda_handler(event, context):
    """ Route the incoming request based on type (LaunchRequest, IntentRequest,
    etc.) The JSON body of the request is provided in the event parameter.
    """
    # get applicationId from request.json
    print("event.session.application.applicationId=" +
          event['session']['application']['applicationId'])

    """
    Uncomment this if statement and populate with your skill's application ID to
    prevent someone else from configuring a skill that sends requests to this
    function.
    """
    # if (event['session']['application']['applicationId'] !=
    #         "amzn1.echo-sdk-ams.app.[unique-value-here]"):
    #     raise ValueError("Invalid Application ID")

    if event['session']['new']:
        on_session_started({'requestId': event['request']['requestId']},
                           event['session'])
    ###Ruft nur Fertigkeitsnamen auf und wird ausgeführt, wenn keine Absicht enthalten ist
    if event['request']['type'] == "LaunchRequest":
        return on_launch(event['request'], event['session'])
    ###Wird ausgeführt, wenn der Benutzer eine der Absicht entsprechende Anweisung abgibt
    elif event['request']['type'] == "IntentRequest":
        return on_intent(event['request'], event['session'])
    ###Wird beim Beenden ausgeführt, wenn keine Antwortabsicht vorliegt, oder bei einem Fehler
    elif event['request']['type'] == "SessionEndedRequest":
        return on_session_ended(event['request'], event['session'])


###Eine Funktion, die den Garbage Day zurückgibt, der dem Slot-Typ entspricht
def set_TellTrashDay_text(intent, session):
    """ Sets the color in the session and prepares the speech to reply to the
    user.
    """

    card_title = intent['name']
    session_attributes = {}
    should_end_session = False
    speech_output = "Sag es schnell, du kannst dich in einen Müllkorb werfen"

    ###Brennende Müllliste
    burn_list = ['brennen', 'Roh', 'Aus Altpapier']
    ###Nicht brennende Müllliste
    notburn_list = ['Nicht brennbar', 'Aus Kunststoff', 'Plastik', 'Plastik']
    ###Aluminium kann Müllliste
    can_list = ['Aus Aluminiumdose', 'Aluminiumdosen', 'Von leeren Dosen', 'Von PET-Flaschen', 'Von der Flasche', 'Können', 'können', 'スチールKönnen']
    ###Pappmüllliste
    paper_list = ['Karton', 'Zeitung', 'Aus Altpapier', 'Papier-', 'Papier-']
    ###Liste gefährlicher Abfälle
    glass_list = ['Aus Glas', 'Metall', 'Von Keramik']
    ###Wenn du sagst
    alexa_list = ['Alexa', 'Alexa']

    if 'type' in intent['slots']:
        ### 3rd part was 'name' so changed to 'value'
        trash_type = intent['slots']['type']['value'] 

        if trash_type in burn_list:
            speech_output = 'Dienstag und Freitag'
        elif trash_type in notburn_list:
            speech_output = 'Es ist Montag'
        elif trash_type in can_list:
            speech_output = 'Es ist Mittwoch'
        elif trash_type in paper_list:
            speech_output = 'Es ist Montag'
        elif trash_type in glass_list:
            speech_output = 'Es ist Samstag'
        elif trash_type in alexa_list:
            speech_output = 'Ich denke, ich möchte Weltraummüll sein'
    else:
        speech_output = "Es tut mir leid, ich weiß nicht, was du sagst"

    print(speech_output)
    reprompt_text = speech_output
    return build_response(session_attributes, build_speechlet_response(
        card_title, speech_output, reprompt_text, should_end_session))

Geben Sie das Alexa Skills Kit als Auslöser an

Drücken Sie Trigger hinzufügen alexa2-Page-14.png

Kehren Sie zur Alexa-Entwicklerkonsole zurück und kopieren Sie die Skill-ID vom Endpunkt alexa2-Page-16.png

Kehren Sie zu AWS zurück, wählen Sie "Alexa Skills Kit" aus, fügen Sie die kopierte Skill-ID ein und klicken Sie auf "Hinzufügen" alexa2-Page-15.png

Wenn es normal hinzugefügt wird, ist die Einstellung auf der Lambda-Seite abgeschlossen. Noch ein Atemzug.

Geben Sie Lambda als Endpunkt an

Geben Sie abschließend die Lambda-Funktion an, die zuvor auf der Alexa-Seite erstellt wurde.

Kopieren Sie die ARN oben auf dem AWS-Lambda-Bildschirm alexa2-Page-18.png

In die Standardregion der Alexa-Endpunkte einfügen alexa2-Page-17.png

Drücken Sie Endpunkt speichern

Nachdem alle Einstellungen abgeschlossen sind, speichern Sie das Modell und erstellen Sie das Modell. alexa2-Page-19.png

Prüfung

Testen Sie die alexa Entwicklerkonsole, um festzustellen, ob sie funktioniert.

Die Phase, in der der Fähigkeitstest aktiviert ist, wurde auf "In Entwicklung" geändert alexa2-Page-20.png

Aktivieren Sie die Fertigkeit und probieren Sie die Aktion aus, die Sie der Absicht hinzugefügt haben. alexa2-Page-21.png

Es funktionierte! !!

Der Humor ist perfekt. alexa2-Page-22.png

Übrigens, auch wenn Sie Ihre Fähigkeiten nicht im Laden veröffentlichen Mit meinem Echo konnte ich die Fähigkeit nutzen, ohne etwas einzustellen. (Als ich im Browser testete, antwortete mein Echo und ich war überrascht, lol) Es scheint, dass es automatisch mit Ihrem Amazon-Konto verknüpft wird.

Fehlerbehebung

Codierungsfehler, wenn die Lambda-Funktion Japanisch enthält

# Coding: utf-8 wird am Anfang des Codes hinzugefügt, damit Japanisch gelesen werden kann.

Wenn es nicht funktioniert

Da die JSON-Eingabe auf dem Alexa-Testbildschirm angezeigt wird, können Sie die Ursache eingrenzen, indem Sie sie in den Lambda-Test kopieren und versuchen.

Recommended Posts

Bringe Alexa den Mülltag in Nakano Ward bei, indem du Lambda verbindest
"Müll nach Bild klassifizieren!" App-Erstellungstagebuch Tag4 ~ Bereiten Sie das Frontend mit Bootstrap ~ vor