[TOC]
语法识别是基于语法文件的一种命令词识别技术。在线语法识别基于abnf语法文件;离线语法基于bnf语法文件。语法文件可以参照Demo的工程所示。
## 在线识别(该服务已下线,新用户无法使用)
### 应用级命令词识别
使用浏览器访问讯飞开放平台(http://www.xfyun.cn)。在打开的页面中,点击“产品服务”、“在线命令词识别” 。如下图所示:
![](https://box.kancloud.cn/dde622810ddbf5e2e35cf31c10d56a48_532x220.png)
在随后打开的页面中,点击“使用服务”,选择应用,点击“确定”,即可打开应用级在线语法文件上传页面,如下图所示。上传所需的语法文件,待页面提示“语法文件已生效”,则应用级在线语法文件启用成功。
![](https://box.kancloud.cn/a625d533d6b25c100629f38164eebe04_1194x599.png)
使用示例如下所示:
~~~
//获取识别对象单例
_iFlySpeechRecognizer = [IFlySpeechRecognizer sharedInstance];
//设置协议委托对象
_iFlySpeechRecognizer.delegate = self;
//设置在线识别参数
//设置引擎类型,cloud或者local
[_iflySpeechRecognizer setParameter:@"cloud" forKey:[IFlySpeechConstant ENGINE_TYPE]];
//设置服务类型为asr识别
[_iflySpeechRecognizer setParameter:@"asr" forKey:[IFlySpeechConstant IFLY_DOMAIN]];
//启动识别
[_iFlySpeechRecognizer startListening];
//识别IFlySpeechRecognizerDelegate协议
//本地和在线的识别返回代理是一致
//在切换在线和离线服务时还需要注意参数的重置,具体可以参照demo所示
//结果返回代理
- (void) onResults:(NSArray *) results isLast:(BOOL) isLast{}
//会话结束回调
- (void) onError:(IFlySpeechError*) error{}
//录音音量回调
- (void) onVolumeChanged: (int)volume{}
//录音开始回调
- (void) onBeginOfSpeech{}
//录音结束回调
- (void) onEndOfSpeech{}
//会话取消回调
- (void) onCancel{}
~~~
### 终端级命令词识别
终端级在线命令词识别需要先在终端上构建语法文件,上传语法文件之后获得相应的Grammer ID,以后每次使用识别功能前,设置该Grammar ID参数即可。其示例代码如下:
~~~
//获取识别对象单例
_iFlySpeechRecognizer = [IFlySpeechRecognizer sharedInstance];
//设置协议委托对象
_iFlySpeechRecognizer.delegate = self;
//设置在线识别参数
//开启候选结果
[_iflySpeechRecognizer setParameter:@"1" forKey:@"asr_wbest"];
//设置引擎类型,cloud或者local
[_iflySpeechRecognizer setParameter:@"cloud" forKey:[IFlySpeechConstant ENGINE_TYPE]];
//设置字符编码为utf-8
[_iflySpeechRecognizer setParameter:@"utf-8" forKey:[IFlySpeechConstant TEXT_ENCODING]];
//语法类型,本地是bnf,在线识别是abnf
[_iflySpeechRecognizer setParameter:@"abnf" forKey:[IFlyResourceUtil GRAMMARTYPE]];
//设置服务类型为asr识别
[_iflySpeechRecognizer setParameter:@"asr" forKey:[IFlySpeechConstant IFLY_DOMAIN]];
//编译语法文件,注意grammerType参数的区别
//读取本地abnf语法文件内容
NSString* grammerContent = [self readFile:_abnfFilePath];
//调用构建语法接口
[_iflySpeechRecognizer buildGrammarCompletionHandler:^(NSString * grammerID, IFlySpeechError *error){
//设置grammerID
[_iFlySpeechRecognizer setParameter:grammerID forKey:[IFlySpeechConstant CLOUD_GRAMMAR]];
}grammarType:@”abnf” grammarContent:grammarContent];
//启动识别
[_iFlySpeechRecognizer startListening];
//识别IFlySpeechRecognizerDelegate协议
//本地和在线的识别返回代理是一致
//在切换在线和离线服务时还需要注意参数的重置,具体可以参照demo所示
//结果返回代理
- (void) onResults:(NSArray *) results isLast:(BOOL) isLast{}
//会话结束回调
- (void) onError:(IFlySpeechError*) error{}
//录音音量回调
- (void) onVolumeChanged: (int)volume{}
//录音开始回调
- (void) onBeginOfSpeech{}
//录音结束回调
- (void) onEndOfSpeech{}
//会话取消回调
- (void) onCancel{}
~~~
## 离线命令词识别
**引擎大小**:
| 状态 |大小 |
| :---: | :---: |
| 编译前静态库 | 24.5 MB |
|编译后(ipa) |8 MB |
**资源大小**: 5.0MB
**空间大小**:(不同的编译器编译后大小会有不同,请以实际为准)
ipa文件大小 = 引擎编译后(8MB) +资源(5MB)= 13MB。
~~~
//设置本地识别参数,其他参数与在线方式一致
//设置引擎类型,cloud或者local
[_iflySpeechRecognizer setParameter:@ "local" forKey:[IFlySpeechConstant ENGINE_TYPE]];
//语法类型,本地是bnf,在线识别是abnf
[_iflySpeechRecognizer setParameter:@ "bnf" forKey:[IFlyResourceUtil GRAMMARTYPE]];
//设置引擎资源文件路径,如demo中的aitalkResource中的common.mp3
NSString *aitalkResourcePath = [[NSString alloc] initWithFormat:@"fo|%@/aitalkResource/common.mp3",appPath];
[_iflySpeechRecognizer setParameter:aitalkResourcePath forKey:[IFlyResourceUtil ASR_RES_PATH]];
//启动asr识别引擎
[[IFlySpeechUtility getUtility] setParameter:@"asr" forKey:[IFlyResourceUtil ENGINE_START]];
//编译语法文件(注意grammarType参数的区别)
//读取本地bnf语法文件内容
NSString* grammarContent = [self readFile:_bnfFilePath];
//调用语法编译接口
[_iflySpeechRecognizer buildGrammarCompletionHandler:^(NSString *
grammerID, IFlySpeechError *error){
//设置grammerID
[_iFlySpeechRecognizer setParameter:grammerID forKey:[IFlySpeechConstant LOCAL_GRAMMAR]];
}grammarType:@”bnf” grammarContent:grammarContent];
//启动识别
[_iFlySpeechRecognizer startListening];
//识别IFlySpeechRecognizerDelegate协议
//本地和在线的识别返回代理是一致
//在切换在线和离线服务时还需要注意参数的重置,具体可以参照demo所示
//结果返回代理
- (void) onResults:(NSArray *) results isLast:(BOOL) isLast{}
//会话结束回调
- (void) onError:(IFlySpeechError*) error{}
//录音音量回调
- (void) onVolumeChanged: (int)volume{}
//录音开始回调
- (void) onBeginOfSpeech{}
//录音结束回调
- (void) onEndOfSpeech{}
//会话取消回调
- (void) onCancel{}
~~~