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

用olami語(yǔ)音識(shí)別語(yǔ)義理解做記賬demo

轉(zhuǎn)載請(qǐng)注明CSDN地址:http://blog.csdn.net/ls0609/article/details/72765789

語(yǔ)音在線聽(tīng)書(shū)demo:http://blog.csdn.net/ls0609/article/details/71519203

前言

國(guó)內(nèi)語(yǔ)音識(shí)別技術(shù)已有多家发框,而olami不僅在語(yǔ)音識(shí)別上準(zhǔn)確率較高,更重要的是在語(yǔ)義理解上十分強(qiáng)大煤墙,本文用olami sdk做了一個(gè)記賬demo(記賬部分代碼參考開(kāi)源代碼)梅惯,這個(gè)demo可以語(yǔ)音添加不同消費(fèi)記錄,查詢當(dāng)天仿野,當(dāng)月消費(fèi)情況铣减,刪除消費(fèi)列表中的記錄。讓我們一起來(lái)感受下olami如何實(shí)現(xiàn)強(qiáng)大的語(yǔ)義理解脚作。

1.demo支持的說(shuō)法

demo中實(shí)現(xiàn)的說(shuō)法主要有如下幾種(同類說(shuō)法可以很多葫哗,沒(méi)有全部列舉):

今天餐飲開(kāi)銷一百元

今日交通出行五十元

本月15號(hào)日常購(gòu)物一百元

這個(gè)月水電煤氣兩百元

查詢今天的賬單

查看今日的消費(fèi)情況

今天的賬單

今日消費(fèi)

查詢這個(gè)月的消費(fèi)情況

查看本月消費(fèi)

本月的賬單

刪除第一條

刪除第一個(gè)記錄

刪除第五條消費(fèi)記錄

2. demo實(shí)現(xiàn)的效果圖





3.olami的初始化和回調(diào)用法

初始化部分參考源碼MainActivity.Java中init()函數(shù)

publicvoidinit()

{

initHandler();

mOlamiVoiceRecognizer =newOlamiVoiceRecognizer(MainActivity.this);

TelephonyManagertelephonyManager=(TelephonyManager)this.getSystemService

(this.getBaseContext().TELEPHONY_SERVICE);

Stringimei=telephonyManager.getDeviceId();

mOlamiVoiceRecognizer.init(imei);//set null if

you do not want to notify olami server.

mOlamiVoiceRecognizer.setListener(mOlamiVoiceRecognizerListener);//設(shè)置識(shí)別結(jié)果回listener

mOlamiVoiceRecognizer.setLocalization

(OlamiVoiceRecognizer.LANGUAGE_SIMPLIFIED_CHINESE);//設(shè)置支持的語(yǔ)音類型,優(yōu)先選擇中文簡(jiǎn)體

mOlamiVoiceRecognizer.setAuthorization(

"573031596fd746fca478e5cccf6ca9e2","asr","d5307ed38df64ab6a08e467c00c81d37","nli");

//注冊(cè)Appkey鳖枕,在olami官網(wǎng)注冊(cè)應(yīng)用后生成的appkey

//注冊(cè)api魄梯,請(qǐng)直接填寫“asr”桨螺,標(biāo)識(shí)語(yǔ)音識(shí)別類型

//注冊(cè)secret宾符,在olami官網(wǎng)注冊(cè)應(yīng)用后生成的secret

//注冊(cè)seq,請(qǐng)?zhí)顚憽皀li”

mOlamiVoiceRecognizer.setVADTailTimeout(2000);//錄音時(shí)尾音結(jié)束時(shí)間灭翔,建議填//2000ms

mOlamiVoiceRecognizer.setLatitudeAndLongitude(31.155364678184498,121.34882432933009);

//設(shè)置經(jīng)緯度信息魏烫,不愿上傳位置信息,可以填0

}

注冊(cè)一個(gè)回調(diào)肝箱,用于各種回調(diào)哄褒,可以更新界面和處理服務(wù)器返回?cái)?shù)據(jù)。

privateclassOlamiVoiceRecognizerListenerimplementsIOlamiVoiceRecognizerListener{

@Override

publicvoidonError(interrCode) {//出錯(cuò)回調(diào)

mHandler.sendMessage(mHandler.obtainMessage(

MessageConst.CLIENT_ACTION_ON_ERROR,errCode,0));

}

@Override

publicvoidonEndOfSpeech() {//錄音結(jié)束回調(diào)

mHandler.sendEmptyMessage(MessageConst.CLIENT_ACTION_STOP_RECORED);

}

@Override

publicvoidonBeginningOfSpeech() {//錄音開(kāi)始回調(diào)

mHandler.sendEmptyMessage(MessageConst.CLIENT_ACTION_START_RECORED);

}

@Override

publicvoidonResult(String result,inttype) {//結(jié)果返回回調(diào)

mHandler.sendMessage(mHandler.obtainMessage(

MessageConst.SERVER_ACTION_RETURN_RESULT, type,0, result));

}

@Override

publicvoidonCancel() {//取消錄音回調(diào)

mHandler.sendEmptyMessage(MessageConst.CLIENT_ACTION_CANCEL_RECORED);

}

@Override

publicvoidonUpdateVolume(intvolume) {//實(shí)時(shí)返回音量回調(diào)

mHandler.sendMessage(mHandler.obtainMessage(

MessageConst.CLIENT_ACTION_UPDATA_VOLUME, volume,0,null));

}

}

4.服務(wù)器返回結(jié)果及解析

本月15號(hào)日常購(gòu)物200元煌张,服務(wù)器返回?cái)?shù)據(jù)如下:

[

{

"desc_obj": {

"result":"正在為您添加",

"status":0

},

"semantic": [

{

"app":"account",

"input":"本月15號(hào)日常購(gòu)物200元",

"slots": [

{

"num_detail": {

"recommend_value":"200",

"type":"number"

},

"name":"pay_number",

"value":"200"

},

{

"name":"pay_type",

"value":"日常購(gòu)物"

},

{

"num_detail": {

"recommend_value":"15",

"type":"number"

},

"name":"day",

"value":"15"

}

],

"modifier": [

"pay"

],

"customer":"58df512384ae11f0bb7b487e"

}

],

"type":"account"

}

]

刪除第一個(gè)記錄呐赡,服務(wù)器返回?cái)?shù)據(jù)如下:

[

{

"desc_obj": {

"result":"正在為您刪除",

"status":0

},

"semantic": [

{

"app":"account",

"input":"刪除第一個(gè)記錄",

"slots": [

{

"num_detail": {

"recommend_value":"1",

"type":"number"

},

"name":"index",

"value":"一"

}

],

"modifier": [

"delete_today"

],

"customer":"58df512384ae11f0bb7b487e"

}

],

"type":"account"

}

]

來(lái)看一下代碼是如何解析的:

privatevoidprocessServerMessage(Stringmessage)

{

try{

Stringinput=null;

JSONObject jsonObject=newJSONObject(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;

Stringpay_number=null;

Stringpay_type=null;

Stringday=null;

if(jObj!=null) {

type=jObj.optString("type");

if("account".equals(type))//應(yīng)用的名稱是account,代表記賬應(yīng)用

{

jObjSemantic=jArraySemantic.optJSONObject(0);

input=jObjSemantic.optString("input");

jArraySlots=jObjSemantic.optJSONArray("slots");

jArrayModifier=jObjSemantic.optJSONArray("modifier");

Stringmodifier=(String)jArrayModifier.opt(0);

if((jArrayModifier!=null)&&("pay".equals(modifier)))

{//modifier為pay,代表行為是記賬

if(jArraySlots!=null)

{

for(int i=0,k=jArraySlots.length(); i

{

JSONObject obj=jArraySlots.getJSONObject(i);

Stringname=obj.optString("name");

if("pay_type".equals(name))

pay_type=obj.optString("value");

elseif("pay_number".equals(name))

{//找出記錄的具體金額

pay_number=obj.getJSONObject("num_detail").

getString("recommend_value");

}

elseif("day".equals(name))

{//找出某日發(fā)生消費(fèi)的金額

day=obj.getJSONObject("num_detail").

getString("recommend_value");

}

}

}

Stringdate=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=newconsumeClass(0,

Float.parseFloat("-"+pay_number),

date,"123", pay_type,MainActivity.this);

trade.trade_add();

//添加到消費(fèi)列表中

}

elseif((jArrayModifier!=null)&&("query_today".equals(modifier)))

{

QueryByTodayActivity.refreshListView(

QueryByTodayActivity.QUERY_BY_DAY);

//查詢當(dāng)天的消費(fèi)情況骏融,并更新列表

}

elseif((jArrayModifier!=null)&&("query_month".equals(modifier)))

{

QueryByTodayActivity.refreshListView(

QueryByTodayActivity.QUERY_BY_MONTH);

//查詢當(dāng)月的消費(fèi)情況链嘀,并更新列表

}elseif((jArrayModifier!=null)&&("delete_today".equals(modifier)))

{//找出要?jiǎng)h除的消費(fèi)記錄的索引萌狂,刪除并更新界面

Stringindex=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.源碼下載鏈接

語(yǔ)音記賬demo下載

6.相關(guān)鏈接

語(yǔ)音在線聽(tīng)書(shū)博客:http://blog.csdn.net/ls0609/article/details/71519203

olami開(kāi)放平臺(tái)語(yǔ)法編寫簡(jiǎn)介:http://blog.csdn.net/ls0609/article/details/71624340

olami開(kāi)放平臺(tái)語(yǔ)法官方介紹:https://cn.olami.ai/wiki/?mp=nli&content=nli2.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市怀泊,隨后出現(xiàn)的幾起案子茫藏,更是在濱河造成了極大的恐慌,老刑警劉巖霹琼,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件务傲,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡枣申,警方通過(guò)查閱死者的電腦和手機(jī)售葡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)糯而,“玉大人天通,你說(shuō)我怎么就攤上這事∠ㄍ眨” “怎么了像寒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)瓜贾。 經(jīng)常有香客問(wèn)我诺祸,道長(zhǎng),這世上最難降的妖魔是什么祭芦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任筷笨,我火速辦了婚禮,結(jié)果婚禮上龟劲,老公的妹妹穿的比我還像新娘胃夏。我一直安慰自己,他們只是感情好昌跌,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布仰禀。 她就那樣靜靜地躺著,像睡著了一般蚕愤。 火紅的嫁衣襯著肌膚如雪答恶。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,246評(píng)論 1 308
  • 那天萍诱,我揣著相機(jī)與錄音悬嗓,去河邊找鬼。 笑死裕坊,一個(gè)胖子當(dāng)著我的面吹牛包竹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼周瞎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼悟狱!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起堰氓,我...
    開(kāi)封第一講書(shū)人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤挤渐,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后双絮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體浴麻,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年囤攀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了软免。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡焚挠,死狀恐怖膏萧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蝌衔,我是刑警寧澤榛泛,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站噩斟,受9級(jí)特大地震影響曹锨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剃允,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一沛简、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧斥废,春花似錦椒楣、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至荚板,卻和暖如春凤壁,著一層夾襖步出監(jiān)牢的瞬間吩屹,已是汗流浹背跪另。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留煤搜,地道東北人免绿。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像擦盾,于是被迫代替她去往敵國(guó)和親嘲驾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子淌哟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容