可參照iOS百度語音識別開發文檔完成相關配置
一、接入指南
先引入編譯需要的Framework:
AudioToolbox.framework
AVFoundation.framework
SystemConfiguration.framework
CoreTelephony.framework
Security.framework
libz.1.tbd
CFNetwork.framework
CoreLocation.framework
OpenGLES.framework
QuartzCore.framework
GLKit.framework
CoreGraphics.framework
CoreText.framework
注意事項:
1.注意 JSONKit.m 使用非arc方式編譯,需在Build Phases-> Compile Sources->JSONKit.m 的 Compiler Flags 中添加 -fno-objc-arc, 若在xcode7上編譯過程中,運行到 JSONKit文件中這一句
**將JSONKit.h和JSONKit.m拖到項目中。下載地址:https://github.com/johnezang/JSONKit/
** JSONKit.m中報錯
/**
在開發iOS的時候,好多第三方庫使用JSONKIT這個庫,在IOS6.0以上的版本編譯的話,會提示 Semantic Issue錯誤。
錯誤顯示:direct access to Objective-C's
isa is deprecated in favor of object_getClass()
看資料說是 使用 array->isa 這個棄用的函數,網上查大部分的資料都說要使用object_getClass 和object_setClass來更正。
看到Bee中Demo沒有更改這個函數,花費很長時間終於整明白瞭如果使IOS不報這個錯誤
從項目中搜索 Direct usage of 'isa' 將 YES(treat as error) 改爲NO 就可以了
Direct usage of 'isa' 位置位於PROJECT中工程名 -> Building Settings中
*/
/**
BUG描述:Direct access to objective-c's isa is deprecated in favor of object_setClass() and object_getClass()
處理方法:在target的Build Settings裏面,將Build ActiveArchitecture Only改成YES
處理結果:成功運行
其他方法:
1.更改代碼
將 array->isa =_JKArrayClass;
替換爲 object_setClass(array,_JKArrayClass);
將 dictionary->isa =_JKDictionaryClass;
替換爲 object_setClass(dictionary,_JKDictionaryClass);
2.網上其他描述
Xcode升級4.6引用靜態庫.a報錯 ld: file... not contain a(n) armv7s slice:xxx.afor architecture armv7s
由於iPhone 5的A6處理器採用新的Armv7s的架構,XCode4.6在新建Project的時默認使用了該架構,此時編譯含有第三方靜態庫時,會提示“ld: file … not containa(n) armv7s slice: xxx.a for architecture armv7s”錯誤。
所以,在第三方類庫未SDK來兼容Armv7s架構更新前,我們可以採取下面的辦法解決問題:
方法一 . 升級涉及到的.a文件兼容Armv7s
方法二 . 在target的Build Settings裏面,將Build ActiveArchitecture Only改成YES
方法三 . 在XCode 4.5的BuildSetting中將Architectures的$(ARCHS_STANDARD_32_BIT)修改爲armv7
所以如果是開源庫,直接把源代碼包含進項目最好,這樣就不會出現這樣的問題。
*/
void *objectISA = (JK_EXPECT_F(workAroundMacOSXABIBreakingBug)) ? NULL : *((void **)objectPtr); 的時候程序就崩潰,那麼 JSONKit 的版本有點低,下載最新的JSONKit文件將其替換即可;
2.設置App Transport Security,在項目的info.plist中,添加NSAppTransportSecurity,然後在NSAppTransportSecurity 下選擇 Allow Arbitrary Loads,類型Boolean,值設爲YES。
3.在BuildSettings中,設置Enable Bitcode爲NO;
4.注意:
在模擬機的情況下,會報12個錯誤左右,但在真機下不會報錯
5. 運行百度語音識別官方iOS demo報錯: load offline engine failed: 4001
運行官方BDVRClientSample這個demo(ios版的),demo可以安到手機上,但是點“識別UI”那個按鈕後“授權驗證失敗”。
如果點“語音識別”那個按鈕,控制檯輸出:2015-10-23 14:26:23.900 BDVRClientSample[3016:1654910] load offline engine failed: 4001
懷疑是license的問題,在文檔中看到:
int ret = [[BDVoiceRecognitionClient sharedInstance] loadOfflineEngine:@”appCode”
license: @” 授權文件路徑”
datFile: @” s_1 的文件路徑” LMDatFile: LMDatFilePath grammSlot: recogGrammSlot];
然後我看sample的代碼裏寫的是:
因此開始我還以爲是因爲license寫nil導致的問題。後來發現不是(雖然本帖中的問題不是由於license填nil造成的,但如果想使用離線識別的話,license確實需要傳一個正確的路徑纔行,見:http://www.cnblogs.com/wantnon/p/4915028.html。如果不需要離線識別功能,爲包體積考慮,應將相應資源刪除,見:http://www.cnblogs.com/wantnon/p/4915078.html)。問題出在沒有提交應用的BundleID,提交應用BundleID的方法如下:
1,進入到“應用管理”。
2,點開“管理語音識別”的下拉菜單,選擇其中的“申請離線識別授權”。
3,在彈出的“申請離線識別授權”面板中選iOS,填寫BundleID,然後點“提交”。
如圖所示:
然後再將sample工程的BundleID改成這裏填寫的BundleID,再運行,就ok了。
二、使用
在此僅使用的是BDVoiceRecognitionClient來進行語音識別。
1.引入頭文件
#import "BDVoiceRecognitionClient.h"
2.配置 BDVoiceRecognitionClient
// 使用自己申請的應用的ApiKey和SecretKey替換之
[[BDVoiceRecognitionClient sharedInstance]setApiKey:@"ApiKey"withSecretKey:@"SecretKey"];
[[BDVoiceRecognitionClient sharedInstance] setLanguage:EVoiceRecognitionLanguageChinese];
[[BDVoiceRecognitionClient sharedInstance] setResourceType:RESOURCE_TYPE_NLU];
[[BDVoiceRecognitionClient sharedInstance] setPropertyList:@[@(EVoiceRecognitionPropertyWeb)]];
if ([[BDVoiceRecognitionClient sharedInstance] isCanRecorder]) {
[[BDVoiceRecognitionClient sharedInstance] startVoiceRecognition:self];
}
3.遵守MVoiceRecognitionClientDelegate協議,實現以下代理方法
根據不同的字段,可自行對結果進行處理
- (void)VoiceRecognitionClientWorkStatus:(int) aStatus obj:(id)aObj{
switch (aStatus) {
case EVoiceRecognitionClientWorkStatusStartWorkIng:
NSLog(@"開始錄音");
break;
case EVoiceRecognitionClientWorkStatusStart:
NSLog(@"檢測到用戶開始說話");
break;
case EVoiceRecognitionClientWorkStatusEnd:
NSLog(@"結束錄音");
break;
case EVoiceRecognitionClientWorkStatusFinish:
{
// 此處返回識別結果
NSLog(@"語音識別功能完成,服務器返回正確結果");
NSString * string = [aObj JSONString];
NSLog(@"識別結果: %@",string);
break;
}
default:
break;
}
}
- (void)VoiceRecognitionClientErrorStatus:(int) aStatus subStatus:(int)aSubStatus{
switch (aStatus) {
case EVoiceRecognitionClientErrorStatusClassVDP:
NSLog(@"語音數據處理過程出錯");
break;
case EVoiceRecognitionClientErrorStatusUnKnow:
NSLog(@"未知錯誤(異常)");
break;
case EVoiceRecognitionClientErrorStatusNoSpeech:
NSLog(@"用戶未說話");
break;
case EVoiceRecognitionClientErrorStatusShort:
NSLog(@"用戶說話聲音太短");
break;
case EVoiceRecognitionClientErrorStatusException:
NSLog(@"語音前端庫檢測異常");
break;
case EVoiceRecognitionClientErrorStatusClassRecord:
NSLog(@"錄音出錯");
break;
case EVoiceRecognitionClientErrorStatusClassLocalNet:
NSLog(@"本地網絡聯接出錯");
break;
case EVoiceRecognitionClientErrorStatusClassServerNet:
NSLog(@"服務器返回網絡錯誤");
break;
default:
break;
}
}
- (void)VoiceRecognitionClientNetWorkStatus:(int) aStatus{
switch (aStatus) {
case EVoiceRecognitionClientNetWorkStatusStart:
NSLog(@"網絡工作開始");
break;
case EVoiceRecognitionClientNetWorkStatusEnd:
NSLog(@"網絡工作完成");
break;
default:
break;
}
}