使用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 
使用olami sdk实现一个语音查询股票的iOS程序 
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,注册登陆以后创建应用才可以看到了 
使用olami sdk实现一个语音查询股票的iOS程序 
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的主页去登陆和注册。登陆以后转到这页面 
使用olami sdk实现一个语音查询股票的iOS程序
在这里可以看到创建的stock这个应用。由于目前只支持创建五个应用,所以这里没有创建新应用这个接口。如果没有超过五个应用,则可以新添加接口。如下图所示 
使用olami sdk实现一个语音查询股票的iOS程序
点击“创建新应用”,转到下面这个页面 
使用olami sdk实现一个语音查询股票的iOS程序
填写 应用名称,应用描述,应用介绍以后,就可以创建了。回到上一个页面,就可以看到创建的应用了。

点击”进入NLI系统”就可以进入模块页面 
使用olami sdk实现一个语音查询股票的iOS程序
在官网已经内置了很多领域的grammar.在模块页面大家点击“导入”按钮,查看已有领域的模块 
使用olami sdk实现一个语音查询股票的iOS程序 
选择一个要使用的,例如我要导入”stock”这个模块,先选择它,点击“导入” 按钮 
使用olami sdk实现一个语音查询股票的iOS程序
然后点击“stock”模块,就可以进入股票模块,查看例句 
使用olami sdk实现一个语音查询股票的iOS程序

使用olami sdk实现一个语音查询股票的iOS程序
但是这个时候还是不能使用,需要先进行发布。点击页面上方的”发布”按钮,进入发布页面 
使用olami sdk实现一个语音查询股票的iOS程序
点击“发布按钮” 
使用olami sdk实现一个语音查询股票的iOS程序 
发布成功,就可以使用stock模块了

Olami还提供了测试grammar的功能,点击“测试”按钮,可以在页面进行测试grammar编写的是否正确,而不必要先开发APP 
使用olami sdk实现一个语音查询股票的iOS程序
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 = [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(), ^{ });
}
} }

在这个函数中,调用了三个函数,分别来处理josn格式中的三个比较重要的节点

//处理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];
} }
}

这个用来处理语音和语义的结果。这个函数主要是处理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

欢迎大家留言和讨论。

上一篇:jquery scroll()滚动条事件


下一篇:sqlalchemy 踩过的坑