2017-05-22 1 views
0

J'essaie de construire une compétence personnalisée alexa. Je suis confronté à un problème où j'essaye d'obtenir des réponses de l'utilisateur pour une question que la compétence demande à l'utilisateur.Comment répondre aux questions - Alexa

User : Tell me marks of student1 ? 
Alexa: Subject 
User: Maths 
Alexa : student1 marks in maths is {xyz} 

ou si l'utilisateur ne marche pas donner une entrée:

User : Tell me marks of student1 ? 
Alexa: Subject 
User: No Answer 
Alexa : Gives marks of all subject for student1. 

J'utilise Node.js. S'il vous plaît dites-moi comment faire cela.

+0

Veuillez ajouter plus de détails, où exactement rencontrez-vous un problème. Votre question est si vague. Utilisez-vous des fentes? –

+0

S'il vous plaît suggérer une approche générale pour cela, je suis nouveau à cela, et juste commencé quelques jours en arrière. – KMittal

Répondre

2

Eh bien, c'est compliqué. Il y a deux approches ici, vous pouvez suivre un programme de dialogue

https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/dialog-interface-reference

Ou vous pouvez utiliser des intentions.

vous aurez des intentions d'étudiant et l'intention du sujet.

"intents": [ 
    { 
     "intent": "Student", 
     "slots": [ 
     { 
      "name": "Students", 
      "type": "LIST_OF_STUDENTS" 
     } 
     ] 
    }, 
    { 
     "intent": "Subject", 
     "slots": [ 
     { 
      "name": "Subjects", 
      "type": "LIST_OF_SUBJECTS" 
     } 
     ] 
    } 

Vous aurez besoin d'une table dynamo db où vous gardez le nom des étudiants, et dans votre système de compétences, vous aurez une liste des étudiants et des sujets.

Je ne peux pas écrire toute la compétence pour vous, c'est trop compliqué.

Suivez simplement un tutoriel puis posez une question spécifique. https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs

ME RENDRE A est COMPETENCES pas une question ....

2

Sur chose à savoir est que Alexa ne répond pas à « pas de réponse ». Vous aurez donc besoin d'entraîner l'utilisateur à répondre avec «tout» ou «aucun».

0

C'est votre jour de chance. Voici comment je ferais cela avec plusieurs MODES dans Node.js.

Avertissement: Je fournirai cette longue réponse parce que je suis désespérée pour les points de réputation et souhaite devenir un évangéliste de développeur.

Étant donné le SDK Node.js et ses nombreuses fonctionnalités, c'est le format que j'utiliserais.

// To zip and upload to lambda 
// cd Desktop/StudentSkill 
// sudo rm -r foo.zip 
// zip -r foo.zip .s 

'use strict'; 
var Alexa = require("alexa-sdk"); 
var appId = 'YOUR-AMAZON-ALEXA-SKILL-ID'; 

exports.handler = function(event, context, callback) { 
    var alexa = Alexa.handler(event, context); 
    alexa.appId = appId; 
    alexa.registerHandlers(newSessionHandlers, studentSkillSessionHandlers, specificClassSessionHandlers, functionHandlers); 
    alexa.execute(); 
}; 


var states = { 
    STUDENTMODE: '_STUDENTMODE', 
    CLASSMODE:  '_CLASSMODE', 
}; 

//Variables 
var myStudents = {'josh':{'math':'A Plus','english':'A Plus','gym':'C'},'sam':{'math':'A Plus','english':'A minus','gym':'B Plus'}}; //add more classes. 

//Could add an intent to create new students. 
//var newStudent = {name:{'math':null,'english':null,'gym':null}}; 

//Could also add an intent to set grades 

var newSessionHandlers = { 
    'NewSession': function() { 
     this.handler.state = states.STUDENTMODE; 
     var message = `Welcome to the School Skill, You may add students, edit grades, and review grades. For a list of uses say information. `; //this skill only contains reviewing grades. 
     var reprompt = ` try saying, grades for josh. `; 
     this.emit(':ask',message,reprompt); 
    }, 
    'Unhandled': function() { 
     console.log("UNHANDLED"); 
     this.emit('NewSession'); 
    } 
}; 
///////////////////////////////// 
var studentSkillSessionHandlers = Alexa.CreateStateHandler(states.STUDENTMODE, {//Your location 
    'NewSession': function() { 
     this.emit('NewSession'); // Uses the handler in newSessionHandlers 
    }, 
    //Primary Intents 
    'GetGradeIntent': function() { // Sampe Utterance: Tell me the marks of {student} or Grades for {student} 
     this.handler.state = states.CLASSMODE; //Change mode to accept a class, the intent handler getClassIntent is only available in CLASSMODE 
     this.attributes['CURRENTSTUDENT'] = this.event.request.intent.slots.student.value; 
     var message = ` which of `+this.attributes['CURRENTSTUDENT']+`'s classes would you like the grade for, name a class or say all. `; 
     var reprompt = message; 
     this.emit(':ask',message,reprompt); 
    }, 
    //Help Intents 
    "InformationIntent": function() { 
     console.log("INFORMATION"); 
     var message = ` Try saying, Tell me the marks of josh. `; 
     this.emit(':ask', message, message); 
    }, 
    "AMAZON.StopIntent": function() { 
     console.log("STOPINTENT"); 
     this.emit(':tell', "Goodbye!"); 
    }, 
    "AMAZON.CancelIntent": function() { 
     console.log("CANCELINTENT"); 
     this.emit(':tell', "Goodbye!"); 
    }, 
    'AMAZON.HelpIntent': function() { 
     var message = helpMessage; 
     this.emit(':ask', message, message); 
    }, 
    //Unhandled 
    'Unhandled': function() { 
     console.log("UNHANDLED"); 
     var reprompt = ` That was not an appropriate response. which student would you like grades for. Say, grades for josh. `; 
     this.emit(':ask', reprompt, reprompt); 
    } 
}); 

//////////////////////////// 
///////////////////////////////// 
var specificClassSessionHandlers = Alexa.CreateStateHandler(states.CLASSMODE, {//Your location 
    'NewSession': function() { 
     this.emit('NewSession'); // Uses the handler in newSessionHandlers 
    }, 
    //Primary Intents 
    'GetClassIntent': function() { // {className} class. ex: gym class, math class, english class. It helps to have a word that's not a slot. but amazon may pick it up correctly if you just say {className} 
     this.attributes['CLASSNAME'] = this.event.request.intent.slots.className.value; 
     var message = ``; 
     var reprompt = ``; 
     if(this.attributes['CLASSNAME'] != undefined){ 
     message = ` I didn't get that class name. would you please repeat it. `; 
     reprompt = message; 
     }else{ 
     grade = myStudents[this.attributes['CURRENTSTUDENT']][this.attributes['CLASSNAME']]; 
     if(grade != undefined){ 
      this.handler.state = states.STUDENTMODE; //Answer was present. return to student mode. 
      message = this.attributes['CURRENTSTUDENT']+`'s `+[this.attributes['CLASSNAME']+` grade is `+aAn(grade)+` `+grade+`. What else would you like to know?`; //Josh's math grade is an A plus. 
      reprompt = `what else would you like to know?`; 
     }else{ 
      message = this.attributes['CURRENTSTUDENT']+` does not appear to have a grade for `+[this.attributes['CLASSNAME']+` please try again with a different class or say back.`; 
      reprompt = `please try again with a different class or say back.`; 
     } 
     } 
     var message = this.attributes['FROM'] + ' .. '+ ProFirstCity; 
     var reprompt = ProFirstReprompt; 
     this.emit(':ask',message,reprompt); 
    }, 
    "AllIntent": function() {// Utterance: All, All Classes 
     message = ``; 
     //Not going to code. 
     //Pseudo code 
     // for each in json object myStudents[this.attributes['CURRENTSTUDENT']] append to message class name and grade. 
     this.emit(':ask', message, message); 
    }, 
    "BackIntent": function() {// Utterance: Back, go back 
     var message = ` Who's grade would you like to know. try saying, grades for josh. `; 
     this.emit(':ask', message, message); 
    }, 
    //Help Intents 
    "InformationIntent": function() { 
     console.log("INFORMATION"); 
     var message = ` You've been asked for which of `+this.attributes['CURRENTSTUDENT']+`'s classes you'd his grade. Please name a class or say back. `; 
     this.emit(':ask', message, 'Name a class or say back.'); 
    }, 
    "AMAZON.StopIntent": function() { 
     console.log("STOPINTENT"); 
     this.emit(':tell', "Goodbye!"); 
    }, 
    "AMAZON.CancelIntent": function() { 
     console.log("CANCELINTENT"); 
     this.emit(':tell', "Goodbye!"); 
    }, 
    'AMAZON.HelpIntent': function() { 
     var message = helpMessage; 
     this.emit(':ask', message, message); 
    }, 
    //Unhandled 
    'Unhandled': function() { 
     console.log("UNHANDLED"); 
     var reprompt = ' That was not an appropriate response. Name a class or say back.'; 
     this.emit(':ask', reprompt, reprompt); 
    } 
}); 

//////////////////////////////////////////////////////////// 

var functionHandlers = {//NOT USED IN THIS APP //Note tied to a specific mode. 

}; 


//#############################HELPERS VVVV######################### 
function getRandomInt(min, max) { 
    return Math.floor(Math.random() * (max - min + 1)) + min; 
} 
function clone(a) { 
    return JSON.parse(JSON.stringify(a)); 
} 
function responseRandomizer(responseType){ 
    let len = responseType.length; 
    let index = getRandomInt(0,len-1); 
    return responseType[index]; 
} 
var vowels = {} 
function aAn(word){ 
    if(word != ''){ 
    let first = word[0]; 
    if(/[aAeEiIoOuU]/.test(first)){ 
     return 'an'; 
    }else{ 
     return 'a'; 
    } 
    }else{ 
    return ''; 
    } 
} 

Veuillez noter que ce code a été adapté d'une compétence en direct, mais n'a pas été testé seul.

Pour commencer une question de suivi, vous devez comprendre les différents stateHandlers. Lorsque vous invoquez une nouvelle compétence, elle passe à newSessionHandlers à partir de là, vous pouvez exécuter une sorte de code d'installation, puis changer le MODE en un lobby pour capturer les intentions principales pour la compétence. J'ai nommé ce lobby STUDENTMODE. À l'intérieur STUDENTMODE vous pouvez demander les notes d'un étudiant et vous pourriez théoriquement créer un nouvel étudiant ou ajouter une classe ou quoi que ce soit. Si vous utilisez l'intention existante GetGradeIntent et que vous lui attribuez un nom approprié, il enregistrera le nom de l'étudiant dans l'état de session et changera le mode en CLASSMODE qui n'accepte que Intents ClassNameIntent et BackIntent. Si vous essayez d'invoquer une autre intention, le nom d'une classe vous sera reprompté par le UnhandledIntent.En fournissant un cours approprié ou en disant "tout", vous recevrez une réponse et le mode sera changé en STUDENTMODE. cela vous replonge dans le hall où vous pouvez poser des questions sur les autres étudiants. Voila!

Ce processus de changement de mode est bien meilleur que le schéma d'intention multi-parties comme "Dites-moi les notes pour {studentName} dans {mathClass}". Bien que cela puisse certainement fonctionner, l'une des raisons pour lesquelles les modes sont meilleurs est qu'ils vous permettent de gérer correctement les erreurs si l'une des valeurs d'entrée est incorrecte, comme le nom de l'étudiant ou le nom de la classe. Vous pouvez facilement demander une seule information au lieu de demander à l'utilisateur de reformuler l'intégralité de l'intention multi-parties. Il vous permet également de gérer plusieurs éléments d'information, un petit morceau à la fois, avec des instructions détaillées pour permettre à Alexa de continuer à poser des questions de réécriture jusqu'à ce que tous les emplacements requis soient remplis.

Un article que je n'ai pas couvert.
Où stockez-vous vos étudiants? Je les ai codés en dur dans la fonction lambda. Vous pouvez vous connecter à la dynamodb d'amazon et y stocker vos états de session afin qu'ils soient disponibles à la prochaine session. C'est en fait aussi simple que d'ajouter.

alexa.dynamoDBTableName = 'NAME-OF-YOUR-DynamoDB-TABLE'; //You literally dont need any other code it just does the saving and loading??!! WHAT? 

à votre fonction ici.

exports.handler = function(event, context, callback) { 
    var alexa = Alexa.handler(event, context); 
    alexa.appId = appId; 
    alexa.dynamoDBTableName = 'NAME-OF-YOUR-DynamoDB-TABLE'; //You literally don't need any other code it just does the saving and loading??!! WHAT? 
    alexa.registerHandlers(newSessionHandlers, studentSkillSessionHandlers, specificClassSessionHandlers, functionHandlers); 
    alexa.execute(); 
}; 

Vous aurez besoin de créer une table de données DynamoDB et une autorisation IAm pour permettre à votre fonction lambda pour y accéder. Puis, par magie, Alexa va créer une seule ligne dans votre tableau de données pour chaque utilisateur unique. Un seul enseignant pourrait facilement ajouter les élèves dans leur classe. Cependant, si vous cherchez que chaque enseignant d'une école accède à une base de données principale, ce n'est probablement pas la bonne approche. Il existe probablement d'autres tutoriels sur la façon de connecter Alexa à un seul tableau de données entre plusieurs utilisateurs.

je crois que la préoccupation principale de votre question a été répondu par le différent MODES où vous pouvez bloquer les intentions indésirables. Si vous trouvé cette réponse utile, je prends le paiement en couches trident et réputation. Merci!