溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

語音識別,語義理解一站式解決之二(android,olami)

發布時間:2020-07-14 02:06:03 來源:網絡 閱讀:1013 作者:ls0609 欄目:移動開發

轉載請注明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實現的效果圖

 語音識別,語義理解一站式解決之二(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<k; i++)                           {                               JSONObject obj = jArraySlots.getJSONObject(i);                               String name = obj.optString("name");                               if("pay_type".equals(name))                                   pay_type = obj.optString("value");                               else if("pay_number".equals(name))                               {//找出記錄的具體金額                                   pay_number = obj.getJSONObject("num_detail").                                                 getString("recommend_value");                               }                               else if("day".equals(name))                               {//找出某日發生消費的金額                                   day = obj.getJSONObject("num_detail").                                                 getString("recommend_value");                               }                           }                        }                        String date = null;                        Calendar localCalendar = Calendar.getInstance();                        int i_year = localCalendar.get(Calendar.YEAR);                        int i_month = localCalendar.get(Calendar.MONTH)+1;                        int i_day = localCalendar.get(Calendar.DAY_OF_MONTH);                         if(day == null)                         {                             date = i_year + "-" + i_month + "-" + i_day;                         }                         else                         {                             date = i_year + "-" + i_month + "-" + day;                         }                         consumeClass trade = new consumeClass(0,                                             Float.parseFloat("-"+pay_number),                                             date, "123", pay_type,  MainActivity.this);                                                                   trade.trade_add();                                             //添加到消費列表中                    }                    else if((jArrayModifier != null) && ("query_today".equals(modifier)))                    {                          QueryByTodayActivity.refreshListView(                                                 QueryByTodayActivity.QUERY_BY_DAY);                       //查詢當天的消費情況,并更新列表                                              }                    else if((jArrayModifier != null) && ("query_month".equals(modifier)))                    {                          QueryByTodayActivity.refreshListView(                                                    QueryByTodayActivity.QUERY_BY_MONTH);                         //查詢當月的消費情況,并更新列表                                                                          }else if((jArrayModifier != null) && ("delete_today".equals(modifier)))                    {//找出要刪除的消費記錄的索引,刪除并更新界面                        String index = null;                        if(jArraySlots != null)                        {                                                   JSONObject obj = jArraySlots.getJSONObject(0);                                                       index = obj.getJSONObject("num_detail").                                          getString("recommend_value");                                                                          }                        if(index != null && !"".equals(index))                            QueryByTodayActivity. deleteTodayDataByIndex(                                                      Integer.parseInt(index));                                                                    }                }            }        }        catch(Exception e)        {            e.printStackTrace();        }                      }

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


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女