用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)記錄
初始化部分參考源碼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ǔ)音在線聽(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