Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Menangkap nilai slot dengan gaya ejaan selama percakapan
Amazon Lex V2 menyediakan slot bawaan untuk menangkap informasi khusus pengguna seperti nama depan, nama belakang, alamat email, atau pengidentifikasi alfanumerik. Misalnya, Anda dapat menggunakan AMAZON.LastName slot untuk menangkap nama keluarga seperti “Jackson” atau “Garcia.” Namun, Amazon Lex V2 mungkin bingung dengan nama keluarga yang sulit diucapkan atau yang tidak umum di suatu lokal, seperti “Xiulan.” Untuk menangkap nama-nama tersebut, Anda dapat meminta pengguna untuk memberikan masukan dalam ej aan demi huruf atau ejaan dengan gaya kata.
Amazon Lex V2 menyediakan tiga gaya elicitasi slot untuk Anda gunakan. Saat Anda mengatur gaya elicitasi slot, itu mengubah cara Amazon Lex V2 menafsirkan input dari pengguna.
Eja demi huruf — Dengan gaya ini, Anda dapat menginstruksikan bot untuk mendengarkan ejaan alih-alih seluruh frasa. Misalnya, untuk menangkap nama belakang seperti “Xiulan,” Anda dapat memberi tahu pengguna untuk mengeja nama belakang mereka satu huruf pada satu waktu. Bot akan menangkap ejaan dan menyelesaikan huruf menjadi kata. Misalnya, jika pengguna mengatakan “x i u l a n,” bot menangkap nama belakang sebagai “xiulan.”
Eja dengan kata — Dalam percakapan suara, terutama menggunakan telepon, ada beberapa huruf, seperti “t,” “b,” “p”, yang terdengar mirip. Saat menangkap nilai alfanumerik atau nama ejaan menghasilkan nilai yang salah, Anda dapat meminta pengguna untuk memberikan kata pengidentifikasi bersama huruf. Misalnya, jika respons suara untuk permintaan ID pemesanan adalah “abp123,” bot Anda mungkin mengenali frasa “ab b 123" sebagai gantinya. Jika ini adalah nilai yang salah, Anda dapat meminta pengguna untuk memberikan input sebagai “a seperti di alpha b seperti pada boy p seperti pada peter one two three.” Bot akan menyelesaikan input ke “abp123.”
Saat menggunakan ejaan demi kata, Anda dapat menggunakan format berikut:
Untuk bahasa Inggris (AS), Inggris (Inggris), dan Inggris (Australia):
-
“seperti di” (seperti pada apel)
-
“untuk” (a untuk apel)
-
“seperti” (seperti apel)
Untuk bahasa Jerman (de-DE):
-
“siapa” (p seperti pizza)
-
“for” (p untuk pizza)
Untuk bahasa Prancis (fr-FR):
-
“seperti” (p sebagai paris)
-
“untuk” (p untuk paris)
Untuk bahasa Spanyol (es-419, es-US, es-ES):
-
“seperti” (atau sebagai serikat)
-
“de” (u de union)
Default — Ini adalah gaya alami penangkapan slot menggunakan pengucapan kata. Misalnya, dapat menangkap nama-nama seperti “John Stiles” secara alami. Jika gaya elicitasi slot tidak ditentukan, bot menggunakan gaya default. Untuk tipe slot AMAZON.UKPostal kode AMAZON.AlphaNumeric dan, gaya default mendukung ejaan dengan input huruf.
Jika nama “Xiulan” diucapkan menggunakan campuran huruf dan kata-kata, seperti “x seperti dalam x-ray i u l seperti di lion a n” gaya elicitasi slot harus diatur ke gaya ejaan demi kata. Gaya ejaan demi huruf tidak akan mengenalinya.
Anda harus membuat antarmuka suara yang menangkap nilai slot dengan gaya percakapan alami untuk pengalaman yang lebih baik. Untuk input yang tidak ditangkap dengan benar menggunakan gaya alami, Anda dapat meminta ulang pengguna dan mengatur gaya elicitasi slot menjadi ejaan demi huruf atau ejaan demi kata.
Anda dapat menggunakan gaya ejaan demi kata dan ejaan demi huruf untuk jenis slot berikut dalam bahasa Inggris (AS), Inggris (Inggris), Inggris (Australia), Jerman (de-DE), Prancis (fr-FR), dan Spanyol (es-419, es-US, es-ES):
-
AMAZON.UKPostalCode(Inggris (AS), Inggris (Inggris), dan Inggris (Australia) saja)
Mengaktifkan ejaan
Anda mengaktifkan ejaan demi huruf dan ejaan demi kata saat runtime saat Anda memunculkan slot dari pengguna. Anda dapat mengatur gaya ejaan dengan StartConversation operasi PutSession RecognizeText, RecognizeUtterance,, atau. Anda juga dapat mengaktifkan ejaan demi huruf dan ejaan demi kata menggunakan fungsi Lambda.
Anda mengatur gaya ejaan menggunakan dialogAction bidang sessionState bidang dalam permintaan salah satu operasi API yang disebutkan di atas atau saat mengonfigurasi respons Lambda (lihat AWS Lambdaformat respons untuk Lex V2 untuk informasi lebih lanjut). Anda hanya dapat mengatur gaya ketika jenis tindakan dialog adalah ElicitSlot dan ketika slot yang akan dimunculkan adalah salah satu jenis slot yang didukung.
Kode JSON berikut menunjukkan dialogAction bidang yang disetel untuk menggunakan gaya ejaan demi kata:
"dialogAction": {
"slotElicitationStyle": "SpellByWord",
"slotToElicit": "BookingId",
"type": "ElicitSlot"
}
Bid slotElicitationStyle ang dapat diatur keSpellByLetter,SpellByWord, atauDefault. Jika Anda tidak menentukan nilai, maka nilainya disetel keDefault.
catatan
Anda tidak dapat mengaktifkan gaya elicitasi ejaan demi huruf atau ejaan demi kata melalui konsol.
Contoh kode menggunakan Lambda dan Lex V2
Mengubah gaya ejaan biasanya dilakukan jika upaya pertama untuk menyelesaikan nilai slot yang tidak berhasil. Contoh kode berikut adalah fungsi Python Lambda yang menggunakan gaya ejaan demi kata pada upaya kedua untuk menyelesaikan slot.
Untuk menggunakan kode contoh, Anda harus memiliki:
-
Sebuah bot dengan satu bahasa, Inggris (GB) (en_GB).
-
Satu maksud, "CheckAccount" dengan satu contoh ucapan, “Saya ingin memeriksa akun saya”. Pastikan bahwa Gunakan fungsi Lambda untuk inisialisasi dan validasi dipilih di bagian Kode kait dari definisi maksud.
-
Maksud harus memiliki satu slot, "PostalCode“, dari tipe
AMAZON.UKPostalCodebawaan. -
Alias dengan fungsi Lambda yang ditentukan. Lihat informasi yang lebih lengkap di Membuat AWS Lambda fungsi untuk bot Amazon Lex V2 Anda.
import json import time import os import logging logger = logging.getLogger() logger.setLevel(logging.DEBUG) # --- Helpers that build all of the responses --- def get_slots(intent_request): return intent_request['sessionState']['intent']['slots'] def get_session_attributes(intent_request): sessionState = intent_request['sessionState'] if 'sessionAttributes' in sessionState: return sessionState['sessionAttributes'] return {} def get_slot(intent_request, slotName): slots = get_slots(intent_request) if slots is not None and slotName in slots and slots[slotName] is not None: logger.debug('resolvedValue={}'.format(slots[slotName]['value']['resolvedValues'])) return slots[slotName]['value']['resolvedValues'] else: return None def elicit_slot(session_attributes, intent_request, slots, slot_to_elicit, slot_elicitation_style, message): return {'sessionState': {'dialogAction': {'type': 'ElicitSlot', 'slotToElicit': slot_to_elicit, 'slotElicitationStyle': slot_elicitation_style }, 'intent': {'name': intent_request['sessionState']['intent']['name'], 'slots': slots, 'state': 'InProgress' }, 'sessionAttributes': session_attributes, 'originatingRequestId': 'REQUESTID' }, 'sessionId': intent_request['sessionId'], 'messages': [ message ], 'requestAttributes': intent_request['requestAttributes'] if 'requestAttributes' in intent_request else None } def build_validation_result(isvalid, violated_slot, slot_elicitation_style, message_content): return {'isValid': isvalid, 'violatedSlot': violated_slot, 'slotElicitationStyle': slot_elicitation_style, 'message': {'contentType': 'PlainText', 'content': message_content} } def GetItemInDatabase(postal_code): """ Perform database check for transcribed postal code. This is a no-op check that shows that postal_code can't be found in the database. """ return None def validate_postal_code(intent_request): postal_code = get_slot(intent_request, 'PostalCode') if GetItemInDatabase(postal_code) is None: return build_validation_result( False, 'PostalCode', 'SpellByWord', "Sorry, I can't find your information. " + "To try again, spell out your postal " + "code using words, like a as in apple." ) return {'isValid': True} def check_account(intent_request): """ Performs dialog management and fulfillment for checking an account with a postal code. Besides fulfillment, the implementation for this intent demonstrates the following: 1) Use of elicitSlot in slot validation and re-prompting. 2) Use of sessionAttributes to pass information that can be used to guide a conversation. """ slots = get_slots(intent_request) postal_code = get_slot(intent_request, 'PostalCode') session_attributes = get_session_attributes(intent_request) if intent_request['invocationSource'] == 'DialogCodeHook': # Validate the PostalCode slot. If any aren't valid, # re-elicit for the value. validation_result = validate_postal_code(intent_request) if not validation_result['isValid']: slots[validation_result['violatedSlot']] = None return elicit_slot( session_attributes, intent_request, slots, validation_result['violatedSlot'], validation_result['slotElicitationStyle'], validation_result['message'] ) return close( intent_request, session_attributes, 'Fulfilled', {'contentType': 'PlainText', 'content': 'Thanks' } ) def close(intent_request, session_attributes, fulfillment_state, message): intent_request['sessionState']['intent']['state'] = fulfillment_state return { 'sessionState': { 'sessionAttributes': session_attributes, 'dialogAction': { 'type': 'Close' }, 'intent': intent_request['sessionState']['intent'], 'originatingRequestId': 'xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' }, 'messages': [ message ], 'sessionId': intent_request['sessionId'], 'requestAttributes': intent_request['requestAttributes'] if 'requestAttributes' in intent_request else None } # --- Intents --- def dispatch(intent_request): """ Called when the user specifies an intent for this bot. """ intent_name = intent_request['sessionState']['intent']['name'] response = None # Dispatch to your bot's intent handlers if intent_name == 'CheckAccount': response = check_account(intent_request) return response # --- Main handler --- def lambda_handler(event, context): """ Route the incoming request based on the intent. The JSON body of the request is provided in the event slot. """ # By default, treat the user request as coming from # Eastern Standard Time. os.environ['TZ'] = 'America/New_York' time.tzset() logger.debug('event={}'.format(json.dumps(event))) response = dispatch(event) logger.debug("response={}".format(json.dumps(response))) return response