语音识别,语义理解一站式解决之二(android,olami)-创新互联

转载请注明CSDN地址:http://blog.csdn.net/ls0609/article/details/72765789

创新互联建站始终坚持【策划先行,效果至上】的经营理念,通过多达10多年累计超上千家客户的网站建设总结了一套系统有效的全网整合营销推广解决方案,现已广泛运用于各行各业的客户,其中包括:成都水电改造等企业,备受客户称扬。

语音在线听书demo:http://blog.csdn.net/ls0609/article/details/71519203

前言

国内语音识别技术已有多家,而olami不仅在语音识别上准确率较高,更重要的是在语义理解上十分强大,本文用olami sdk做了一个记账demo(记账部分代码参考开源代码),这个demo可以语音添加不同消费记录,查询当天,当月消费情况,删除消费列表中的记录。让我们一起来感受下olami如何实现强大的语义理解。

1.demo支持的说法

demo中实现的说法主要有如下几种(同类说法可以很多,没有全部列举):

今天餐饮开销一百元
今日交通出行五十元
本月15号日常购物一百元
这个月水电煤气两百元
查询今天的账单
查看今日的消费情况
今天的账单
今日消费
查询这个月的消费情况
查看本月消费
本月的账单
删除第一条
删除第一个记录
删除第五条消费记录

2. demo实现的效果图

 语音识别,语义理解一站式解决之二(android,olami)

 语音识别,语义理解一站式解决之二(android,olami)

3.olami的初始化和回调用法

初始化部分参考源码MainActivity.Java中init()函数

public void init()   {     initHandler();     mOlamiVoiceRecognizer = new OlamiVoiceRecognizer(MainActivity.this);     TelephonyManager telephonyManager=(TelephonyManager)this.getSystemService                      (this.getBaseContext().TELEPHONY_SERVICE);     String imei=telephonyManager.getDeviceId();     mOlamiVoiceRecognizer.init(imei);//set null if you do not want to notify olami server.     mOlamiVoiceRecognizer.setListener(mOlamiVoiceRecognizerListener);//设置识别结果回listener     mOlamiVoiceRecognizer.setLocalization     (OlamiVoiceRecognizer.LANGUAGE_SIMPLIFIED_CHINESE);//设置支持的语音类型,优先选择中文简体     mOlamiVoiceRecognizer.setAuthorization(     "573031596fd746fca478e5cccf6ca9e2","asr","d5307ed38df64ab6a08e467c00c81d37","nli");     //注册Appkey,在olami官网注册应用后生成的appkey     //注册api,请直接填写“asr”,标识语音识别类型     //注册secret,在olami官网注册应用后生成的secret     //注册seq ,请填写“nli”         mOlamiVoiceRecognizer.setVADTailTimeout(2000);//录音时尾音结束时间,建议填//2000ms     mOlamiVoiceRecognizer.setLatitudeAndLongitude(31.155364678184498,121.34882432933009);     //设置经纬度信息,不愿上传位置信息,可以填0   }

注册一个回调,用于各种回调,可以更新界面和处理服务器返回数据。

private class OlamiVoiceRecognizerListener implements IOlamiVoiceRecognizerListener{     @Override     public void onError(int errCode) {//出错回调       mHandler.sendMessage(mHandler.obtainMessage(                 MessageConst.CLIENT_ACTION_ON_ERROR,errCode,0));     }     @Override     public void onEndOfSpeech() {//录音结束回调       mHandler.sendEmptyMessage(MessageConst.CLIENT_ACTION_STOP_RECORED);          }     @Override     public void onBeginningOfSpeech() {//录音开始回调       mHandler.sendEmptyMessage(MessageConst.CLIENT_ACTION_START_RECORED);            }     @Override     public void onResult(String result, int type) {//结果返回回调       mHandler.sendMessage(mHandler.obtainMessage(              MessageConst.SERVER_ACTION_RETURN_RESULT, type, 0, result));     }     @Override     public void onCancel() {//取消录音回调       mHandler.sendEmptyMessage(MessageConst.CLIENT_ACTION_CANCEL_RECORED);     }     @Override     public void onUpdateVolume(int volume) {//实时返回音量回调       mHandler.sendMessage(mHandler.obtainMessage(              MessageConst.CLIENT_ACTION_UPDATA_VOLUME, volume, 0, null));     }   }

4.服务器返回结果及解析

本月15号日常购物200元,服务器返回数据如下:

[  {   "desc_obj": {    "result": "正在为您添加",    "status": 0   },   "semantic": [    {     "app": "account",     "input": "本月15号日常购物200元",     "slots": [      {       "num_detail": {        "recommend_value": "200",        "type": "number"       },       "name": "pay_number",       "value": "200"      },      {       "name": "pay_type",       "value": "日常购物"      },      {       "num_detail": {        "recommend_value": "15",        "type": "number"       },       "name": "day",       "value": "15"      }     ],     "modifier": [      "pay"     ],     "customer": "58df512384ae11f0bb7b487e"    }   ],   "type": "account"  } ]

删除第一个记录, 服务器返回数据如下:

[  {   "desc_obj": {    "result": "正在为您删除",    "status": 0   },   "semantic": [    {     "app": "account",     "input": "删除第一个记录",     "slots": [      {       "num_detail": {        "recommend_value": "1",        "type": "number"       },       "name": "index",       "value": "一"      }     ],     "modifier": [      "delete_today"     ],     "customer": "58df512384ae11f0bb7b487e"    }   ],   "type": "account"  } ]

来看一下代码是如何解析的:

private void processServerMessage(String message) {     try{       String input = null;       JSONObject jsonObject = new JSONObject(message);       JSONArray jArrayNli = jsonObject.optJSONObject("data").optJSONArray("nli");       JSONObject jObj = jArrayNli.optJSONObject(0);       JSONArray jArraySemantic = null;       if(message.contains("semantic"))       {        jArraySemantic = jObj.getJSONArray("semantic");        input = jArraySemantic.optJSONObject(0).optString("input");       }       else{         input = jsonObject.optJSONObject("data").                   optJSONObject("asr").optString("result");       }       JSONObject jObjSemantic;       JSONArray jArraySlots;       JSONArray jArrayModifier;       String type = null;       String pay_number = null;       String pay_type = null;       String day = null;       if(jObj != null) {         type = jObj.optString("type");         if("account".equals(type))//应用的名称是account,代表记账应用         {           jObjSemantic = jArraySemantic.optJSONObject(0);           input = jObjSemantic.optString("input");           jArraySlots = jObjSemantic.optJSONArray("slots");           jArrayModifier = jObjSemantic.optJSONArray("modifier");           String modifier = (String)jArrayModifier.opt(0);           if((jArrayModifier != null) && ("pay".equals(modifier)))           {//modifier为pay,代表行为是记账             if(jArraySlots != null)             {              for(int i=0,k=jArraySlots.length(); i

5.×××链接

语音记账demo下载

6.相关链接

语音在线听书博客:http://blog.csdn.net/ls0609/article/details/71519203

olami开放平台语法编写简介:http://blog.csdn.net/ls0609/article/details/71624340

olami开放平台语法官方介绍:https://cn.olami.ai/wiki/?mp=nli&content=nli2.html

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享标题:语音识别,语义理解一站式解决之二(android,olami)-创新互联
文章网址:http://myzitong.com/article/eeghe.html