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

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

使用示例如下所示:
~~~
//獲取識(shí)別對象單例
_iFlySpeechRecognizer = [IFlySpeechRecognizer sharedInstance];
//設(shè)置協(xié)議委托對象
_iFlySpeechRecognizer.delegate = self;
//設(shè)置在線識(shí)別參數(shù)
//設(shè)置引擎類型,cloud或者local
[_iflySpeechRecognizer setParameter:@"cloud" forKey:[IFlySpeechConstant ENGINE_TYPE]];
//設(shè)置服務(wù)類型為asr識(shí)別
[_iflySpeechRecognizer setParameter:@"asr" forKey:[IFlySpeechConstant IFLY_DOMAIN]];
//啟動(dòng)識(shí)別
[_iFlySpeechRecognizer startListening];
//識(shí)別IFlySpeechRecognizerDelegate協(xié)議
//本地和在線的識(shí)別返回代理是一致
//在切換在線和離線服務(wù)時(shí)還需要注意參數(shù)的重置,具體可以參照demo所示
//結(jié)果返回代理
- (void) onResults:(NSArray *) results isLast:(BOOL) isLast{}
//會(huì)話結(jié)束回調(diào)
- (void) onError:(IFlySpeechError*) error{}
//錄音音量回調(diào)
- (void) onVolumeChanged: (int)volume{}
//錄音開始回調(diào)
- (void) onBeginOfSpeech{}
//錄音結(jié)束回調(diào)
- (void) onEndOfSpeech{}
//會(huì)話取消回調(diào)
- (void) onCancel{}
~~~
### 終端級命令詞識(shí)別
終端級在線命令詞識(shí)別需要先在終端上構(gòu)建語法文件,上傳語法文件之后獲得相應(yīng)的Grammer ID,以后每次使用識(shí)別功能前,設(shè)置該Grammar ID參數(shù)即可。其示例代碼如下:
~~~
//獲取識(shí)別對象單例
_iFlySpeechRecognizer = [IFlySpeechRecognizer sharedInstance];
//設(shè)置協(xié)議委托對象
_iFlySpeechRecognizer.delegate = self;
//設(shè)置在線識(shí)別參數(shù)
//開啟候選結(jié)果
[_iflySpeechRecognizer setParameter:@"1" forKey:@"asr_wbest"];
//設(shè)置引擎類型,cloud或者local
[_iflySpeechRecognizer setParameter:@"cloud" forKey:[IFlySpeechConstant ENGINE_TYPE]];
//設(shè)置字符編碼為utf-8
[_iflySpeechRecognizer setParameter:@"utf-8" forKey:[IFlySpeechConstant TEXT_ENCODING]];
//語法類型,本地是bnf,在線識(shí)別是abnf
[_iflySpeechRecognizer setParameter:@"abnf" forKey:[IFlyResourceUtil GRAMMARTYPE]];
//設(shè)置服務(wù)類型為asr識(shí)別
[_iflySpeechRecognizer setParameter:@"asr" forKey:[IFlySpeechConstant IFLY_DOMAIN]];
//編譯語法文件,注意grammerType參數(shù)的區(qū)別
//讀取本地abnf語法文件內(nèi)容
NSString* grammerContent = [self readFile:_abnfFilePath];
//調(diào)用構(gòu)建語法接口
[_iflySpeechRecognizer buildGrammarCompletionHandler:^(NSString * grammerID, IFlySpeechError *error){
//設(shè)置grammerID
[_iFlySpeechRecognizer setParameter:grammerID forKey:[IFlySpeechConstant CLOUD_GRAMMAR]];
}grammarType:@”abnf” grammarContent:grammarContent];
//啟動(dòng)識(shí)別
[_iFlySpeechRecognizer startListening];
//識(shí)別IFlySpeechRecognizerDelegate協(xié)議
//本地和在線的識(shí)別返回代理是一致
//在切換在線和離線服務(wù)時(shí)還需要注意參數(shù)的重置,具體可以參照demo所示
//結(jié)果返回代理
- (void) onResults:(NSArray *) results isLast:(BOOL) isLast{}
//會(huì)話結(jié)束回調(diào)
- (void) onError:(IFlySpeechError*) error{}
//錄音音量回調(diào)
- (void) onVolumeChanged: (int)volume{}
//錄音開始回調(diào)
- (void) onBeginOfSpeech{}
//錄音結(jié)束回調(diào)
- (void) onEndOfSpeech{}
//會(huì)話取消回調(diào)
- (void) onCancel{}
~~~
## 離線命令詞識(shí)別
**引擎大小**:
| 狀態(tài) |大小 |
| :---: | :---: |
| 編譯前靜態(tài)庫 | 24.5 MB |
|編譯后(ipa) |8 MB |
**資源大小**: 5.0MB
**空間大小**:(不同的編譯器編譯后大小會(huì)有不同,請以實(shí)際為準(zhǔn))
ipa文件大小 = 引擎編譯后(8MB) +資源(5MB)= 13MB。
~~~
//設(shè)置本地識(shí)別參數(shù),其他參數(shù)與在線方式一致
//設(shè)置引擎類型,cloud或者local
[_iflySpeechRecognizer setParameter:@ "local" forKey:[IFlySpeechConstant ENGINE_TYPE]];
//語法類型,本地是bnf,在線識(shí)別是abnf
[_iflySpeechRecognizer setParameter:@ "bnf" forKey:[IFlyResourceUtil GRAMMARTYPE]];
//設(shè)置引擎資源文件路徑,如demo中的aitalkResource中的common.mp3
NSString *aitalkResourcePath = [[NSString alloc] initWithFormat:@"fo|%@/aitalkResource/common.mp3",appPath];
[_iflySpeechRecognizer setParameter:aitalkResourcePath forKey:[IFlyResourceUtil ASR_RES_PATH]];
//啟動(dòng)asr識(shí)別引擎
[[IFlySpeechUtility getUtility] setParameter:@"asr" forKey:[IFlyResourceUtil ENGINE_START]];
//編譯語法文件(注意grammarType參數(shù)的區(qū)別)
//讀取本地bnf語法文件內(nèi)容
NSString* grammarContent = [self readFile:_bnfFilePath];
//調(diào)用語法編譯接口
[_iflySpeechRecognizer buildGrammarCompletionHandler:^(NSString *
grammerID, IFlySpeechError *error){
//設(shè)置grammerID
[_iFlySpeechRecognizer setParameter:grammerID forKey:[IFlySpeechConstant LOCAL_GRAMMAR]];
}grammarType:@”bnf” grammarContent:grammarContent];
//啟動(dòng)識(shí)別
[_iFlySpeechRecognizer startListening];
//識(shí)別IFlySpeechRecognizerDelegate協(xié)議
//本地和在線的識(shí)別返回代理是一致
//在切換在線和離線服務(wù)時(shí)還需要注意參數(shù)的重置,具體可以參照demo所示
//結(jié)果返回代理
- (void) onResults:(NSArray *) results isLast:(BOOL) isLast{}
//會(huì)話結(jié)束回調(diào)
- (void) onError:(IFlySpeechError*) error{}
//錄音音量回調(diào)
- (void) onVolumeChanged: (int)volume{}
//錄音開始回調(diào)
- (void) onBeginOfSpeech{}
//錄音結(jié)束回調(diào)
- (void) onEndOfSpeech{}
//會(huì)話取消回調(diào)
- (void) onCancel{}
~~~
