前言
在目前的軟件應(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
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)用才可以看到了
[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)到這頁面
點(diǎn)擊”進(jìn)入NLI系統(tǒng)”就可以進(jìn)入模塊頁面
Olami還提供了測(cè)試grammar的功能逝薪,點(diǎn)擊“測(cè)試”按鈕,可以在頁面進(jìn)行測(cè)試grammar編寫的是否正確蝴罪,而不必要先開發(fā)APP
- (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
歡迎大家留言和討論蟀淮。