您当前的位置是:  首页 > 新闻 > 国内 >
 首页 > 新闻 > 国内 >

MRCP学习笔记-语音识别语法技术细节(SRGS)

2018-06-28 09:52:52   作者: james.zhu   来源:CTI论坛   评论:0  点击:


  前面的讲座中,我们介绍了描述语音合成标记语言。在上一个讲座中,笔者介绍了语音合成标记语言的基本语法和使用方式。在今天的章节中,我们继续介绍MRCP协议中另外一个重要的语言语法-语音识别语言的技术细节(英文全称是:Speech Recognition Grammar Specification)。Speech Recognition Grammar Specification我们简称为SRGS。
  SRGS是W3C定义的一种标准,在MRCP v2的规定中没有太多具体的规定,但是在语音识别服务器的设置方面需要其相关参数。因此,笔者认为有必要做一些具体的介绍。SRGS用来支持应用开发人员通过设定的单词或单词模式的语法结构,这个语法结构能够被语音识别引擎听或者识别。SRGS支持两种语法格式,它们分别是XML格式和ABNF格式。在我们介绍的语法格式中,我们会重点介绍XML格式,因为在MRCP协议中我们主要还是使用XML格式。关于ABNF格式,用户可以参考相关的rfc5234做进一步了解。在本章节中,我们将会介绍SRGS的基本语法,语义说明和一些关联处理机制。
  1、语音识别的语法是通过对语言限定来支持语音识别的处理。语音识别语法通过语言限定可以减少句子内容的不确定性,从而更好地支持语音识别。正式的语法都是由一系列规则和一些标识,象征符号通过恰当的排列组成而成。
  SRGS有两种不同的语法结构。一种是递归状态,表示了一种语法上下文的语法结构。另外一种则不是递归状态,表示了一种有限状态或规则语法结构。语音识别的核心Hidden Markov Model(HMM)本身就是一个有限状态机(参考上图)。现在的语音识别引擎可以支持从由少量单词组成的语法也可以支持复杂的上百单词组成的语法结构。语音识别的准确率以及处理速度和语法的复杂程度和语法的困惑度相关。换句话说,如果增加了单词或语法结构,或增加了语法的困惑度会影响语音识别引擎的执行效率,也会降低语音识别的准确率和处理的速度。我们刚才也提到了困惑度的概念,困惑度简单来说就是一个语法结构中平均支持的分支节点,如果结束符越多,需要判断的点会越多。因此,如果开发人员需要完成一套高质量的语法必须有非常大的投入,前期测试和后期维护工作。现在让我们了解一些关于SRGS中主要的语法结构和其应用。
  2、首先,我们介绍一下SRGS的文件结构。SRGS文件支持XML格式,通过媒体类型application/srgs+xml来定义。以下是SRGS支持的属性:
  其基本的语法格式为:
  
  
  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"
  mode="voice"
  xml:lang="en-GB"
  root="example">
  
  yes
  
  
  这里,所有的SRGS文件标签都已开始。读者需要注意到是mode的属性。默认属性是voice,也可以是DTMF,不支持两种类型混合使用。如果是vocie表示输入的值是语音;如果是DTMF则表示输入的值是DTMF。但是,在一些复杂配置环境中,语音识别引擎可以同时激活两种模式支持。在未来的讲座中,我们会涉及这些两种模式的使用方式。
  3、语法包含一个或多个规则定义。每个规则定义由一个,名称和ID构成。我们称每个规则定义的内容为规则扩展。一个规则扩展将匹配完整语句中的部分内容。一个简单的规则扩展由按序排列的标志构成。一个单词加一个空格就是一个标志单位。
  
  
  xmlns="http://www.w3.org/2001/06/grammar"
  mode="voice"
  xml:lang="en-GB"
  root="pizza">
  I want a hot pepperoni pizza
  I want a hot pepperoni pizza
  
  
  在以上的示例中,语音发音必须全部完整匹配标志的顺序格式。SRGS语法同样可以支持添加一个或者多个要素来增加语法的可阅读性。这里,我们仅介绍了一个非常简单,定义非常严格的规则扩展。事实上,SRGS可以实现非常强大的语法扩展,我们在后续的章节中会逐步介绍。
  4、在规则扩展中可以支持多个可选项的设置。SRGS使用要素来表达。每个中可以包含多个item规则扩展。
  
  xmlns="http://www.w3.org/2001/06/grammar"
  mode="voice"
  xml:lang="en-GB"
  root="pizza">
  
  I want a hot
  
  pepperoni
  vegetarian
  cheese
  pizza
  
  以上可选项支持了非常灵活的语法结构。它可以匹配:
  I want a hot pepperoni pizza
  I want a hot vegetarian pizza
  I want a hot cheese pizza
  高级语法中可以对不同的选项设置不同的权重。权重值等于1表示无权重,小于1表示负面的偏好,大于1表示正面的偏好。在上面的语法中,我们可以添加权重来表示特定的优先级设置,发生几率高于其他选项设置:
  
  xmlns="http://www.w3.org/2001/06/grammar"
  mode="voice"
  xml:lang="en-GB"
  root="pizza">
  I want a hot
  
  pepperoni
  vegetarian
  cheese
  pizza
  
  5、SRGS的规则扩展中可以支持一个参照规则来引入其他的规则,通过要素加以说明。规则参照的主要目的是重用规则扩展。其用法规则如下:
  
  
  xmlns="http://www.w3.org/2001/06/grammar"
  mode="voice"
  xml:lang="en-GB"
  root="pizza">
  I want a hotpizza
  
  
  pepperoni
  vegetarian
  cheese
  
  
  可参照的规则通过URI属性的值来定义。当然,它也可以通过一个完整的URL来定义:
  6、SRGS通过预留的名称定义了三种特别的规则,它们分别是:NULL,VOID 和GARBAGE。其作用表示:
  NULL,如果讲话者没有说任何语句,自动匹配为Null。
  VOID,在排列顺序中是一个相反的效果,它说明顺序从来没有匹配。
  GARBAGE,则会一直匹配,直到下一个标志,语法扩展或结束输入。
  
  
  xmlns="http://www.w3.org/2001/06/grammar"
  mode="voice"
  xml:lang="en-GB"
  root="pizza">
  I want a hotpizza
  
  在以上的语法中,任何语句内容都可以匹配此语法规则(介于hot和pizza之间的输入内容)。例如,“I want a hot something or other pizza”就可以匹配以上语法规则。
  7、SRGS提供了一个结构支持规则扩展重复。通过一个重复的要素设置可以增加语法的紧凑性。大家可以想象一下,如果在语法中需要定义一个数值长度的话,可能需要从0到9这样的设置,我们使用,则需要很多次重复的语句,语句就会显得非常冗长。以下是repeat 属性的设置语法:
  repeat 表示的取值范围如下:
  0-1表示包含的规则开展内容是可选的
  0-表示至少包含零次,一次或多次规则扩展
  1-表示至少发生一次匹配
  以下就是一个使用repeat的示例,表示允许用户说“very” 三次。
  
  xmlns="http://www.w3.org/2001/06/grammar"
  mode="voice"
  xml:lang="en-GB"
  root="pizza">
  I want a
  veryhotpizza
  
  
  pepperoni
  vegetarian
  cheese
  
  
  SRGS的语法也可以支持在语音通信领域中用户经常使用的DTMF按键。很多时候,用户通过DTMF输入来确认一些系统信息,例如密码或其他语音选项设置。SRGS的DTMF和通信领域中的DTMF按键有所不同,通信领域的可以接受0-9数字,ABCD等其他字符设置,而SRGS支持0-9数字,语法结构也比较简单,以下是一个可以接受4位数DTMF的语法格式:
  
  
  xmlns="http://www.w3.org/2001/06/grammar"
  mode="dtmf"
  root="digits">
  
  
  
  
  
  
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
  
  
  
  8、在SRGS语法提供了对语义解释(SISR)的两种方式,它们可以通过tag-format来获得支持。很多情况下,我们使用不同的表达方式来解释同一种结果。其中一种是semantics/1.0-literals的方式,这里无论用户以哪种方式说yes/no,都会返回yes/no的结果,其数值结构是ECMAScript 的数据格式。
  
  
  xmlns="http://www.w3.org/2001/06/grammar"
  mode="voice"
  xml:lang="en-GB"
  root="yesno"
  tag-format="semantics/1.0-literals">
  
  
  yes
  yeayes
  ayeyes
  no
  nopeno
  nahno
  
  
  
  另外一种是使用语义脚本语言,通过tag-format-semantics/1.0获得支持。tag中的内容被看作是ECMAScript 代码。ECMAScript是一种脚本语言,类似于我们现在通常用到的JavaScript。
  
  
  xmlns="http://www.w3.org/2001/06/grammar"
  mode="voice"
  xml:lang="en-GB"
  root="pizza"
  tag-format="semantics/1.0">
  
  I want a
  
  largeout.size="large";
  smallout.size="small";
  
  
  pepperoniout.sort=1;
  vegetarianout.sort=2;
  cheeseout.sort=3;
  
  pizza
  
  
  这里,我们假设发音是”I want a large vegetarian pizza“,那么返回ECMAScript 脚本对象的两个属性是size 和 sort类型,其值分别是large和2。其取值变量遵循的是ECMAScript 标准。脚本的对象数值是:
  {
  size: "large",
  sort: 2
  }
  这个标识符表示了脚本的数据结构,语音应用程序将其数值存储为数据库的数据以便将来使用。semantics/1.0还支持了meta 数据的表达方式等灵活的处理方式,我们这里不再做更多介绍。具体的实现方式建议大家参考相关的SISR技术资料。另外,语义脚本语言支持的是ECMScript, 关于脚本语言的使用方式和变量取值等内容,读者可以参考我们的链接。
  9、在本章节中,我们重点介绍了SRGS技术细节中几个主要的概念和要素使用方式以及其相关的语法结构。首先,笔者对语音识别语法的背景做了简单介绍,然后对一些关键语法做了细致的介绍,包括的关键语法为可选项设置,重复语法设置,预留的三种特殊设置,语义脚本结构(SISR),DTMF设置等设置语法。这些关键语法可以帮助优化语法文件的结构,增加其灵活性和紧凑性,从而使其语法规则更接近于人类的自然语言。
  在接下来的章节中,笔者会介绍自然语言语义标识语言(NLSML)的语法结构和其使用方式。
  参考资料:
  https://tools.ietf.org/rfc/rfc5234.txt
  http://cs229.stanford.edu/section/cs229-hmm.pdf
  关于SISR标准技术:https://www.w3.org/TR/semantic-interpretation/
  http://www.ecma-international.org/publications/standards/Ecma-327.htm
  HMM介绍-A Tutorial on Hidden Markov Models and
  Selected Applications in Speech Recognition
     
 
  unimrcp-MRCP协议学习分享,QQ群号:208136295
  关注微信公众号:asterisk-cn,获得有价值的行业分享
  freepbx 技术论坛:www.ippbx.org.cn
  Asterisk, freepbx技术文档: www.freepbx.org.cn
  欧米(Omni)智能客服解决方案
  融合通信商业解决方案,协同解决方案首选产品:www.hiastar.com
 

【免责声明】本文仅代表作者本人观点,与CTI论坛无关。CTI论坛对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。请读者仅作参考,并请自行承担全部责任。

专题