iOS 集成百度語音小指南

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

             }

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章