前言
前面我们刚刚介绍了语音识别的第一步《《实战案例分享》关于语音识别的功能实现分析(一)---结构化思维》,这一章我们接着上次的内容来看一下语义的解析。
语义解析
接上一章结束的内容,我们把说出的话通过分隔符实现了“|录入|14002001|数量15|价格4块6”的效果,这次我们看看分隔后我们怎么实现把他们的关键数据放到对应我们建的类里面。
首先我们定义了一个解析字符串的方法,其返回值就是我们上一章先定义的类
然后通过对字符“|”把整个字符串分为多个数组,然后对每个数组里面的关键词进行归类赋值。
上面这个解析的方法其实很简单,正常的网上也可以随便找到怎么分隔字符串,然后处理字符串,但是几个画红框的地方是我们的重点,就像刚才那句话里面
“|录入|14002001|数量15|价格4块6”
通过分隔后应该是
{"录入",”14002001“,”数量15“,”价格4块6“}
我们通过录入可以识别Recognition里的动作,但是像后面的数量15,价格4块6,我们是怎么获取到对应的数值呢?还有如果第二个关键词是条码为14002001怎么样只获取到条码呢?
从关键词里获取条码GetCodefromStr(String str)
这个相对来说比较简单,我们通过正则表达式,可以直接把里面为0-9的直接取出来即可
那获取数量和价格是不是也可以直接用这个了呢,结果是不行!!!
因为数量和价格可能会存在小数点的情况,经过测试,如果我们说了15.5这样带小数点的数字,通过上面的方法只能获取到15,这样不是我们要的结果,所以我们就另写了一个方法来实现。
从字条串里获取数量和金额GetnumfromStr(String str)
我们从Ascii码里可以知道,48-57分别代表的是0-9,然后小数点是46,所以我们用了一个循环遍历的方式判断值是不是这里面的,如果是就截取出来,通过这个方法,如果我们传进去的字符串为“数量15.3”,获取出来的值就是15.3.
以上两个方法可以帮助我们直接从字符串里获取到我们想要的数据了,但是我们看看上图中调用GetnumfromStr方法时,里面还有个方法
这个方法是干什么用的呢?
其实这个就是在我们语音输入的测试过程中发现,根据口语习惯和语音识别出的结果,经常会出现像“数量十”,“价格4块6”,“价格四块五”这样的字符串,所以为了解决这样的问题,我们首先需要把字符串里的中文改为数字的字符串。
如果仔细查了查,网上会有不少专门的函数写中文数字与阿拉伯数字的转换方法,本来也想省事直接用就好了,结果发现效果不理解,因为它本身要求中文的参数里面就是全是正常数字的,像我们整个字符串里面还有(数量,价格,块、或是前面是中文数字后面是阿拉伯数字像四块6)这些中文字,用这个是识别不出来的,并且在反复测试中,如果你说的是超过100的,语音识别都会很正常的识别出来,只有说十几,几十几,或是带价格几块的时候会显示的是中文数字,所以我还是自己写了一个方法用于处理这个。
实现逻辑
1.首先把字符串中0-9的中文字转换为阿拉伯数字(九十六 改为 9十6)
2.针对出现十这个中文字时要进行特殊处理
判断十前后都有数字,那就把十去掉(9十6 变为 96)
判断十前是数字,后没有数字的就改为0 (9十 变为 90)
判断十前没数字,十后有数字的就改为1 (十6 变为 16)
判断十前没数字,十后也没有数字的改为10 (十 变为 10)
3.最后再将中文数字里面的点和块改为. ( 10点5 10块5 变为 10.5)
我们看看这个方法
写的有点复杂是因为我们需要判断字符串长度,还有起始位,因为如果你获取长度的时候超限了,会直接报错。
上面有好几个Log.i的输出日志,就是根据传入进来的字符串我们最终转换的效果,我放几个根踪的图看一下
根据上面的方法我们把所有中文和阿拉伯数字的都统一先转为阿拉伯数字后,再进行数值的获取,并最终输出到我们的RecoginText的类里后,就可以进行后续的数据处理了。
-END-