vxml: определение грамматик с эквивалентными входами
Я использую движок на основе TellMe. Я видел примеры грамматик, где пользователь может сказать одну из нескольких вещей, которые считаются одинаковыми. Тем не менее, все примеры, которые я видел, были для встроенных грамматик (которые не работают с движком vxml, который я использую). Я хочу знать, как я могу изменить свой файл.grxml, чтобы сделать это. Это файл:
<?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>
вместо 6 предметов я хочу иметь 3 предмета, каждый из которых имеет два возможных высказывания. Любые идеи о том, как я могу это сделать?
3 ответа
Я понял. Я изменил мою грамматику, чтобы выглядеть так:
<?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>
Затем вернитесь в мой сценарий вместо того, чтобы основывать свои действия на callerInput (переменная, указанная в <field>
тег), я основал их на callerInput$.interpretation, который содержит XML, содержащий все, что я назначил out.result в <tag>
элемент грамматики.
Я думаю, что имеет смысл основывать свои действия на "интерпретации", а не на буквальном вводе вызывающей стороны.
ПРИМЕЧАНИЕ. Поскольку мы работаем с собственным механизмом vxml, нам удалось создать метод для извлечения значения интерпретации из xml.
Более компактная форма:
<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>
Ответы, которые вы хотите, находятся в спецификации SISR, которая предоставляет механизм для добавления значения к входным путям. Переписать ваш пример:
<?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>
Несколько вещей, которые нужно знать:
- Я выбрал буквальный формат тега (обратите внимание на атрибут tag-format элемента грамматики). Это также могло бы быть реализовано с использованием "semantics/1.0", и содержимое тега выглядело бы так: out="exit";
- Значения формата тега TellMe могут отличаться, но их руководство по разработке подразумевает, что они следуют стандартам.
- Как только у вас все получится, не стесняйтесь создавать грамматики наполнителя (на языке SRGS, правила). Правила-заполнители будут правилами без СИ (без элементов тега) и содержат общие фразы, которые люди добавляют в ответы. Например, конечное правило, которое может быть добавлено в конце вашей грамматики:
</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>
Это будет поддерживать более естественные типы ответов. Это может или не может быть важным в зависимости от вашей телефонной базы. Грамматика наполнителя может быть очень большой, но, как правило, многократно используемой. Вы также можете добавить заполнитель в начале ввода. В приложениях с богатой речью наиболее значительный выигрыш в процессе настройки заключается в обновлении грамматики, чтобы она содержала фактические фразы, сказанные вызывающим абонентом, по сравнению с тем, что, по мнению разработчика или дизайнера VUI, было сказано.