如何在GRXML中实现条件逻辑?NUANCE ASR语音识别语法开发需求
区分"Don't Know"与有效保险号的GRXML语法调整方案
我懂你现在的困扰——得在Nuance ASR里精准区分用户给出有效保险号和表示不知道(比如"don't know")的两种场景,触发不同的业务操作。针对你现有的GRXML语法,我来帮你调整实现这个需求:
核心思路
在公共规则_alpha里新增一个分支,专门匹配"don't know"这类表达,同时保留原有的保险号匹配逻辑,这样ASR就能明确区分两种情况,返回不同的语义结果供应用层处理。
修改后的完整GRXML代码
<?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"> <one-of> <!-- 匹配用户表示不知道的情况 --> <item> <one-of> <item>don't know</item> <item>i don't know</item> <item>no idea</item> <item>i have no idea</item> </one-of> <tag>SWI_meaning = "unknown"</tag> </item> <!-- 保留原有的保险号匹配逻辑 --> <item> <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> </item> </one-of> </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>
关键修改点说明
- 在公共根规则
_alpha中添加了<one-of>分支,分别处理"不知道"和有效保险号两种情况 - 针对"不知道"的场景,我添加了几种常见的口语表达(你可以根据实际业务场景补充更多,比如"i can't remember"等),并设置语义标记
SWI_meaning = "unknown",应用层拿到这个标记就可以触发对应的特定操作 - 原有的保险号验证逻辑完全保留,确保有效号码的识别不受影响
后续建议
- 可以根据用户实际使用的口语习惯,扩展"不知道"的匹配短语,提升识别覆盖率
- 在应用层处理ASR返回结果时,通过判断
SWI_meaning的值是"unknown"还是具体的保险号字符串,来区分执行不同的业务流程
内容的提问来源于stack exchange,提问作者ArcherGilly
相关产品推荐
相关产品推荐

