[PYTHON] Erreiche "Bals" mit Amazon Echo

Dieser Beitrag ist Ich werde es dieses Jahr wieder tun! AWS Lambda Tied Up Adventskalender 2015 --Qiita ist der Artikel zum 18. Tag. Lambda gefesselt, aber dieser Artikel enthält viele Zutaten in Amaozon Echo, Alexa Skills Kit ...

Was ist Barus?

Unnötig zu sagen, die schrecklichen Worte der Zerstörung in der Welt. Der Vorfahr hat bereits einen Befehl erstellt, um die Zerstörung zu begrenzen und der Welt zugänglich zu machen https://github.com/qphoney/balus Dieses Mal bin ich nicht so rücksichtslos.

Was ist Amazon Echo?

Es kann Fragen beantworten und durch Spracherkennung mit Diensten zusammenarbeiten. Sie können Funktionen mithilfe des Amazon Skills Kit hinzufügen. Fähigkeiten von Drittanbietern können von einer dedizierten Site aus überprüft, installiert und verwendet werden. https://youtu.be/7Jc82wIL7m4 IMAGE ALT TEXT HERE

Was ist das Amazon Skills Kit?

Alexa ist ein Cloud-basierter Spracherkennungsdienst, der von [Amazon Echo] verwendet wird (https://www.youtube.com/watch?v=KkOCeAtKHIc). Das Alexa Skill Kit bietet die Umgebung, die Sie zum einfachen Erstellen der Funktionen (Skills) benötigen, die Alexa verwenden kann. Schauen Sie sich das Amazon Alexa Skills Kit an

Erstellen Sie eine Lambda-Funktion für das Alexa Skills Kit (ASK)

Lambda wird neulich in re: Invent zu Python Es wurde angekündigt, dass es unterstützt wird, aber Lambda kann jetzt mit ASK-Funktionen verwendet werden. Da ASK jedoch nur die Region "us-east-1" unterstützt, wird die ASK-Vorlage in anderen Regionen nicht in der Lambda-Vorlagenliste angezeigt.

スクリーンショット 2015-12-15 16.35.37.png

Dieses Mal habe ich diese Vorlage ein wenig geändert und Barus implementiert.

# -*- coding: utf-8 -*-
from __future__ import print_function
import boto3
from time import gmtime, strftime

client = boto3.client('ec2')

#Einstiegspunkt
def lambda_handler(event, context):
    print(strftime('%a, %d %b %Y %H:%M:%S +0000', gmtime()))
    print(event)

    if event['request']['type'] == "LaunchRequest":
        #Bitte, die Fertigkeit zu starten
        return on_launch(event['request'], event['session'])
    elif event['request']['type'] == "IntentRequest":
        #Absichtlicher Anruf
        return on_intent(event['request'], event['session'])

    print("nothing and finish")
    return get_finish_response()

def on_launch(launch_request, session):
    #Holen Sie sich das Wort der Magie
    return get_charm_response()

def on_intent(intent_request, session):

    intent = intent_request['intent']
    intent_name = intent_request['intent']['name']
    #Wenn Sie die Worte der Zerstörung nicht einschließen, sind Sie fertig
    if 'Barusu' not in intent['slots'] or \
       'value' not in intent['slots']['Barusu'] or \
       not intent_name == "RunHorobi":
        return get_finish_response()
    
    print(intent['slots']['Barusu']['value'])

    stop_instance()
    return get_horobi_response()

#Generieren Sie eine Zauberwortantwort
def get_charm_response():

    session_attributes = {}
    card_title = "Charm"
    audio_url = "https://url/to/your/audio.mp3"
    should_end_session = False
    return build_response(session_attributes, build_audio_response(
        card_title, speech_output, audio_url, should_end_session))

#Generieren Sie eine Antwort, die zurückkehrt, wenn das Wort der Zerstörung gesprochen wird
def get_horobi_response():

    session_attributes = {}
    card_title = "Horobi"
    speech_output = "Megaaaaa!"
    reprompt_text = speech_output
    should_end_session = True
    return build_response(session_attributes, build_speechlet_response(
        card_title, speech_output, reprompt_text, should_end_session))

#Generieren Sie eine Antwort, wenn nichts getan wird
def get_finish_response():

    session_attributes = {}
    card_title = "Words that should not be used"
    speech_output = "Don't say the word of horobee"
    reprompt_text = speech_output
    should_end_session = True
    return build_response(session_attributes, build_speechlet_response(
        card_title, speech_output, reprompt_text, should_end_session))

#Holen Sie sich eine Instanz, um in Barth anzuhalten
def get_instances():
    response = client.describe_instances(
        Filters=[
            {
                'Name': 'tag-value','Values': [
                    'laputa',
                ]
            }
        ]
    )
    instance_ids = []
    for res in response['Reservations']:
        for item in res['Instances']:
            instance_ids.append(item['InstanceId'])
    return instance_ids

#Instanz starten
def start_instance():
    print('start_instance')
    response = client.start_instances(
        InstanceIds=get_instances()
    )

#Beenden Sie die Instanz
def stop_instance():
    print('stop_instance')
    response = client.stop_instances(
        InstanceIds=get_instances()
    )

#Generieren Sie JSON für den Rückgabewert
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
    }

#Generieren Sie den Rückgabewert JSON im SSML-Format
def build_audio_response(title, output, audio_url, should_end_session):
    return {
        'outputSpeech': {
            'type': 'SSML',
            'ssml': '<speak><audio src="{0}" /></speak>'.format(audio_url)
        },
        'card': {
            'type': 'Simple',
            'title': 'SessionSpeechlet - ' + title,
            'content': 'SessionSpeechlet - ' + output
        },
        'reprompt': {
            'outputSpeech': {
                'type': 'SSML',
                'ssml': '<speak><audio src="{0}" /></speak>'.format(audio_url)
            }
        },
        'shouldEndSession': should_end_session
    }

#Gesamtrückgabewert
def build_response(session_attributes, speechlet_response):
    return {
        'version': '1.0',
        'sessionAttributes': session_attributes,
        'response': speechlet_response
    }

Sprechen Sie in diesem Skript mit "Alexa, run laputa" und Amazon Echo und sie werden im Falle von Problemen die magische "Lite Latobarita Urs Ariaros Bar Netril" beantworten.

Alexa Skills gibt den Text zurück und spricht über Amazon Echo und SSML (Speech Synthesis Markup Language). Es gibt eine Möglichkeit, mit Sprachsynthese-Markup-Sprache-SML-Referenz zu sprechen, aber [die Ankündigung des anderen Tages](https://developer.amazon.com/public/community/post/Tx3FXYSTHS579WO/Announcing-New- Alexa-Skills-Kit-ASK-Funktionen-SSML-Audio-Tags-und-Entwickler-Porta) kann jetzt beliebige Audiodaten verarbeiten. Die Aussprache von Alexa basiert auf Englisch, daher spezifiziere ich die sprachsynthetisierte MP3-Datei mit SSML. (Bei build_audio_response)

Einschränkungen für Audiodateien

Die Audiodateien, die Amazon Echo abspielen kann, unterliegen kleinen Einschränkungen und müssen im folgenden Format vorliegen.

Wenn Sie ffmpeg auf einem Mac verwenden, führen Sie den folgenden Befehl aus

ffmpeg -i input.mp3 -ac 2 -codec:a libmp3lame -b:a 48k -ar 16000 output.mp3

Fügen Sie Alexa Skills hinzu

Skill information https://developer.amazon.com/edw/home.html#/ Wählen Sie "Alexa Skills Kit" aus dem Dashboard und registrieren Sie ein neues unter "Add a New Skill". スクリーンショット 2015-12-15 18.09.39.png Wählen Sie Lambda in Endpoint und geben Sie die ARN der gerade erstellten Lambda-Funktion an.

Intent Schema

{
  "intents": [
    {
      "intent": "RunHorobi",
      "slots": [
        {
          "name": "Barusu",
          "type": "LIST_OF_BARUSU"
        }
      ]
    }
  ]
}

Legen Sie die Definition des Schlüsselworts fest, das der Absicht zugeordnet ist (Funktion auf der Lambda-Funktionsseite).

Custom Slot Types

barusu
bars
barus
barsu

Registrieren Sie das entsprechende Schlüsselwort. (Soweit ich auf dem Workshop gehört habe, scheint es jedoch unvermeidlich, dass die Lambda-Funktion als Reaktion auf Schlüsselwörter ausgelesen wird, die hier nicht registriert sind.)

Sample Utterances

RunHorobi {Barusu}

Es gibt an, welche Absicht gemäß dem gesprochenen Wort angerufen werden soll. Es gibt verschiedene Muster, wie der Benutzer tatsächlich spricht. Wenn Sie also davon ausgehen und mehrere Sätze mit der Absicht verknüpfen, ist es für die ASK-Seite einfacher, diese zu identifizieren.

Prüfung

ASK verfügt über einen Mechanismus, mit dem Sie Skill testen können, ohne Amazon Echo zu verwenden. スクリーンショット 2015-12-15 19.06.37.png Sie können damit Lambda-Funktionen testen, damit Sie beim Debuggen nicht mit Echo sprechen müssen. Klicken Sie unten rechts auf die Wiedergabetaste, um den Rücktext zu sprechen. (SSML wird derzeit jedoch nicht unterstützt.)

Tatsächliche Maschinenbestätigung

Sie können die tatsächlich gesprochenen Wörter und die Ergebnisse im Dashboard auf dem als Ihr Gerät registrierten Echo überprüfen. .. スクリーンショット 2015-12-15 19.11.29.png

https://youtu.be/7Jc82wIL7m4 IMAGE ALT TEXT HERE

Zusammenfassung

Mit Amazon Echo können Sie jetzt realistischere "Bals" erstellen. (Wenn Sie einen Spracherkennungsstein haben, werden Sie sich aufgeregter fühlen) Amazon Echo unterstützt jedoch noch kein Japanisch, daher ist der Ausdruck "Augen!" Zu enttäuschend. Ich hoffe, Sie werden so schnell wie möglich antworten.

Ernsthafte Geschichte

Jetzt, da Lambda in Python geschrieben werden kann, ist es viel einfacher, persönlich zu codieren. Mit den zusätzlichen Fähigkeitstests und Simulatoren ist es jetzt möglich, ohne Amazon Echo ziemlich gut zu bauen.

Recommended Posts

Erreiche "Bals" mit Amazon Echo
Gesichtserkennung durch Amazon Rekognition
Bereiten Sie die Pipenv-Umgebung mit Amazon Linux 2 vor
Senden Sie E-Mails automatisch mit Amazon SES
Mit Amazon Transcribe erstellte Untertiteldaten
Realisieren Sie eine Netflix-ähnliche Benutzeroberfläche mit FlexSlider2
Erzielen Sie mit Tensorflow eine Pytorch-Reflexionspolsterung