iOS开发- 百度语音SDK简单使用及问题解决

可参照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;

             }

}




你可能感兴趣的:(iOS开发)