2017-03-10 1 views
3

J'ai déjà posté cette question sur le forum des développeurs d'Amazon mais je n'y reçois pas de réponse. Je suppose que Stackoverflow aurait dû être le premier choix depuis le début:Alexa Custom Slot Type: Aucune valeur dans l'intention

D'après ce que j'ai compris si j'utilise un type de logement personnalisé même si la liste de ses valeurs possibles ne contient pas le mot prononcé, le mot prononcé est toujours transmis au fonction. La documentation dit 'Un type de slot personnalisé n'est pas l'équivalent d'une énumération. Les valeurs en dehors de la liste peuvent toujours être retournées si elles sont reconnues par le système de compréhension de la langue parlée.

Maintenant, j'ai un type de fente personnalisée LIST_OF_PERSONS avec des valeurs Matthias|Max et un énoncé de

EmployeeDetailsIntent {Person} 

Si j'appelle cela l'intention d'une valeur non LIST_OF_PERSONS l'intention s'appelle encore, mais le JSON ne contient pas " valeur "clé pour la fente:

"request": { 
    "type": "IntentRequest", 
    "requestId": "EdwRequestId.a943e233-0713-4ea5-beba-d9287edb6083", 
    "locale": "de-DE", 
    "timestamp": "2017-03-09T14:38:29Z", 
    "intent": { 
     "name": "EmployeeDetailsIntent", 
     "slots": { 
     "Person": { 
      "name": "Person" 
     } 
     } 
    } 
    } 

Est-ce que cela" fonctionne comme prévu "ou un bug? Comment puis-je accéder à la parole dans l'intention alors? Comme this.event.request.intent.slots.Person.value est indéfini?

Mon code réside dans AWS lambda et j'utilise le nodejs alexa-sdk version 1.0.7. La langue de ma compétence est l'allemand.

+0

Wierd. Je n'ai jamais eu un cas où l'attribut 'value' manquait dans les informations de slot. Une chose que je noterais est que mes listes de mots pour les emplacements personnalisés sont séparés par des lignes. Vous semblez utiliser un séparateur de barres? – Tom

+0

Le séparateur barre/tuyau est juste ce que la console de développement Amazon me montre comme un résumé. Lorsque je modifie les valeurs, elles sont séparées en ligne comme requis. – Korgen

+0

Ensuite, tout ce que je peux suggérer est que vous essayez la même compétence et les mêmes intentions avec en-US car le problème est spécifique à de-DE car beaucoup plus récent. – Tom

Répondre

0

J'ai vu cela se produire quand une intention a deux énoncés avec et sans fente. Par exemple:

myIntent ce qui rend une voiture aller vite myIntent ce qui fait un {} CAR_TYPE aller vite

où CAR_TYPE a une liste des différents types de voitures. MyIntent doit toujours définir l'emplacement CAR_TYPE pour myIntent dans le schéma, mais la première intention ne l'utilise pas. Dans ce cas, il peut être préférable d'inclure 'car' dans CAR_TYPE et d'éliminer le premier énoncé. Dans d'autres cas cependant, la grammaire de la phrase ne le permet pas vraiment, donc vous devez vous attendre à un slot vide comme vous le voyez.

0

Je crois que le problème est que les énoncés utilisant un type de logement personnalisé doivent être utilisés avec au moins une autre valeur.

Par exemple

EmployeeDetailsIntent get {Person} 

fonctionnera, tandis que

EmployeeDetailsIntent {Person} 

ne sera pas

1

(disclaimer:. Ce post résume mon "solution" Il pourrait ou pourrait ne pas être le " La meilleure manière ". Semble avoir travaillé pour moi si pensé que je partagerais/documente ici brièvement)

Je suis récemment tombé sur des questions similaires pour un énoncé qui ressemble à ceci:

"tell me about {townName}"

Si je dis "tell me about London", cela fonctionne.

Si je dis "tell me about" (délibérément un manque {townName}), le programme « meurt » (et renvoie une JSON recherche similaire à votre un, avec this.event.request.intent.slots.townName.value non défini)

Bien que je ne suis pas 100% sûr que ce soit signifiait être une «caractéristique» (c.-à-d. nous devons écrire un code plus intelligent pour contourner ce problème) ou un «problème» (c.-à-d. que l'équipe d'Alexa doit adresser ou corriger). Ce scénario a causé un vrai problème quand il est venu au processus de certification pour moi récemment. Pour contourner ce problème, j'ai implémenté une solution de contournement (ou correction, peu importe comment vous l'appelez) pour éviter qu'Alexa ne meure à la suite de cette affaire de bord.

A partir du fichier Alexa skill-sample-nodejs-triviaindex.js, j'ai trouvé une fonction d'extrait qui m'a aidé à travailler autour de ce (je l'ai édité un peu pour mon exemple pour simplifier):

function isAnswerSlotValid(intent) { 
    var answerSlotFilled = intent && intent.slots && 
     intent.slots.townName && intent.slots.townName.value; 
    return answerSlotFilled 
} 

(c.-à- cette fonction renvoie True pour les valeurs valides pour l'emplacement townName et False pour undefined/sinon).

En ce qui concerne la définition de l'intention, je pourrais utiliser cette fonction pour « contourner » un scénario de valeur sous vide:

var startHandlers = Alexa.CreateStateHandler(states.START,{ 

    // bla bla bla// 

    "AnswerIntent": function() { 

    // handel missing slot value 
    var answerSlotValid = isAnswerSlotValid(this.event.request.intent); 

    if (answerSlotValid && moreConditions) { 
     // do something fun 
    } 
    else { 
     // handle empty slot scenario 
    } 
    } 

    // bla bla bla// 

} 

serait intéressé de voir s'il y a mieux/plus de solutions « appropriées » à ceci pour manipuler des emplacements vides/non définis plus élégamment.