語音識別,語義理解一站式解決之二(android,olami)
前言
國內語音識別技術已有多家,而olami不僅在語音識別上準確率較高,更重要的是在語義理解上十分強大,本文用olami sdk做了一個記賬demo(記賬部分程式碼參考開原始碼),這個demo可以語音新增不同消費記錄,查詢當天,當月消費情況,刪除消費列表中的記錄。讓我們一起來感受下olami如何實現強大的語義理解。
1.demo支援的說法
demo中實現的說法主要有如下幾種(同類說法可以很多,沒有全部列舉):
今天餐飲開銷一百元
今日交通出行五十元
本月15號日常購物一百元
這個月水電煤氣兩百元
查詢今天的賬單
檢視今日的消費情況
今天的賬單
今日消費
查詢這個月的消費情況
檢視本月消費
本月的賬單
刪除第一條
刪除第一個記錄
刪除第五條消費記錄
2. demo實現的效果圖
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.原始碼下載連結
6.相關連結
相關推薦
語音識別,語義理解一站式解決之二(android,olami)
前言 國內語音識別技術已有多家,而olami不僅在語音識別上準確率較高,更重要的是在語義理解上十分強大,本文用olami sdk做了一個記賬demo(記賬部分程式碼參考開原始碼),這個demo可以語音新增不同消費記錄,查詢當天,當月消費情況,刪除消費列
語音識別,語義理解一站式解決之智慧照相機(人臉識別,olami)
olami sdk實現了把錄音或者文字轉化為使用者可以理解的json字串從而實現語義理解,使用者可以定義自己的 語義,通過這種方式可以實現使用者需要的語義理解。前面寫了兩篇語音識別,語義理解的博文,分別是語音 線上聽書和語音記帳軟體,本篇是語音智慧照相機
語音識別,語義理解一站式解決(android平臺&olami sdk)
olami sdk實現了把錄音或者文字轉化為使用者可以理解的json字串從而實現語義理解,使用者可以定義自己的語義,是不是很強大?本文講述怎麼自定義語義,以及如何解析自定義語義。 本文使用olami sdk做了一個線上聽書的demo,使用者只需類似“我想
用Kotlin開發android平臺語音識別,語義理解應用(olamisdk)
本文使用Kotlin開發android平臺的一個語音識別方面的應用,用的是尤拉密開放平臺olamisdk。 1.Kotlin簡介 Kotlin是由JetBrains建立的基於JVM的程式語言,IntelliJ正是JetBrains的傑作,而android
unity 對接訊飛window平臺語音識別,語音合成記錄
最近記性越來越差,必須得把踩過的坑寫下來,防止重複踩坑的出現。 主要參考了部落格:https://blog.csdn.net/qq_39993352/article/details/80545422和語音識別的案例原始碼:https://github.com/3wz/IFlySDKForUn
語音識別:深入理解CTC Loss原理
最近看了百度的Deep Speech,看到語音識別使用的損失函式是CTC loss。便整理了一下有關於CTC loss的一些定義和推導。由於個人水平有限,如果文章有錯誤,還懇請各位指出,萬分感謝~ 附上我的github主頁,歡迎各位的follow~~~
深入理解Spring AOP之二代理對象生成
gets code 網上 none work class als post 產生 深入理解Spring AOP之二代理對象生成 spring代理對象 上一篇博客中講到了Spring的一些基本概念和初步講了實現方
用友nc65 uap開發中系統出現卡,慢等問題解決思路二(提交審批等按鈕卡慢)
4.索引失效的情況: ① Not Null/Null 如果某列建立索引,當進行Select * from emp where depto is not null/is null。 則會是索引失效。 ② 索引列上不要使用函式,SELECT Col FROM tbl WHERE substr(name ,1
深入理解SELinux SEAndroid之二
今天公司年會,哥高興,所以釋出第二部。SELinux/SEAndroid一共分三部分。第一和第二部分是SELinux的基礎知識,第三部分是SEAndroid的工作原始碼分析。 深入理解SE
深入理解nvme協議之二:nvme 協議重點數據結構之間的關系
排列 vpd hal tro status phy blog 自己 理解 Physical Region Range(PRP entry) 描述一段物理空間的其實地址和長度,最重要的字段包括: 起始地址(page base address) 偏移大小(offset) 具
語音識別之——mfcc什麼是漢明窗,為什麼加漢明窗
為什麼要加漢明窗?什麼叫加窗? 在訊號處理中,可以說加窗處理是一個必經的過程,因為我們的計算機只能處理有限長度的訊號,因此原始訊號X(t)要以T(取樣時間)截斷,即有限化,成為XT(t)後再進一步處理,這個過程式就是加窗處理,但什麼時候用什麼窗呢?這時我們就要對所需用到
語音識別之初體驗
實時 popu 背景 pcc 詞匯 原則 分類 work 通過 一、概述 作為最自然的人機交互方式 --語音,正在改變人們的生活,豐富多媒體技術的應用。語音識別技術是語音信號處理的一個重要分支,也是近年來非常火的一個研究領域。隨著科技的飛速發展,語音識別不僅在桌面PC和
4G LTE 網只能提供數據服務,不能承載語音通話,該怎麽理解?
通話 組網 相關 ads 殺手 是不是 曾經 huawei lte-a 轉:http://www.qbiao.com/16776.html 這個問題要從移動核心網的角度來理解。我們平時說的WCDMA、TD-SCDMA、TD-LTE其實通常指空口技術,即從手機到基站的通信技術
語音識別完成詩句的查詢功能,iOS AVSpeechSynthesis語音輸出結果的詩歌APP
water 兩個 min 介紹 ech fin com esp log 前言 當前的APP的查詢都是使用手動輸入,不僅效率低,而且查詢的語句的限制比較大,不能夠方便的擴展。 如果能方便的擴展查詢語句,那麽APP的使用就會有很大的靈活性。可以設計各種問句和語句,可以方便的和用
80端口被屏蔽解決方法,80端口穿透之NAT端口映射技術
sdn 映射 font statistic -c alt sso avi text 介紹一種NAT端口映射技術應用,達到80端口穿透目的,解決80端口被屏蔽的問題,也是80端口被屏蔽解決方法中經常用到的。 80端口穿透類似80端口轉發,因為80端口被屏蔽,在數據層面來說是
重磅!MaxCompute助力阿裏開源自研語音識別模型DFSMN,準確率高達96.04%
href p s 開始 phone 兩層 下一個 latency 16bit product 摘要: 阿裏開源語音識別模型DFSMN 在近期舉行的雲棲大會武漢峰會上,裝有DFSMN語音識別模型的“AI收銀員”在與真人店員的PK中,在嘈雜環境下準確識別了用戶的語音點單,在短短
使用FFmpeg進行視頻抽取音頻,之後進行語音識別轉為文字
buffer and @param size eve turn stand try you 1、首先需要下載FFmpeg; 2、Gradle依賴 def void forceVersion(details, group, version) { if (detai
當語音識別搭配AI之後,我的語音助手更懂我的心了
一定的 平均值 數據信息 均值 音頻 問題 做的 在屏幕上 要求 歡迎大家前往騰訊雲+社區,獲取更多騰訊海量技術實踐幹貨哦~ 本文由騰訊雲AI中心發表於雲+社區專欄 我今天演講主要分四個部分,第一個是分享語音識別概述,然後是深度神經網絡的基礎;接下來就是深度學習在語音
speech_recognition實現錄音ffmpeg實現音訊檔案轉換,並用百度語音的sdk實現語音識別
專案說明: 在windows平臺下,使用speech_recognition記錄音訊,並轉換為16k的wav, 之後利用ffmpeg將wav轉化為pcm檔案,上傳到百度語音端,返回語音資訊,並利用pyttsx3添加了簡單的互動功能。 需求模組: speech_recognit
年少痴狂,懷戀曾經的創業歲月,語音識別的應用遠遠未到高潮,本人的軟體原始碼開源,需要的留下Email,我給大家發
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!