有没有办法在 grxml 中进行条件逻辑?
Is there a way to conduct conditional logic in grxml?
我正在为语音识别开发语法,但遇到了困难。
如果客户不知道提示的答案并说 "don't Know" 而其他客户确实知道答案,我正在考虑将它们分开。
例如,如果请求保险号码:AB112233C,用户可能知道也可能不知道。
如果用户不知道,我想在应用程序中执行特定操作。
我正在使用 NUANCE 作为 ASR。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<grammar xmlns="http://www.w3.org/2001/06/grammar"
xml:lang="en-GB" root="_alpha" version="1.0"
mode="voice" tag-format="swi-semantics/1.0">
<rule id="_alpha" scope="public">
<ruleref uri="#alpha"/>
<tag>
/* Only some letters allowed in prefix and suffix */
var alpharegex = /^([A-CEGHJ-PR-TW-Z]){1}([A-CEGHJ-NPR-TW-Z]){1}([0-9]){2}([0-9]){2}([0-9]){2}([A-D ]){1}?$/;
if ( !alpharegex.test(nino.out) ) SWI_disallow = 1;
SWI_meaning = alpha.out;
</tag>
</rule>
<rule id="alpha">
<ruleref special="GARBAGE"/>
<ruleref uri="#prefix"/><tag>out = prefix.out</tag>
<ruleref uri="#digits"/><tag>out += digits.out</tag>
<ruleref uri="#suffix"/><tag>out += suffix.out</tag>
</rule>
<rule id="prefix">
<tag>out = '';</tag>
<item repeat="2">
<one-of>
<item><tag>out += 'A'</tag>a</item>
<item><tag>out += 'B'</tag>b</item>
<item><tag>out += 'C'</tag>c</item>
<item><tag>out += 'E'</tag>e</item>
<item><tag>out += 'G'</tag>g</item>
<item><tag>out += 'H'</tag>h</item>
<item><tag>out += 'J'</tag>j</item>
<item><tag>out += 'K'</tag>k</item>
<item><tag>out += 'L'</tag>l</item>
<item><tag>out += 'M'</tag>m</item>
<item><tag>out += 'N'</tag>n</item>
<item><tag>out += 'O'</tag>o</item>
<item><tag>out += 'P'</tag>p</item>
<item><tag>out += 'R'</tag>r</item>
<item><tag>out += 'S'</tag>s</item>
<item><tag>out += 'T'</tag>t</item>
<item><tag>out += 'W'</tag>w</item>
<item><tag>out += 'X'</tag>x</item>
<item><tag>out += 'Y'</tag>y</item>
<item><tag>out += 'Z'</tag>z</item>
</one-of>
</item>
<tag>
/* alpha can't start with any of these */
var badPrefixes = /^(BG|GB|KN|NK|NT|TN|ZZ)/;
if ( badPrefixes.test(out) ) SWI_disallow = 1;
</tag>
</rule>
<rule id="digits">
<tag>out = '';</tag>
<item repeat="6">
<one-of>
<item><tag>out += '0'</tag>oh</item>
<item><tag>out += '0'</tag>zero</item>
<item><tag>out += '1'</tag>one</item>
<item><tag>out += '2'</tag>two</item>
<item><tag>out += '3'</tag>three</item>
<item><tag>out += '4'</tag>four</item>
<item><tag>out += '5'</tag>five</item>
<item><tag>out += '6'</tag>six</item>
<item><tag>out += '7'</tag>seven</item>
<item><tag>out += '8'</tag>eight</item>
<item><tag>out += '9'</tag>nine</item>
</one-of>
</item>
</rule>
<rule id="suffix">
<item repeat="0-1">
<one-of>
<item><tag>out = 'A'</tag>a</item>
<item><tag>out = 'B'</tag>b</item>
<item><tag>out = 'C'</tag>c</item>
<item><tag>out = 'D'</tag>d</item>
</one-of>
</item>
</rule>
</grammar>
为 "i don't know" 添加一个单独的分支。您可以在其中之一中使用 rulerefs:
<rule id="alpha">
<one-of>
<item>
<ruleref special="GARBAGE"/>
<ruleref uri="#prefix"/><tag>out = prefix.out</tag>
<ruleref uri="#digits"/><tag>out += digits.out</tag>
<ruleref uri="#suffix"/><tag>out += suffix.out</tag>
</item>
<item>i don't know</item>
</one-of>
</rule>
总的来说,最好避免复杂的语法和规则。这是 2018 年,是时候放弃 Nuance 了。试试 Google 的 Dialogflow 或开源语音识别器,你会惊讶于它的好用。
我正在为语音识别开发语法,但遇到了困难。
如果客户不知道提示的答案并说 "don't Know" 而其他客户确实知道答案,我正在考虑将它们分开。
例如,如果请求保险号码:AB112233C,用户可能知道也可能不知道。
如果用户不知道,我想在应用程序中执行特定操作。
我正在使用 NUANCE 作为 ASR。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<grammar xmlns="http://www.w3.org/2001/06/grammar"
xml:lang="en-GB" root="_alpha" version="1.0"
mode="voice" tag-format="swi-semantics/1.0">
<rule id="_alpha" scope="public">
<ruleref uri="#alpha"/>
<tag>
/* Only some letters allowed in prefix and suffix */
var alpharegex = /^([A-CEGHJ-PR-TW-Z]){1}([A-CEGHJ-NPR-TW-Z]){1}([0-9]){2}([0-9]){2}([0-9]){2}([A-D ]){1}?$/;
if ( !alpharegex.test(nino.out) ) SWI_disallow = 1;
SWI_meaning = alpha.out;
</tag>
</rule>
<rule id="alpha">
<ruleref special="GARBAGE"/>
<ruleref uri="#prefix"/><tag>out = prefix.out</tag>
<ruleref uri="#digits"/><tag>out += digits.out</tag>
<ruleref uri="#suffix"/><tag>out += suffix.out</tag>
</rule>
<rule id="prefix">
<tag>out = '';</tag>
<item repeat="2">
<one-of>
<item><tag>out += 'A'</tag>a</item>
<item><tag>out += 'B'</tag>b</item>
<item><tag>out += 'C'</tag>c</item>
<item><tag>out += 'E'</tag>e</item>
<item><tag>out += 'G'</tag>g</item>
<item><tag>out += 'H'</tag>h</item>
<item><tag>out += 'J'</tag>j</item>
<item><tag>out += 'K'</tag>k</item>
<item><tag>out += 'L'</tag>l</item>
<item><tag>out += 'M'</tag>m</item>
<item><tag>out += 'N'</tag>n</item>
<item><tag>out += 'O'</tag>o</item>
<item><tag>out += 'P'</tag>p</item>
<item><tag>out += 'R'</tag>r</item>
<item><tag>out += 'S'</tag>s</item>
<item><tag>out += 'T'</tag>t</item>
<item><tag>out += 'W'</tag>w</item>
<item><tag>out += 'X'</tag>x</item>
<item><tag>out += 'Y'</tag>y</item>
<item><tag>out += 'Z'</tag>z</item>
</one-of>
</item>
<tag>
/* alpha can't start with any of these */
var badPrefixes = /^(BG|GB|KN|NK|NT|TN|ZZ)/;
if ( badPrefixes.test(out) ) SWI_disallow = 1;
</tag>
</rule>
<rule id="digits">
<tag>out = '';</tag>
<item repeat="6">
<one-of>
<item><tag>out += '0'</tag>oh</item>
<item><tag>out += '0'</tag>zero</item>
<item><tag>out += '1'</tag>one</item>
<item><tag>out += '2'</tag>two</item>
<item><tag>out += '3'</tag>three</item>
<item><tag>out += '4'</tag>four</item>
<item><tag>out += '5'</tag>five</item>
<item><tag>out += '6'</tag>six</item>
<item><tag>out += '7'</tag>seven</item>
<item><tag>out += '8'</tag>eight</item>
<item><tag>out += '9'</tag>nine</item>
</one-of>
</item>
</rule>
<rule id="suffix">
<item repeat="0-1">
<one-of>
<item><tag>out = 'A'</tag>a</item>
<item><tag>out = 'B'</tag>b</item>
<item><tag>out = 'C'</tag>c</item>
<item><tag>out = 'D'</tag>d</item>
</one-of>
</item>
</rule>
</grammar>
为 "i don't know" 添加一个单独的分支。您可以在其中之一中使用 rulerefs:
<rule id="alpha">
<one-of>
<item>
<ruleref special="GARBAGE"/>
<ruleref uri="#prefix"/><tag>out = prefix.out</tag>
<ruleref uri="#digits"/><tag>out += digits.out</tag>
<ruleref uri="#suffix"/><tag>out += suffix.out</tag>
</item>
<item>i don't know</item>
</one-of>
</rule>
总的来说,最好避免复杂的语法和规则。这是 2018 年,是时候放弃 Nuance 了。试试 Google 的 Dialogflow 或开源语音识别器,你会惊讶于它的好用。