음성 녹음 신뢰도 점수 사용 - Amazon Lex

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

음성 녹음 신뢰도 점수 사용

사용자가 음성 발언을 할 때 Amazon Lex V2는 ASR (자동 음성 인식) 을 사용하여 사용자의 요청을 해석하기 전에 기록합니다. 기본적으로 Amazon Lex V2는 해석에 가장 가능성이 높은 오디오 전사를 사용합니다.

경우에 따라 오디오 전사가 두 개 이상 있을 수 있습니다. 예를 들어, 사용자는 “내 이름은 John”입니다. “내 이름은 John”과 같이 모호한 소리로 표현할 수 있습니다. 이 경우 모호함 기법을 사용하거나 도메인 지식을전사 신뢰도 점수전사 목록에서 어떤 전사가 올바른지 판단하는 데 도움이 됩니다.

Amazon Lex V2에는 Lambda 코드 후크 함수에 대한 요청에 사용자 입력을 위한 상위 전사 및 최대 두 개의 대체 트랜스크립션이 포함되어 있습니다. 각 전사에는 올바른 필사임을 나타내는 신뢰 점수가 포함되어 있습니다. 각 전사에는 사용자 입력에서 유추된 슬롯 값도 포함됩니다.

두 전사 기록의 신뢰 점수를 비교하여 둘 사이에 모호성이 있는지 확인할 수 있습니다. 예를 들어 한 전사의 신뢰 점수가 0.95이고 다른 전사의 신뢰 점수가 0.65인 경우 첫 번째 전사는 정확할 수 있으며 이들 사이의 모호성이 낮을 수 있습니다. 두 전사 기록의 신뢰도 점수가 0.75와 0.72인 경우 이들 사이의 모호성이 높습니다. 도메인 지식을 사용하여 이들 간에 차별화할 수 있습니다.

예를 들어 신뢰도 점수가 0.75와 0.72인 두 개의 기록에서 추론된 슬롯 값이 “John” 및 “Juan”인 경우 데이터베이스의 사용자에게 이러한 이름이 있는지 쿼리하고 전사 중 하나를 제거할 수 있습니다. “John”이 데이터베이스의 사용자가 아니고 “Juan”이 인 경우 대화 상자 코드 후크를 사용하여 이름의 유추된 슬롯 값을 “Juan”으로 변경할 수 있습니다.

Amazon Lex V2가 반환하는 신뢰 점수는 비교 값입니다. 절대 점수로 의존하지 마십시오. Amazon Lex V2의 개선 사항에 따라 값이 변경될 수 있습니다.

오디오 녹음 신뢰도 점수는 영어 (GB) (en_GB) 및 영어 (미국) (en_US) 언어로만 제공됩니다. 신뢰 점수는 8kHz 오디오 입력에 대해서만 지원됩니다. 오디오 입력에 대한 전사 신뢰도 점수는 제공되지 않습니다.테스트 창16kHz 오디오 입력을 사용하기 때문에 Amazon Lex V2 콘솔에서 사용할 수 있습니다.

참고

기존 봇에서 오디오 전사 신뢰도 점수를 사용하려면 먼저 봇을 다시 빌드해야 합니다. 기존 버전의 봇은 전사 신뢰도 점수를 지원하지 않습니다. 봇을 사용하려면 새 버전의 봇을 생성해야 합니다.

여러 대화 디자인 패턴에 대한 신뢰 점수를 사용할 수 있습니다.

  • 소음이 많은 환경이나 신호 품질 저하로 인해 신뢰도가 가장 높은 점수가 임계값 아래로 떨어지면 사용자에게 더 나은 품질의 오디오를 캡처하도록 동일한 질문을 묻는 메시지를 표시할 수 있습니다.

  • “John” 및 “Juan”과 같은 슬롯 값에 대한 신뢰 점수가 여러 개 있는 경우 기존 데이터베이스와 값을 비교하여 입력을 제거하거나 사용자에게 두 값 중 하나를 선택하라는 메시지를 표시할 수 있습니다. 예를 들어, “John은 1을 말하거나 후안을 위해 2를 말하십시오.”

  • 비즈니스 로직에서 상위 성적 기록에 가까운 신뢰 점수가 있는 대체 대본의 특정 키워드를 기반으로 인텐트 전환이 필요한 경우 대화 코드 후크 Lambda 함수를 사용하거나 세션 관리 작업을 사용하여 인텐트를 변경할 수 있습니다. 자세한 정보는 세션 관리을 참조하십시오.

Amazon Lex V2는 Lambda 코드 후크 함수에 사용자의 입력에 대해 최대 3개의 트랜스크립션이 포함된 다음 JSON 구조를 전송합니다.

"transcriptions": [ { "transcription": "string", "transcriptionConfidence": { "score": "number" }, "resolvedContext": { "intent": "string" }, "resolvedSlots": { "string": { "shape": "List", "value": { "originalValue": "string", "resolvedValues": [ "string" ] }, "values": [ { "shape": "Scalar", "value": { "originalValue": "string", "resolvedValues": [ "string" ] } }, { "shape": "Scalar", "value": { "originalValue": "string", "resolvedValues": [ "string" ] } } ] } } } ]

JSON 구조에는 전사 텍스트, 발언에 대해 확인된 의도 및 발화에서 감지된 모든 슬롯에 대한 값이 포함되어 있습니다. 텍스트 사용자 입력의 경우, 트랜스크립션에는 신뢰도 점수가 1.0인 단일 대본이 포함됩니다.

성적표의 내용은 대화의 전환과 인식된 의도에 따라 달라집니다.

첫 번째 턴인 의도 유도에서는 Amazon Lex V2가 상위 세 가지 전사를 결정합니다. 최상위 전사의 경우, 필사의 의도 및 추론된 슬롯 값을 반환합니다.

후속 턴, 슬롯 유도, 결과는 다음과 같이 각 전사에 대한 추론 의도에 따라 달라집니다.

  • 최상위 성적표에 대한 추론 의도가 이전 턴과 동일하고 다른 모든 성적표의 의도가 동일한 경우

    • 모든 트랜스크립트에는 추론된 슬롯 값이 포함되어 있습니다.

       

  • 최상위 성적표에 대한 추론 의도가 이전 턴과 다르며 다른 모든 성적표에 이전 의도가 있는 경우

    • 최상위 기록에는 새 의도의 슬롯 값 추정이 포함됩니다.

    • 다른 기록에는 이전 의도와 이전 인텐트에 대한 유추된 슬롯 값이 있습니다.

       

  • 최상위 성적표에 대한 추론된 의도가 이전 턴과 다른 경우 한 성적표는 이전 의도와 동일하며 한 성적표는 다른 의도인 경우

    • 최상위 성적 기록에는 새로운 추론된 인텐트와 추론된 슬롯 값이 발언에 포함됩니다.

    • 이전에 추론된 인텐트가 있는 기록에는 해당 인텐트에 대한 추론된 슬롯 값이 포함되어 있습니다.

    • 인텐트가 다른 기록에는 추론된 인텐트 이름이 없고 추론된 슬롯 값이 없습니다.

       

  • 상위 성적표에 대한 추론된 의도가 이전 턴과 다르며 다른 모든 성적표의 의도가 서로 다른 경우

    • 최상위 성적 기록에는 새로운 추론된 인텐트와 추론된 슬롯 값이 발언에 포함됩니다.

    • 다른 트랜스크립트에는 추론된 인텐트가 없고 추론된 슬롯 값이 없습니다.

       

  • 상위 두 개의 성적 증명서에 대한 추론 의도가 이전 턴과 동일하고 다른 경우 세 번째 성적 증명서가 다른 의도인 경우

    • 상위 두 개의 대화 상자에는 새로운 추론된 인텐트와 추론된 슬롯 값이 발언에 포함되어 있습니다.

    • 세 번째 기록에는 의도 이름과 확인된 슬롯 값이 없습니다.

세션 관리

Amazon Lex V2가 사용자와의 대화에서 사용하는 인텐트를 변경하려면 대화 코드 후크 Lambda 함수의 응답을 사용합니다. 또는 사용자 지정 애플리케이션에서 세션 관리 API를 사용할 수 있습니다.

Lambda 함수 사용하기

Lambda 함수를 사용하는 경우 Amazon Lex V2에서는 함수에 대한 입력이 포함된 JSON 구조로 함수를 호출합니다. JSON 구조체에는 라는 필드가 포함되어 있습니다.transcriptions여기에는 Amazon Lex V2가 발언에 대해 결정한 가능한 전사가 포함되어 있습니다. 이transcriptions필드에는 1~3개의 가능한 전사가 포함되어 있으며, 각각 신뢰 점수가 있습니다.

대체 전사의 인텐트를 사용하려면ConfirmIntent또는ElicitSlotLambda 함수의 대화 상자 작업 대체 전사의 슬롯 값을 사용하려면intentLambda 함수 응답의 필드입니다. 자세한 정보는 사용AWS Lambda기능을 참조하십시오.

예제 코드

다음 코드 예제는 오디오 전사를 사용하여 사용자의 대화 환경을 개선하는 Python Lambda 함수입니다.

예제 코드를 사용하려면 다음 사항을 수행해야 합니다.

  • 영어 (GB) (en_GB) 또는 영어 (미국) (en_US) 중 하나의 언어로 된 봇.

  • 한 가지 의도, 주문탄생석 다음 사항을 확인하십시오.초기화 및 유효성 검사에 Lambda 함수 사용에서 선택됨코드 hook의도의 정의 섹션

  • 인텐트에는 “생년월일”과 “이름” 두 개의 슬롯이 있어야 하며, 둘 다 Amazon.영숫자 유형이 있어야 합니다.

  • Lambda 함수가 정의된 별칭입니다. 자세한 정보는 봇 별칭에 Lambda 함수 연결을 참조하십시오.

import time import os import logging logger = logging.getLogger() logger.setLevel(logging.DEBUG) # --- Helpers that build all of the responses --- def elicit_slot(session_attributes, intent_request, slots, slot_to_elicit, message): return { 'sessionState': { 'dialogAction': { 'type': 'ElicitSlot', 'slotToElicit': slot_to_elicit }, 'intent': { 'name': intent_request['sessionState']['intent']['name'], 'slots': slots, 'state': 'InProgress' }, 'sessionAttributes': session_attributes, 'originatingRequestId': 'e3ab4d42-fb5f-4cc3-bb78-caaf6fc7cccd' }, 'sessionId': intent_request['sessionId'], 'messages': [message], 'requestAttributes': intent_request['requestAttributes'] if 'requestAttributes' in intent_request else None } 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': '3ab4d42-fb5f-4cc3-bb78-caaf6fc7cccd' }, 'messages': [message], 'sessionId': intent_request['sessionId'], 'requestAttributes': intent_request['requestAttributes'] if 'requestAttributes' in intent_request else None } def delegate(intent_request, session_attributes): return { 'sessionState': { 'dialogAction': { 'type': 'Delegate' }, 'intent': intent_request['sessionState']['intent'], 'sessionAttributes': session_attributes, 'originatingRequestId': 'abc' }, 'sessionId': intent_request['sessionId'], 'requestAttributes': intent_request['requestAttributes'] if 'requestAttributes' in intent_request else None } def get_session_attributes(intent_request): sessionState = intent_request['sessionState'] if 'sessionAttributes' in sessionState: return sessionState['sessionAttributes'] return {} def get_slots(intent_request): return intent_request['sessionState']['intent']['slots'] """ --- Functions that control the behavior of the bot --- """ def order_birth_stone(intent_request): """ Performs dialog management and fulfillment for ordering a birth stone. Beyond fulfillment, the implementation for this intent demonstrates the following: 1) Use of N best transcriptions to re prompt user when confidence for top transcript is below a threshold 2) Overrides resolved slot for birth month from a known fixed list if the top transcript is not accurate. """ transcriptions = intent_request['transcriptions'] if intent_request['invocationSource'] == 'DialogCodeHook': # Disambiguate if there are multiple transcriptions and the top transcription # confidence is below a threshold (0.8 here) if len(transcriptions) > 1 and transcriptions[0]['transcriptionConfidence'] < 0.8: if transcriptions[0]['resolvedSlots'] is not {} and 'Name' in transcriptions[0]['resolvedSlots'] and \ transcriptions[0]['resolvedSlots']['Name'] is not None: return prompt_for_name(intent_request) elif transcriptions[0]['resolvedSlots'] is not {} and 'BirthMonth' in transcriptions[0]['resolvedSlots'] and \ transcriptions[0]['resolvedSlots']['BirthMonth'] is not None: return validate_month(intent_request) return continue_conversation(intent_request) def prompt_for_name(intent_request): """ If the confidence for the name is not high enough, re prompt the user with the recognized names so it can be confirmed. """ resolved_names = [] for transcription in intent_request['transcriptions']: if transcription['resolvedSlots'] is not {} and 'Name' in transcription['resolvedSlots'] and \ transcription['resolvedSlots']['Name'] is not None: resolved_names.append(transcription['resolvedSlots']['Name']['value']['originalValue']) if len(resolved_names) > 1: session_attributes = get_session_attributes(intent_request) slots = get_slots(intent_request) return elicit_slot(session_attributes, intent_request, slots, 'Name', {'contentType': 'PlainText', 'content': 'Sorry, did you say your name is {} ?'.format(" or ".join(resolved_names))}) else: return continue_conversation(intent_request) def validate_month(intent_request): """ Validate month from an expected list, if not valid looks for other transcriptions and to see if the month recognized there has an expected value. If there is, replace with that and if not continue conversation. """ expected_months = ['january', 'february', 'march'] resolved_months = [] for transcription in intent_request['transcriptions']: if transcription['resolvedSlots'] is not {} and 'BirthMonth' in transcription['resolvedSlots'] and \ transcription['resolvedSlots']['BirthMonth'] is not None: resolved_months.append(transcription['resolvedSlots']['BirthMonth']['value']['originalValue']) for resolved_month in resolved_months: if resolved_month in expected_months: intent_request['sessionState']['intent']['slots']['BirthMonth']['resolvedValues'] = [resolved_month] break return continue_conversation(intent_request) def continue_conversation(event): session_attributes = get_session_attributes(event) if event["invocationSource"] == "DialogCodeHook": return delegate(event, session_attributes) # --- Intents --- def dispatch(intent_request): """ Called when the user specifies an intent for this bot. """ logger.debug('dispatch sessionId={}, intentName={}'.format(intent_request['sessionId'], intent_request['sessionState']['intent']['name'])) intent_name = intent_request['sessionState']['intent']['name'] # Dispatch to your bot's intent handlers if intent_name == 'OrderBirthStone': return order_birth_stone(intent_request) raise Exception('Intent with name ' + intent_name + ' not supported') # --- Main handler --- def lambda_handler(event, context): """ Route the incoming request based on intent. The JSON body of the request is provided in the event slot. """ # By default, treat the user request as coming from the America/New_York time zone. os.environ['TZ'] = 'America/New_York' time.tzset() logger.debug('event={}'.format(event)) return dispatch(event)

세션 관리 API 사용

현재 인텐트와 다른 인텐트를 사용하려면PutSession작업. 예를 들어 첫 번째 대안이 Amazon Lex V2가 선택한 인텐트보다 바람직하다고 판단한 경우PutSession인텐트를 변경하는 작업. 이렇게 하면 사용자가 상호 작용하는 다음 인텐트가 선택한 인텐트가 됩니다.

또한 다음을 사용할 수 있습니다.PutSession작업을 통해 슬롯 값 변경intent대체 전사의 값을 사용하는 구조입니다.

자세한 내용은 Amazon Lex V2 API를 사용하여 세션 관리 단원을 참조하세요.