可参照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来进行语音识别。
#import "BDVoiceRecognitionClient.h"
// 使用自己申请的应用的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];
}
根据不同的字段,可自行对结果进行处理
- (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;
}
}