本发明属于语音识别
技术领域:
:,主要是一种提高嘈杂环境下语音识别率的方法。
背景技术:
::目前语音识别技术日渐成熟并应用在各个领域。如手机上的各种语音搜索应用、语音发短信、对话聊天软件、语音导航软件等等。这些应用都是借助语音识别技术将语音转换为文字,大大降低了人们使用软件时输入的工作量。当前语音识别技术在提高人们使用便利性的同时,也存在一些问题。如在办公室内、家里和其它安静的场合,识别率都非常高;但在比较嘈杂的公共场合环境,识别率就直线跳水,非常低了。识别率变低的原因就是环境噪音和使用者的声音进行了叠加,对识别软件造成了干扰。如在公共场合某些支持语音搜索的自助设备,当客户说需要的酒店区域的时候,由于噪音的叠加,真实需要的区域“三墩”也许会被它理解为“山东”、“山洞”、甚至“汕头”。针对这个问题,许多语音识别系统也有一些优化方案,如可以上传本地的热词表到云端识别系统,让“三墩”这个地名优先被匹配;或者应用软件自己做区分,将识别到的“山东”,“汕头”强制转化为“三墩”。热词表的方案,其实解决的是同音词的问题。比如说“三墩”这个音,由于该地名比较生僻,如果不加该热词,可能会被识别为“三吨”或者“三顿”。这些词发音完全一致,加上热词“三墩”,就是告诉识别云平台,遇到这个音要优先选择热词“三顿”。所以该方案只能较好得解决同音词的问题,如果识别声音源本身受到了干扰,发生了变形,则还是会被识别为其它常见近似语音,如“山东”。应用软件自己强制转换的方案,在一定程度上是可行的,只要在代码里或者数据字典里做好识别词组的翻译即可。如在某包含“三墩”而不需要“山东”等地名的业务场景下,发现识别结果是“山东”、“山洞”或者“汕头”,就强制转换为“三墩”,可以满足业务需求。但该方案的缺陷是,识别结果的不确定导致代码或者数据字典频繁更新。比如识别出“扇动”、“闪动”这些词,其实用户说的是“三墩”,那么这些词就得加到数据字典里,强制转换为“三墩”。下次发现识别出“煽动”,又得继续加入数据字典。识别结果的不确定导致维护工作量极大。技术实现要素:本发明的目的在于克服现有技术存在的不足,而提供一种提高嘈杂环境下语音识别率的方法。本发明的目的是通过如下技术方案来完成的。这种提高嘈杂环境下语音识别率的方法,该方法包括如下步骤:第一步:从识别云平台取得识别结果;第二步:将识别结果快速翻译为拼音;第三步:查询数据库配置表,将拼音翻译为业务需要的文字;第四步:将翻译后的文字返回给应用程序。更进一步的,在第二步中:(1)、根据汉字的gbk编码为索引做一个汉字和拼音的映射表,根据汉字的gbk编码直接定位到汉字的拼音;(2)、一个汉字的gbk编码由2个字节组成,分为首字节和末字节,首字节从0xb0到0xf7,末字节从0xa1到0xfe;设计一个汉字拼音映射二维数组pytable,第一行存储“首字节是0xb0的汉字组”的拼音,第二行存储“首字节是0xb1的汉字组”的拼音,以此类推,最后一行存储“首字节是0xf7的汉字组”的拼音;每一组里再按“末字节”编码的顺序存储;(3)、将汉字串快速翻译为拼音串:第1步,取得要转换汉字的首字节head;第2步,判断head是否小于0xb0;如果小于0xb0,则说明本次检测的字符不是汉字,走到第7步,继续检测下一个汉字;否则往下走到第3步;第3步,取得该汉字的末字节tail;第4步,将首字节head减掉0xb0,得到第一维的下标index1;第5步,将末字节tail减掉0xa1,得到第二维的下标index2;第6步,得到该汉字的拼音数据pytable[index1][index2]并拼接;第7步,判断是否还有汉字串需要转换,有的话转到第1步;否则结束;通过以上步骤,通过计算汉字的gbk编码,迅速得到了该汉字的拼音。更进一步的,在第三步中:根据业务的不同,需要配置不同的转换关系,将这个转换将通过数据库查表实现,数据库配置表里面存储拼音和汉字的对应关系,通过sql语句将拼音串转化为汉字串。本发明的有益效果为:本发明提供了一种有效提高嘈杂环境下语音识别率的方法,能够用非常少的代价,大大提高嘈杂环境下的识别率。通过实施这种拼音近似音的定制转化,显著提高了嘈杂环境下命令词的识别率,同时也大大降低了代码和数据字典维护的工作量。附图说明图1为本发明的示意图。图2为本发明的汉字gbk编码示意图。图3为本发明的汉字拼音映射二维数组示意图。图4为本发明的汉字串快速翻译为拼音串的步骤示意图。图5为本发明的拼音转化汉字配置表示意图。图6为本发明的汉字拼音映射二维数组的“山洞”例示意图。具体实施方式下面将结合附图对本发明做详细的介绍:总方案如图1所示:第1步:从识别云平台取得识别结果。第2步:将识别结果快速翻译为拼音。第3步:查询数据库配置表,将拼音翻译为业务需要的文字。第4步:将翻译后的文字返回给应用程序。算法介绍:第1步:从识别云平台取得识别结果。当前有许多的识别云平台提供公用的识别服务,如讯飞公司、捷通公司等等。这里不表。该方案的重点在于第2步,将识别结果迅速翻译为拼音;和第3步,根据配置表将类似的拼音转化为相同文字。下面分别介绍这2个关键步骤。第一步,将识别结果快速翻译为拼音。考虑到识别平台返回的汉字均为常见汉字,数量远小于gbk编码表中的汉字。我们可以根据汉字的gbk编码为索引做一个汉字和拼音的映射表,根据汉字的gbk编码直接定位到汉字的拼音,其时间复杂度为o(1)。这样做可以避免汉字配置在数据库里,用查表转换这种通常做法带来的数据库开销和网络时延。一个汉字的gbk编码由2个字节组成,如图2,分为首字节和末字节。常见汉字的gbk编码范围,首字节从0xb0到0xf7,末字节从0xa1到0xfe(不含a0)。设计一个如图3的汉字拼音映射二维数组。第一行存储“首字节是0xb0的汉字组”的拼音,第二行存储“首字节是0xb1的汉字组”的拼音,以此类推,最后一行存储“首字节是0xf7的汉字组”的拼音。每一组里再按“末字节”编码的顺序存储。注意该数组逻辑上存储的是汉字的拼音,物理上存储的实际是拼音字符串的指针。设该拼音二维数组为pytable[72][94],共有72行,每行有94列。如图4,将汉字串快速翻译为拼音串的步骤如下:第1步,取得要转换汉字的首字节head;第2步,判断head是否小于0xb0;如果小于0xb0,则说明本次检测的字符不是汉字,走到第7步,继续检测下一个汉字;否则往下走到第3步;第3步,取得该汉字的末字节tail;第4步,将首字节head减掉0xb0,得到第一维的下标index1;第5步,将末字节tail减掉0xa1,得到第二维的下标index2;第6步,得到该汉字的拼音数据pytable[index1][index2]并拼接;第7步,判断是否还有汉字串需要转换,有的话转到第1步;否则结束。通过以上步骤,通过计算汉字的gbk编码,迅速得到了该汉字的拼音。第二步,根据配置表将类似的拼音转化为相同文字。根据业务的不同,需要配置不同的转换关系,故为了便于维护,这个转换将通过数据库查表实现。设计如图5的表格,里面存储拼音和汉字的对应关系。则很容易通过sql语句将拼音串转化为汉字串。可见,单个汉字转化为拼音的时间复杂度为o(1),效率很高。同时由于上述汉字和拼音映射的二维数组的存储内容为拼音字符串的指针,存储空间为72*94*4=27072字节,汉字的所有拼音组合约500种,约占用空间1000字节,故最终消耗存储空间约为28000字节,不到30kb,所消耗的内存也很少。实施例:第1步:从识别云平台取得识别结果“山洞”。第2步:将识别结果快速翻译为拼音“shandong”。第3步:查询数据库配置表,将拼音“shandong”翻译为业务需要的文字“三墩”。第4步:将翻译后的文字“三墩”返回给应用程序。算法介绍:第1步:从识别云平台取得识别结果“山洞”。该方案的重点在于第2步,将识别结果“山洞”迅速翻译为拼音“shandong”;和第3步,根据配置表将类似的拼音“shandong”转化为相同文字“三墩”。下面分别介绍这2个关键步骤。第一步,将识别结果“山洞”快速翻译为拼音“shandong”。考虑到识别平台返回的汉字均为常见汉字,数量远小于gbk编码表中的汉字。我们可以根据汉字的gbk编码为索引做一个汉字和拼音的映射表,根据汉字的gbk编码直接定位到汉字的拼音,其时间复杂度为o(1)。这样做可以避免汉字配置在数据库里,用查表转换这种通常做法带来的数据库开销和网络时延。一个汉字的gbk编码由2个字节组成,如图2,分为首字节和末字节。本例待转换汉字串为“山洞”,其中“山”的gbk编码的首字节为0xc9,末字节为0xbd;“洞”的首字节为0xb6,末字节为0xb4。常见汉字的gbk编码范围,首字节从0xb0到0xf7,末字节从0xa1到0xfe(不含a0)。设计一个如图3的汉字拼音映射二维数组。第一行存储“首字节是0xb0的汉字组”的拼音,第二行存储“首字节是0xb1的汉字组”的拼音,以此类推,最后一行存储“首字节是0xf7的汉字组”的拼音。每一组里再按“末字节”编码的顺序存储。注意该数组逻辑上存储的是汉字的拼音,物理上存储的实际是拼音字符串的指针。如图6,本例“山洞”的拼音存储位置已清晰地标注出来。设该拼音二维数组为pytable[72][94],共有72行,每行有94列。将汉字串“山洞”快速翻译为拼音串的步骤如下:先检测“山”:第1步,取得要转换汉字的首字节head为0xc9;第2步,判断head0xc9是否小于0xb0;如果小于0xb0,则说明本次检测的字符不是汉字,走到第7步,继续检测下一个汉字;否则往下走到第3步;第3步,取得该汉字的末字节tail为0xbd;第4步,将首字节head0xc9减掉0xb0,得到第一维的下标index1为25;第5步,将末字节tail0xbd减掉0xa1,得到第二维的下标index2为28;第6步,得到该汉字的拼音数据pytable[25][28]为“shan”;第7步,判断是否还有汉字串需要转换,有的话转到第1步;显然本例还有汉字“洞”需要转化,步骤如下。再检测“洞”:第1步,取得要转换汉字的首字节head为0xb6;第2步,判断head0xb6是否小于0xb0;如果小于0xb0,则说明本次检测的字符不是汉字,走到第7步,继续检测下一个汉字;否则往下走到第3步;第3步,取得该汉字的末字节tail为0xb4;第4步,将首字节head0xb6减掉0xb0,得到第一维的下标index1为6;第5步,将末字节tail0xb4减掉0xa1,得到第二维的下标index2为19;第6步,得到该汉字的拼音数据pytable[6][19]为“dong”;第7步,判断是否还有汉字串需要转换,有的话转到第1步;本例已无汉字需要转化,整个转化过程结束。通过以上步骤,通过计算汉字的gbk编码,迅速得到了“山洞”的拼音“shandong”。其时间复杂度为o(1)。第二步,根据配置表将类似的拼音转化为相同文字。根据业务的不同,需要配置不同的转换关系,故为了便于维护,这个转换将通过数据库查表实现。本例参考如图5的表格,里面存储拼音和汉字的对应关系。则很容易通过sql语句将拼音串“shandong”转化为汉字串“三墩”。原来这位到杭州来旅游的用户发出的语音指令实际是“三墩”而不是被误识别的“山洞”。综上,我们使用该发明算法,只要在数据库里配置极少的同音或者近似音的拼音,即可很好地将同音词或者近音词替换为业务场景需要的文字,而且其中单个汉字转化为拼音的时间复杂度仅仅为o(1),效率非常的高,并且仅占用不到30kb的存储空间。通过实施这种拼音近似音的定制转化,显著提高了嘈杂环境下命令词的识别率,同时也大大降低了代码和数据字典维护的工作量。可以理解的是,对本领域技术人员来说,对本发明的技术方案及发明构思加以等同替换或改变都应属于本发明所附的权利要求的保护范围。当前第1页12当前第1页12