2010-07-07 18 views
0

J'utilise un moteur basé sur TellMe. J'ai vu des exemples de grammaires où l'utilisateur peut dire l'une des choses différentes qui sont considérées comme identiques. Cependant, tous les exemples que j'ai vus ont été pour des grammaires en ligne (qui ne fonctionnent pas avec le moteur de vxml im using). Je veux savoir comment je peux changer mon fichier .grxml pour le faire. C'est le fichier:vxml: définir des grammaires avec des entrées équivalentes

<?xml version="1.0"?> 
<!-- created by Matthew Murdock. Grammars for speech rec menus --> 
<grammar xmlns="http://www.w3.org/2001/06/grammar" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/06/grammar  http://www.w3.org/TR/speech-grammar/grammar.xsd" xml:lang="en" version="1.0" mode="voice" scope="dialog" tag-format="semantics/1.0.2006"> 
    <rule id="keep"> 
     <one-of> 
     <item>exit</item> 
     <item>exit the system</item> 
     <item>another</item> 
     <item>another mailbox</item> 
     <item>play</item> 
     <item>play back</item>      
     </one-of> 
    </rule> 
</grammar> 

Au lieu d'avoir 6 articles, je veux avoir 3 articles, chacun ayant deux énoncés possibles. Des idées sur comment je peux le faire?

+0

Bien qu'il n'y ait pas commun (si même utilisé) balises sur le SO, probablement la peine d'ajouter SRGS et SISR à la liste des tags. Il y a quelques autres développeurs VoiceXML qui posent des questions ici et quelqu'un pourrait en tirer profit. –

Répondre

0

Je l'ai compris. J'ai changé ma grammaire pour ressembler à ceci:

<?xml version="1.0"?> 
<grammar xmlns="http://www.w3.org/2001/06/grammar" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/06/grammar  http://www.w3.org/TR/speech-grammar/grammar.xsd" xml:lang="en" version="1.0" mode="voice" scope="dialog" tag-format="semantics/1.0-literals"> 
    <rule id="keep"> 
     <one-of> 
     <item><ruleref id="#exit"/></item> 
     <item><ruleref id="#play"/></item> 
     </one-of> 
    </rule> 
    <rule id="exit"> 
     <one-of> 
     <item>exit</item> 
     <item>exit the system</item> 
     </one-of> 
     <tag>out.result = "exit"</tag> 
    </rule> 
    <rule id="play"> 
     <one-of> 
     <item>play</item> 
     <item>play back</item> 
     </one-of> 
     <tag>out.result = "play"</tag> 
    </rule> 
</grammar> 

Puis, dans mon script au lieu de baser mes actions sur callerInput (la variable spécifiée dans la balise <field>), je les ai basé sur des callerInput .interpretation $ qui détient xml contenant tout ce que j'ai assigné out.result à dans l'élément <tag> de la grammaire.

Je suppose qu'il est logique de baser vos actions sur «l'interprétation» et non sur l'entrée littérale de l'appelant. REMARQUE: Étant donné que nous travaillons avec notre propre moteur vxml, nous avons été en mesure de créer une méthode pour extraire la valeur d'interprétation du fichier .xml.

0

Les réponses souhaitées sont dans la spécification SISR qui fournit un mécanisme pour attacher une signification aux chemins d'entrée. Réécriture votre exemple:

<?xml version="1.0"?> 
<grammar xmlns="http://www.w3.org/2001/06/grammar" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/06/grammar  http://www.w3.org/TR/speech-grammar/grammar.xsd" xml:lang="en" version="1.0" mode="voice" scope="dialog" tag-format="semantics/1.0-literals"> 
    <rule id="keep"> 
     <one-of> 
     <item> 
     <one-of> 
     <item>exit</item> 
     <item>exit the system</item> 
     </one-of> 
     <tag>exit</tag> 
     </item> 

     <item> 
     <one-of> 
     <item>another</item> 
     <item>another mailbox</item> 
     </one-of> 
     <tag>another</tag> 
     </item> 

     <item> 
     <one-of> 
     <item>play</item> 
     <item>play back</item>      
     </one-of> 
     <tag>play</tag> 
     </item> 
     </one-of> 
    </rule> 
</grammar> 

Plusieurs choses à savoir:

  • J'ai choisi le format d'étiquette littérale (notez l'attribut balise format de l'élément de grammaire). Il aurait pu aussi être implémenté en utilisant "semantics/1.0" et le contenu du tag aurait ressemblé à: out = "exit";
  • Les valeurs de format d'étiquette TellMe doivent être différentes, mais leur development guide implique qu'elles respectent les normes.
  • Une fois que vous l'avez fonctionné, n'hésitez pas à créer des grammaires de remplissage (en langage SRGS, règles). Les règles de remplissage seraient des règles sans aucun SI (aucun élément de balise) et contiennent des phrases courantes que les gens ajoutent aux réponses. Par exemple, une règle de fuite qui pourrait être ajouté à la fin de votre grammaire:
 </one-of> 
     <item repeat="0-1"><ruleref uri="#trailing"/></item> 
    </rule> 

    <rule id="trailing> 
     <one-of> 
     <item>please</item> 
     <item>thank you</item> 

     </one-of> 
    </rule> 

</grammar> 

Cela soutiendrait plusieurs types naturels de réponses. Cela peut ou non être important selon votre base d'appels. Les grammaires de remplissage peuvent être très volumineuses, mais ont tendance à être hautement réutilisables. Vous pouvez également ajouter un remplissage au début de l'entrée. Dans les applications vocales riches, le gain le plus significatif dans le processus de réglage implique la mise à jour de la grammaire pour contenir les phrases réelles prononcées par l'appelant par rapport à ce que le développeur ou le concepteur VUI pensait être parlé.

+0

Je suis désolé mais votre suggestion ne fonctionne pas.'' ne peut pas être l'enfant de '' dans TellMe ou dans mon moteur. J'utilise Lumenvox pour le discours rec si cela aide. – mtmurdock

+0

Vous avez raison. Les éléments internes doivent être entourés d'éléments . –

2

Une forme plus compacte:

<rule id="exit"> 
    exit <item repeat="0-1">the system</item> 
    <tag>out.result = "exit"</tag> 
    </rule> 
    <rule id="play"> 
    play <item repeat="0-1">back</item> 
    <tag>out.result = "play"</tag> 
    </rule>