语音识别,语义理解一站式解决之二(android,olami)
转载请注明CSDN地址:http://blog.csdn.net/ls0609/article/details/72765789
创新互联是一家集网站建设,徐闻企业网站建设,徐闻品牌网站建设,网站定制,徐闻网站建设报价,网络营销,网络优化,徐闻网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
语音在线听书demo:http://blog.csdn.net/ls0609/article/details/71519203
前言
国内语音识别技术已有多家,而olami不仅在语音识别上准确率较高,更重要的是在语义理解上十分强大,本文用olami sdk做了一个记账demo(记账部分代码参考开源代码),这个demo可以语音添加不同消费记录,查询当天,当月消费情况,删除消费列表中的记录。让我们一起来感受下olami如何实现强大的语义理解。
1.demo支持的说法
demo中实现的说法主要有如下几种(同类说法可以很多,没有全部列举):
今天餐饮开销一百元
今日交通出行五十元
本月15号日常购物一百元
这个月水电煤气两百元
查询今天的账单
查看今日的消费情况
今天的账单
今日消费
查询这个月的消费情况
查看本月消费
本月的账单
删除第一条
删除第一个记录
删除第五条消费记录
2. demo实现的效果图
3.olami的初始化和回调用法
初始化部分参考源码MainActivity.Java中init()函数
publicvoidinit() { 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 }
注册一个回调,用于各种回调,可以更新界面和处理服务器返回数据。
privateclass OlamiVoiceRecognizerListener implements IOlamiVoiceRecognizerListener{ @Override publicvoidonError(int errCode) {//出错回调 mHandler.sendMessage(mHandler.obtainMessage( MessageConst.CLIENT_ACTION_ON_ERROR,errCode,0)); } @Override publicvoidonEndOfSpeech() {//录音结束回调 mHandler.sendEmptyMessage(MessageConst.CLIENT_ACTION_STOP_RECORED); } @Override publicvoidonBeginningOfSpeech() {//录音开始回调 mHandler.sendEmptyMessage(MessageConst.CLIENT_ACTION_START_RECORED); } @Override publicvoidonResult(String result,int type) {//结果返回回调 mHandler.sendMessage(mHandler.obtainMessage( MessageConst.SERVER_ACTION_RETURN_RESULT, type,0, result)); } @Override publicvoidonCancel() {//取消录音回调 mHandler.sendEmptyMessage(MessageConst.CLIENT_ACTION_CANCEL_RECORED); } @Override publicvoidonUpdateVolume(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" } ]
来看一下代码是如何解析的:
privatevoid 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; Stringtype=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 语音记账demo下载 语音在线听书博客: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.html5.×××链接
6.相关链接
新闻名称:语音识别,语义理解一站式解决之二(android,olami)
标题路径:http://myzitong.com/article/pjosss.html