対話型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
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'])
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'])
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']) # 注文内容を表示
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'])
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'から失敗した理由を取得し、表示する
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'])
bot_alias = lex.put_bot_alias(
name='MyBotAlias', botName='MyBot', botVersion='1') # バージョンを指定(最初は1)
print('bot alias:', bot_alias['name'])