[TOC]
語法識別是基于語法文件的一種命令詞識別技術。在線語法識別基于abnf語法文件;離線語法基于bnf語法文件。語法文件可以參照Demo的工程所示。
## 在線識別(該服務已下線,新用戶無法使用)
### 應用級命令詞識別
使用瀏覽器訪問訊飛開放平臺(http://www.xfyun.cn)。在打開的頁面中,點擊“產品服務”、“在線命令詞識別” 。如下圖所示:

在隨后打開的頁面中,點擊“使用服務”,選擇應用,點擊“確定”,即可打開應用級在線語法文件上傳頁面,如下圖所示。上傳所需的語法文件,待頁面提示“語法文件已生效”,則應用級在線語法文件啟用成功。

使用示例如下所示:
~~~
//獲取識別對象單例
_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{}
~~~