Lex | python3Xのブログ

python3Xのブログ

ここでは40代、50代の方が日々の生活で役に立つ情報や私の趣味であるプログラム、Excelや科学に関する内容で投稿する予定です。

対話型Bot

残念ながら日本語には対応していないそうです

チョット再生するのが面倒くさいです

m(__)m

 

注文者:ice

Bot: corn or cup?

注文者:cup

Bot: Vanilla, chocolate or strawberry ?

注文者:vanilla

Bot: OK, vanilla ice in cup

Flaver   :    vanilla

Container : cup

 

こちらは文字でボットと会話するためのコードです

import boto3
import time
# IAMサービスクライアントを作成する
iam = boto3.client('iam')
# サービスにリンクされたロールを作成する
iam.create_service_linked_role(AWSServiceName='lex.amazonaws.com')
# Lexサービスクライアントを作成する
lex = boto3.client('lex-models', 'us-east-1')
 # フレーバーのスロットタイプを作成する
flavor_slot_type = lex.put_slot_type(   
    name='FlavorSlotType',
    enumerationValues=[   # スロットが取り得る値
        {'value': 'vanilla'},
        {'value': 'chocolate', 'synonyms': ['choc']},
        {'value': 'strawberry', 'synonyms': ['berry']}
    ],
    valueSelectionStrategy='TOP_RESOLUTION',,   # 値を選択する方策
    createVersion=True)  # バージョンの作成(少なくとも1個は作成しなければならない)
print('slot type:', flavor_slot_type['name'])
# 容器のスロットタイプを作成する
container_slot_type = lex.put_slot_type(   
    name='ContainerSlotType',
    enumerationValues=[
        {'value': 'corn'},
        {'value': 'cup'}
    ],
    valueSelectionStrategy='TOP_RESOLUTION',   
    createVersion=True)
print('slot type:', container_slot_type['name'])
# インテントを作成する
intent = lex.put_intent(  # intent:意図、目的
    name='OrderIntent',
    slots=[
        {  
            #****スロットの情報を含む辞書の項目
            'name': 'Flavor',
            'slotConstraint': 'Required',  # スロットの制約
            'slotType': 'FlavorSlotType',
            'slotTypeVersion': '1',   # スロットタイプのバージョン(最初は1)
            'valueElicitationPrompt': {    # スロットの値をユーザーから聞き出すためのプロンプト(促すセリフ)
                # xxxvalueElicitationPromptに指定する辞書の項目
                'messages': [{
                    'contentType': 'PlainText',   # セリフのタイプ
                    'content': 'Vanilla, chocolate or strawberry?'   # セリフの内容
                }],
                'maxAttempts': 3          # 聞き返す回数の上限
            }
        },
        {
            'name': 'Container',
            'slotConstraint': 'Required',
            'slotType': 'ContainerSlotType',
            'slotTypeVersion': '1',
            'valueElicitationPrompt': {
                'messages': [{
                    'contentType': 'PlainText',
                    'content': 'Corn or cup?'
                }],
                'maxAttempts': 3
                #*************
            }
        }
    ],
    # 発話例
    sampleUtterances=[          
        'I want {Flavor} ice cream in {Container}',
        '{Flavor} ice cream {Container}',
        'ice cream'
    ],
    # 完了時のセリフ
    conclusionStatement={ 
        'messages': [{
            'contentType': 'PlainText',   # セリフのタイプ
            'content': 'OK, {Flavor} ice cream in {Container}'   # セリフの内容
        }],
    },
    # 完了時の動作
    fulfillmentActivity={'type': 'ReturnIntent'},   #ボットを呼び出したプログラムにインテント情報を返させ表示する
    createVersion=True)
print('intent:', intent['name']) # 注文内容を表示
# ボットを作成する
bot = lex.put_bot(
    name='MyBot', locale='en-US', childDirected=False,  # 子供向けの場合は『True』を指定する
    # インテント
    intents=[
        {           
            'intentName': 'OrderIntent',   # インテント名
            'intentVersion': '1'               # インテントのバージョン(最初のバージョンは1)
        }
    ],
    # 中止時のセリフ
    abortStatement={
        'messages': [
            {
                'contentType': 'PlainText',
                'content': 'Please try again.'
            }
        ]
    },
    voiceId='Joanna',        # 声は『joanna』を指定
    createVersion=True)   # ボットのバージョンを作成する
print('bot:', bot['name'])
# ボット作成時の進捗を表示する
start = time.time()
status = ''
while status not in ['READY', 'FAILED']:
    # ボットの情報(辞書)を取得する
    status = lex.get_bot(name='MyBot', versionOrAlias='1')['status'] # 辞書のキー'status'から取得し status に代入する
    time.sleep(10)    # 待ち時間
    print('{:7.2f} {}'.format(time.time()-start, status))   # 作成開始からの経過時間を表示する
# 作成に失敗したら、その理由を表示する
if status == 'FAILED':
    print(lex.get_bot(
        name='MyBot', versionOrAlias='1')['failureReason'])   # 辞書のキー'failureReason'から失敗した理由を取得し、表示する
# ボットエリアスを作成する
bot_alias = lex.put_bot_alias(
    name='MyBotAlias', botName='MyBot', botVersion='1')  # バージョンを指定(最初は1)
print('bot alias:', bot_alias['name'])