使用Olami sdk實(shí)現(xiàn)一個(gè)語音查詢股票的iOS程序

前言
在目前的軟件應(yīng)用中,輸入方式還是以文字輸入方式為主,但是語音輸入的方式目前應(yīng)用的越來越廣泛必逆。在這里介紹一個(gè)使用 Olami SDK 編寫的一個(gè)使用語音輸入查詢股票的APP Olami SDK的介紹在下面這個(gè)網(wǎng)址 https://cn.olami.ai/wiki/?mp=sdk&content=sdk/ios/reference.html 在這個(gè)網(wǎng)址中詳細(xì)的介紹了Olami SDK包含了那些函數(shù)和定義的委托萍嬉。
APP介紹
下面通過一個(gè)APP來介紹一下如何使用Olami SDK 這個(gè)APP的下載地址是 https://github.com/lym-ay/OlamiStock

這里寫圖片描述
1. 去上面的網(wǎng)址下載Olami SDK.包括兩個(gè)文件,其中的一個(gè)是Olami的靜態(tài)函數(shù)庫腰池,一個(gè)是其頭文件 第一步是初始化Olami的語音識(shí)別對(duì)象尾组,并設(shè)置代理
olamiRecognizer= [[OlamiRecognizer alloc] init];olamiRecognizer.delegate = self;

2 . 調(diào)用setAuthorization函數(shù)進(jìn)行授權(quán)
[olamiRecognizer setAuthorization:@"d13bbcbef2a4460dbf19ced850eb5d83" api:@"asr" appSecret:@"3b08b349c0924a79869153bea334dd86" cusid:OLACUSID];

這個(gè)函數(shù)的參數(shù)的說明在OlamiRecognizer中有說明,也可以去在線API說明去查看 https://cn.olami.ai/wiki/?mp=sdk&content=sdk/ios/reference.html 有些參數(shù)必須去Olami的開發(fā)平臺(tái)上注冊(cè)才可以獲的示弓,網(wǎng)址是https://olami.ai讳侨,注冊(cè)登陸以后創(chuàng)建應(yīng)用才可以看到了

這里寫圖片描述
3 設(shè)置語系
[olamiRecognizer setLocalization:LANGUAGE_SIMPLIFIED_CHINESE];

在進(jìn)行錄音之前必須要先進(jìn)行設(shè)置,否則會(huì)得不到結(jié)果奏属。目前只支持簡(jiǎn)體中文(LANGUAGE_SIMPLIFIED_CHINESE)
4.開始錄音 調(diào)用 start()接口開始進(jìn)行錄音
[olamiRecognizer start];

5得到錄音的文字和語義跨跨,并對(duì)其進(jìn)行處理 通過調(diào)用stop()函數(shù)或者自動(dòng)停止,都會(huì)獲得錄音的文字和對(duì)其進(jìn)行的語義分析的結(jié)果 實(shí)現(xiàn)OlamiRecognizerDelegate onResult函數(shù)可以獲得結(jié)果囱皿,其結(jié)果以一個(gè)json字符串的形式回調(diào)過來勇婴,對(duì)這個(gè)字符串進(jìn)行解析,就可以獲得想要的股票的名稱
[ { "desc_obj": { "status": 0 }, "semantic": [ { "app": "stock", "input": "招商銀行的股價(jià)", "slots": [ { "name": "subject", "value": "價(jià)格" }, { "name": "name", "value": "招商銀行" }, { "name": "type", "value": "股票" } ], "modifier": [ "query" ], "customer": "58df685e84ae11f0bb7b4893" } ], "type": "stock" }]

這個(gè)是根據(jù)OSL語法描述語言定義的一套規(guī)則铆帽,返回的結(jié)果咆耿。這個(gè)結(jié)果的說明在 https://cn.olami.ai/wiki/?mp=api_nlu&content=api_nlu3.html 這個(gè)網(wǎng)址上有說明。
看到這里大家可能會(huì)有疑惑爹橱,APP怎么知道我說的是什么意思呢萨螺?這就涉及到了OSL語法描述語言,OLAMI 語法描述語言(OLAMI Syntax Language愧驱,簡(jiǎn)稱:OSL)是 OLAMI 平臺(tái)針對(duì)自然語言處理所發(fā)展出的獨(dú)特語法標(biāo)記語言慰技,自然語言語義互動(dòng)(Natural Language Interaction, 簡(jiǎn)稱:NLI)管理系統(tǒng)采用 OSL 取代復(fù)雜的編碼編程,使用簡(jiǎn)單组砚、容易學(xué)習(xí)而且靈活有彈性吻商。可以在這個(gè)網(wǎng)址查看詳細(xì)的說明 https://cn.olami.ai/wiki/?mp=osl&content=osl1.html 在編寫這個(gè)APP之前糟红,會(huì)按照OSL的要求編寫好一套語法艾帐,這套語法可以被Olami的服務(wù)器所理解乌叶,并進(jìn)行語義分析然后給出結(jié)果,就是上面的json字符串柒爸。在Olami官網(wǎng)上有寫好的一些領(lǐng)域的模塊准浴,可以直接使用。在 https://cn.olami.ai/wiki/?mp=nli&content=nli1.html 網(wǎng)址可以看到介紹如何使用以后的模塊捎稚。這個(gè)股票的grammar就是利用已有的模塊來編寫代碼的乐横。
6.創(chuàng)建應(yīng)用,導(dǎo)入grammar 首先去olami的主頁去登陸和注冊(cè)今野。登陸以后轉(zhuǎn)到這頁面

這里寫圖片描述
在這里可以看到創(chuàng)建的stock這個(gè)應(yīng)用葡公。由于目前只支持創(chuàng)建五個(gè)應(yīng)用,所以這里沒有創(chuàng)建新應(yīng)用這個(gè)接口条霜。如果沒有超過五個(gè)應(yīng)用催什,則可以新添加接口。如下圖所示
這里寫圖片描述
點(diǎn)擊“創(chuàng)建新應(yīng)用”蛔外,轉(zhuǎn)到下面這個(gè)頁面
這里寫圖片描述
填寫 應(yīng)用名稱蛆楞,應(yīng)用描述,應(yīng)用介紹以后夹厌,就可以創(chuàng)建了●汕模回到上一個(gè)頁面矛纹,就可以看到創(chuàng)建的應(yīng)用了。
點(diǎn)擊”進(jìn)入NLI系統(tǒng)”就可以進(jìn)入模塊頁面
這里寫圖片描述
在官網(wǎng)已經(jīng)內(nèi)置了很多領(lǐng)域的grammar.在模塊頁面大家點(diǎn)擊“導(dǎo)入”按鈕光稼,查看已有領(lǐng)域的模塊
這里寫圖片描述
選擇一個(gè)要使用的或南,例如我要導(dǎo)入”stock”這個(gè)模塊,先選擇它艾君,點(diǎn)擊“導(dǎo)入” 按鈕
這里寫圖片描述
然后點(diǎn)擊“stock”模塊采够,就可以進(jìn)入股票模塊,查看例句
這里寫圖片描述

這里寫圖片描述
但是這個(gè)時(shí)候還是不能使用冰垄,需要先進(jìn)行發(fā)布蹬癌。點(diǎn)擊頁面上方的”發(fā)布”按鈕,進(jìn)入發(fā)布頁面
這里寫圖片描述
點(diǎn)擊“發(fā)布按鈕”
這里寫圖片描述
發(fā)布成功虹茶,就可以使用stock模塊了
Olami還提供了測(cè)試grammar的功能逝薪,點(diǎn)擊“測(cè)試”按鈕,可以在頁面進(jìn)行測(cè)試grammar編寫的是否正確蝴罪,而不必要先開發(fā)APP
這里寫圖片描述
7 onResult函數(shù)說明 在整個(gè)程序中董济,最主要的一個(gè)函數(shù)就是onResult函數(shù),他是一個(gè)語音識(shí)別回調(diào)代理的實(shí)現(xiàn)函數(shù)要门,在這里獲得語音識(shí)別和語義識(shí)別的結(jié)果

  • (void)onResult:(NSData *)result { NSError *error; __weak typeof(self) weakSelf = self; NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:result options:NSJSONReadingMutableContainers error:&error]; if (error) { NSLog(@"error is %@",error.localizedDescription); }else{ NSString *jsonStr=[[NSString alloc]initWithData:result encoding:NSUTF8StringEncoding]; NSLog(@"jsonStr is %@",jsonStr); NSString *ok = [dic objectForKey:@"status"]; if ([ok isEqualToString:@"ok"]) { NSDictionary *dicData = [dic objectForKey:@"data"]; NSDictionary *asr = [dicData objectForKey:@"asr"]; if (asr) {//如果asr不為空虏肾,說明目前是語音輸入 [weakSelf processASR:asr]; } NSDictionary *nli = [[dicData objectForKey:@"nli"] objectAtIndex:0]; NSDictionary *desc = [nli objectForKey:@"desc_obj"]; int status = [[desc objectForKey:@"status"] intValue]; if (status != 0) {// 0 說明狀態(tài)正常,非零為狀態(tài)不正常 NSString *result = [desc objectForKey:@"result"]; dispatch_async(dispatch_get_main_queue(), ^{ }); }else{ NSDictionary *semantic = [[nli objectForKey:@"semantic"] objectAtIndex:0]; [weakSelf processSemantic:semantic]; } }else{ dispatch_async(dispatch_get_main_queue(), ^{ }); } }}

在這個(gè)函數(shù)中廓啊,調(diào)用了三個(gè)函數(shù),分別來處理josn格式中的三個(gè)比較重要的節(jié)點(diǎn)
//處理ASR節(jié)點(diǎn)- (void)processASR:(NSDictionary*)asrDic { NSString *result = [asrDic objectForKey:@"result"]; if (result.length == 0) { //如果結(jié)果為空封豪,則彈出警告框 }else{ }}

這個(gè)用來處理ASR節(jié)點(diǎn)崖瞭,獲得語音識(shí)別的結(jié)果
//處理Semantic節(jié)點(diǎn)- (void)processSemantic:(NSDictionary*)semanticDic { NSArray *slot = [semanticDic objectForKey:@"slots"]; [_slotValue removeAllObjects]; if (slot.count != 0) { for (NSDictionary *dic in slot) { NSString name = [dic objectForKey:@"name"]; if ([name isEqualToString:@"name"]) {//獲得當(dāng)前股票的名稱 NSString val = [dic objectForKey:@"value"]; [_slotValue addObject:val]; } } } NSArray *modify = [semanticDic objectForKey:@"modifier"]; if (modify.count != 0) { for (NSString *s in modify) { [self processModify:s]; } }}

這個(gè)用來處理Semantic節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)中包含了slot的值和modifier的值撑毛。OSL 語法描述語言中的 slot 可理解為語義中的變量书聚,用于傳遞、提取信息藻雌,是代碼處理的數(shù)據(jù)的來源雌续。這個(gè)程序來說,就是股票名稱的來源胯杭。關(guān)于slot的值可以參考 https://cn.olami.ai/wiki/?mp=osl&content=osl_slot.html驯杜,這里有詳細(xì)說明。
//處理modify- (void)processModify:(NSString*) str { if ([str isEqualToString:@"query"]) {//查詢股票 NSString *name = _slotValue[0]; if (name) { [self.delegate getStockName:name]; } }}

這個(gè)用來處理語音和語義的結(jié)果做个。這個(gè)函數(shù)主要是處理json字符串中的modifier節(jié)點(diǎn)鸽心。modifier 語法描述規(guī)則是 OSL 語法描述語言中,除了 slot 以外的另一種內(nèi)置的信息傳遞機(jī)制居暖,一般用來表示語義目的顽频,也可以理解為對(duì)于語義的一種注釋方式,以便讓應(yīng)用程序的開發(fā)者得知 grammar 所代表的相應(yīng)意圖太闺。詳細(xì)說明參考 https://cn.olami.ai/wiki/?mp=osl&content=osl_regex.html#11糯景,通過modifier,我們才能知道程序的意圖是什么省骂。
源代碼下載 https://github.com/lym-ay/OlamiStock
歡迎大家留言和討論蟀淮。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市钞澳,隨后出現(xiàn)的幾起案子怠惶,更是在濱河造成了極大的恐慌,老刑警劉巖轧粟,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件策治,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡逃延,警方通過查閱死者的電腦和手機(jī)览妖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揽祥,“玉大人讽膏,你說我怎么就攤上這事≈舴幔” “怎么了府树?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵俐末,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我奄侠,道長(zhǎng)卓箫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任垄潮,我火速辦了婚禮烹卒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弯洗。我一直安慰自己旅急,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布牡整。 她就那樣靜靜地躺著藐吮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逃贝。 梳的紋絲不亂的頭發(fā)上谣辞,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音沐扳,去河邊找鬼泥从。 笑死,一個(gè)胖子當(dāng)著我的面吹牛迫皱,可吹牛的內(nèi)容都是我干的歉闰。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼卓起,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了凹炸?” 一聲冷哼從身側(cè)響起戏阅,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎啤它,沒想到半個(gè)月后奕筐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡变骡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年离赫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塌碌。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渊胸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出台妆,到底是詐尸還是另有隱情翎猛,我是刑警寧澤胖翰,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站切厘,受9級(jí)特大地震影響萨咳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疫稿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一培他、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧遗座,春花似錦舀凛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碎绎,卻和暖如春螃壤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背筋帖。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工奸晴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人日麸。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓寄啼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親代箭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子墩划,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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