5

이것은 쉬운 것일 수 있지만 며칠 만에 알아낼 수 없었습니다.Alexa (Amazon Echo) 대화 기술 - 세션 속성 사용 (JavaScript - AWS Lambda)

나는 Alexa가 대화를하고 싶습니다.

>> 알렉사, 테스트 스킬 시작.

A : 시험 기술이 시작되었습니다. 번호를 말해줘.

>> 하나.

A : 알았어요, 지금 색을 말해주세요.

>> 블루.

A : 마지막으로 동물의 이름을 말해주십시오.

>> 치킨.

A : 당신은 저에게 푸른 색과 닭고기를 말했습니다.

JSON이 보유하고 인 텐트간에 정보를 전송하는 스킬의 세션 속성을 처리해야한다는 것을 알게되었습니다.

저는 다음과 같은 함수를 사용합니다.

function testConversation(intent, session, callback) { 

    var cardTitle = intent.name; 
    var repromptText = ""; 
    var sessionAttributes = { // I don't know how to handle this 
     nameOfPairOne: "", 
     nameOfPairTwo: "", 
    }; 
    var shouldEndSession = false; 
    var speechOutput = ""; 

    var color= convertToASCII(intent.slots.color.value); 
    sessionAttributes.nameOfPairOne = color; 

    speechOutput = "You said "+sessionAttributes.nameOfPairOne+". Please say another thing. "; 
    callback(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession)); 
} 

function testConversation2(intent, session, callback) { 

    var cardTitle = intent.name; 
    var repromptText = ""; 
    var sessionAttributes = session.attributes; 
    var shouldEndSession = false; 
    var speechOutput = ""; 

    var number = convertToASCII(intent.slots.number.value); 
    sessionAttributes.nameOfPairTwo = number; 

    speechOutput = "You first said "+sessionAttributes.nameOfPairOne+", and now said "+sessionAttributes.nameOfPairTwo; 
    callback(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession)); 
} 

//------Helpers that build all of the responses ---------// 
function buildSpeechletResponse(title, output, repromptText, shouldEndSession) { 
    return { 
     outputSpeech: {type: "PlainText", text: output}, 
     card: {type: "Simple", title: "SessionSpeechlet - " + title, content: "SessionSpeechlet - " + output}, 
     reprompt: {outputSpeech: {type: "PlainText", text: repromptText}}, 
     shouldEndSession: shouldEndSession 
    }; 
} 


function buildResponse(sessionAttributes, speechletResponse) { 
    return {version: "1.0", sessionAttributes: sessionAttributes, response: speechletResponse}; 
} 

위의 함수를 호출하는 onIntent() 함수의 코드 조각입니다. (나는 틀렸지만 올바른 방법을 알 수는 없다는 것을 알고있다.)

else if ("getColorNum" == intentName) { 
    if (session.attributes.nameOfPairOne === "") { 
     testConversation(intent, session, callback); 
    } else { 
     testConversation2(intent, session, callback); 
    } 
} 

그리고 인 텐트 스키마 JSON은 이와 비슷하다.

"intents": [ 
{ 
    "intent": "getColorNum", 
    "slots": [ 
    { 
     "name": "Color", 
     "type": "ColorSlot" 
    }, 
    { 
     "name": "Number", 
     "type": "NumberSlot" 
    } 
    ] 
} 

] }

그래서, 나는 모든 것들을 잘못하고 있는가? 실수는 어디 있습니까? 그리고 제가 언급 한 것처럼 대화를 어떻게 구축 할 수 있습니까? 고마워.

+0

누군가가이 답변을 원합니다. 그동안 비슷한 질문에 대한 연구가 도움이 될 수 있습니다. http://lovemyecho.com/wp-content/uploads/2015/07/SessionAttributesInJavascript.pdf – brianfit

답변

2

아무도 아직 답변을 해 준 이래로 나는 내 두 센트를 줄 것이라고 생각했습니다. 내가 선택한 언어는 파이썬이지만 좀 더 높은 수준의 아이디어를 줄 수 있습니다.

  • 세션 개체를 사용하여 대화와 관련된 모든 정보를 추적합니다. "응답"을 계산 한 후 세션 객체를 세션 json으로 직렬화하고 다음 인 텐트 요청에서 역 직렬화합니다.
  • 대화 상태를 유지하고 주어진 상태와 특정 대화 상태를 실행하기 위해 현재있는 위치와 콜백을 파악하기 위해 유한 상태 머신 접근 방식을 사용합니다.
  • 가능한 한 ASK 인터페이스에서 대화 논리를 분리하십시오. 로컬로 실행할 수있는 테스트를 작성하십시오.
  • 당신은 내가 이것들을 구현하는 방법을 보려면

, 체크 아웃 :

+0

답변 해 주셔서 감사합니다. btw I usind alexa-sdk npm 모듈로 문제를 파악했습니다. –

1

의 복잡성에 따라이 문제를 접근하는 방법은 여러 가지가 있습니다 어떤 당신은 저장하려고합니다.

먼저 슬롯을 사용하십시오. One, blue, chicken 등이 분류 된 카테고리에 있다면,이를 슬롯에 저장하고 JSON 방식으로 액세스하여 값을 가져 와서 JavaScript 코드의 변수에 저장할 수 있습니다. 예 (sudo를) 기술이 끝난 후

var something1 = event.request.intent.slots.assetName.value; 
var something2 = event.request.intent.slots.assetName.value; 
buildSpeechletResponse(`my ${something1} likes ${something2} and blah blah blah`) 

둘째, 뭔가를 저장하고 런타임에 늦게 그것을 사용하는 속성을 사용, 알렉사이 기억하지 않을 것이다. 예 :

'BreakfastIntent': function() { 
    var restaurant = randomArrayElement(getRestaurantsByMeal('breakfast')); 
    this.attributes['restaurant'] = restaurant.name; 

    var say = 'For breakfast, try this, ' + restaurant.name + '. Would you like to hear more?'; 
    this.response.speak(say).listen(say); 
    this.emit(':responseReady'); 
}, 

마지막으로, 데이터베이스에 저장, 추천 한 DynamoDB의이며, 알렉사 스킬 키트에서 디나모를 저장하고 액세스를위한 튜토리얼 많이 있습니다. 체크 아웃 : https://github.com/alexa/alexa-cookbook/tree/master/aws/Amazon-DynamoDB/read

이 정보가 도움이되기를 바랍니다.