使用Olami|使用Olami sdk实现一个语音查询股票的iOS程序
前言
在目前的软件应用中,输入方式还是以文字输入方式为主,但是语音输入的方式目前应用的越来越广泛。在这里介绍一个使用 Olami SDK 编写的一个使用语音输入查询股票的APP Olami SDK的介绍在下面这个网址 https://cn.olami.ai/wiki/?mp=sdk&content=sdk/ios/reference.html 在这个网址中详细的介绍了Olami SDK包含了那些函数和定义的委托。
APP介绍
下面通过一个APP来介绍一下如何使用Olami SDK 这个APP的下载地址是 https://github.com/lym-ay/OlamiStock
文章图片
这里写图片描述 1. 去上面的网址下载Olami SDK.包括两个文件,其中的一个是Olami的静态函数库,一个是其头文件 第一步是初始化Olami的语音识别对象,并设置代理
olamiRecognizer= [[OlamiRecognizer alloc] init];
olamiRecognizer.delegate = self;
2 . 调用setAuthorization函数进行授权
[olamiRecognizer setAuthorization:@"d13bbcbef2a4460dbf19ced850eb5d83" api:@"asr" appSecret:@"3b08b349c0924a79869153bea334dd86" cusid:OLACUSID];
这个函数的参数的说明在OlamiRecognizer中有说明,也可以去在线API说明去查看 https://cn.olami.ai/wiki/?mp=sdk&content=sdk/ios/reference.html 有些参数必须去Olami的开发平台上注册才可以获的,网址是https://olami.ai,注册登陆以后创建应用才可以看到了
文章图片
这里写图片描述 3 设置语系
[olamiRecognizer setLocalization:LANGUAGE_SIMPLIFIED_CHINESE];
在进行录音之前必须要先进行设置,否则会得不到结果。目前只支持简体中文(LANGUAGE_SIMPLIFIED_CHINESE)
4.开始录音 调用 start()接口开始进行录音
[olamiRecognizer start];
5得到录音的文字和语义,并对其进行处理 通过调用stop()函数或者自动停止,都会获得录音的文字和对其进行的语义分析的结果 实现OlamiRecognizerDelegate onResult函数可以获得结果,其结果以一个json字符串的形式回调过来,对这个字符串进行解析,就可以获得想要的股票的名称
[ { "desc_obj": { "status": 0 }, "semantic": [ { "app": "stock", "input": "招商银行的股价", "slots": [ { "name": "subject", "value": "价格" }, { "name": "name", "value": "招商银行" }, { "name": "type", "value": "股票" } ], "modifier": [ "query" ], "customer": "58df685e84ae11f0bb7b4893" } ], "type": "stock" }]
这个是根据OSL语法描述语言定义的一套规则,返回的结果。这个结果的说明在 https://cn.olami.ai/wiki/?mp=api_nlu&content=api_nlu3.html 这个网址上有说明。
看到这里大家可能会有疑惑,APP怎么知道我说的是什么意思呢?这就涉及到了OSL语法描述语言,OLAMI 语法描述语言(OLAMI Syntax Language,简称:OSL)是 OLAMI 平台针对自然语言处理所发展出的独特语法标记语言,自然语言语义互动(Natural Language Interaction, 简称:NLI)管理系统采用 OSL 取代复杂的编码编程,使用简单、容易学习而且灵活有弹性。可以在这个网址查看详细的说明 https://cn.olami.ai/wiki/?mp=osl&content=osl1.html 在编写这个APP之前,会按照OSL的要求编写好一套语法,这套语法可以被Olami的服务器所理解,并进行语义分析然后给出结果,就是上面的json字符串。在Olami官网上有写好的一些领域的模块,可以直接使用。在 https://cn.olami.ai/wiki/?mp=nli&content=nli1.html 网址可以看到介绍如何使用以后的模块。这个股票的grammar就是利用已有的模块来编写代码的。
6.创建应用,导入grammar 首先去olami的主页去登陆和注册。登陆以后转到这页面
文章图片
这里写图片描述 在这里可以看到创建的stock这个应用。由于目前只支持创建五个应用,所以这里没有创建新应用这个接口。如果没有超过五个应用,则可以新添加接口。如下图所示
文章图片
这里写图片描述 点击“创建新应用”,转到下面这个页面
文章图片
这里写图片描述 填写 应用名称,应用描述,应用介绍以后,就可以创建了。回到上一个页面,就可以看到创建的应用了。
点击”进入NLI系统”就可以进入模块页面
文章图片
这里写图片描述 在官网已经内置了很多领域的grammar.在模块页面大家点击“导入”按钮,查看已有领域的模块
文章图片
这里写图片描述 选择一个要使用的,例如我要导入”stock”这个模块,先选择它,点击“导入” 按钮
文章图片
这里写图片描述 然后点击“stock”模块,就可以进入股票模块,查看例句
文章图片
这里写图片描述
文章图片
这里写图片描述 但是这个时候还是不能使用,需要先进行发布。点击页面上方的”发布”按钮,进入发布页面
文章图片
这里写图片描述 点击“发布按钮”
文章图片
这里写图片描述 发布成功,就可以使用stock模块了
Olami还提供了测试grammar的功能,点击“测试”按钮,可以在页面进行测试grammar编写的是否正确,而不必要先开发APP
文章图片
这里写图片描述 7 onResult函数说明 在整个程序中,最主要的一个函数就是onResult函数,他是一个语音识别回调代理的实现函数,在这里获得语音识别和语义识别的结果
- (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 = https://www.it610.com/article/[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 说明状态正常,非零为状态不正常 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(), ^{ }); } }}
//处理ASR节点- (void)processASR:(NSDictionary*)asrDic { NSString *result = [asrDic objectForKey:@"result"]; if (result.length == 0) { //如果结果为空,则弹出警告框 }else{ }}
这个用来处理ASR节点,获得语音识别的结果
//处理Semantic节点- (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"]) {//获得当前股票的名称 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]; } }}
这个用来处理Semantic节点,这个节点中包含了slot的值和modifier的值。OSL 语法描述语言中的 slot 可理解为语义中的变量,用于传递、提取信息,是代码处理的数据的来源。这个程序来说,就是股票名称的来源。关于slot的值可以参考 https://cn.olami.ai/wiki/?mp=osl&content=osl_slot.html,这里有详细说明。
//处理modify- (void)processModify:(NSString*) str { if ([str isEqualToString:@"query"]) {//查询股票 NSString *name = _slotValue[0]; if (name) { [self.delegate getStockName:name]; } }}
【使用Olami|使用Olami sdk实现一个语音查询股票的iOS程序】这个用来处理语音和语义的结果。这个函数主要是处理json字符串中的modifier节点。modifier 语法描述规则是 OSL 语法描述语言中,除了 slot 以外的另一种内置的信息传递机制,一般用来表示语义目的,也可以理解为对于语义的一种注释方式,以便让应用程序的开发者得知 grammar 所代表的相应意图。详细说明参考 https://cn.olami.ai/wiki/?mp=osl&content=osl_regex.html#11,通过modifier,我们才能知道程序的意图是什么。
源代码下载 https://github.com/lym-ay/OlamiStock
欢迎大家留言和讨论。
推荐阅读
- 前端表单
- Debezium的基本使用(以MySQL为例)
- 机器学习|Pandas 学习
- Ubuntu16.04使用教程(三)--gcc与g++的使用
- 为什么公司都不使用HBuilder()
- golang使用阿里云OSS对象存储
- 前端面试|JS数组乱序的几种方法
- 微信小程序使用navigator实现页面跳转功能
- Django4.0 RestFramework 序列器使用
- vue项目打包后使用reverse-sourcemap反编译到源码(详解版)