本文介紹了如何使用阿里云智能語音服務提供的iOS SDK,包括SDK下載安裝、關鍵接口及代碼示例。
前提條件
下載安裝
- 重要
請下載后在樣例初始化代碼中替換您的阿里云賬號信息、Appkey和Token才可運行。
為方便集成,2.5.14版本后iOS接口使用純Object-C接口,不再使用C++混合接口。
對象
說明
智能語音交互移動端SDK
智能語音交互移動端SDK
阿里云計算有限公司
阿里云計算有限公司
SDK版本
2.6.3-01B
SDK更新時間
2024-12-19
SDK整合包大小
17.3MB
SDK整合包MD5值
edf1a1a770bf869b738ee89ab43d88aa
隱私政策
SDK整合包下載
解壓ZIP包,將zip包中的nuisdk.framework添加到您的工程中,并在工程Build Phases的Link Binary With Libraries中添加nuisdk.framework。請確保在編譯配置的General > Frameworks, Libraries, and Embedded Content中配置nuisdk.framework為Embed & Sign。
使用Xcode打開此工程,工程中提供了參考代碼以及一些直接可使用的工具類,例如音頻播放錄制和文件操作,您可以直接復制源碼到您的實際工程進行使用。其中錄音文件識別極速版示例代碼在FileTranscriberViewController類中。
SDK關鍵接口
nui_initialize:初始化SDK。
/** * 初始化SDK,SDK為單例,請先釋放后再次進行初始化。請勿在UI線程調用,可能引起阻塞。 * @param parameters: 初始化參數,參見接口說明文檔 * @param level: log打印級別,值越小打印越多 * @param save_log: 是否保存log為文件,存儲目錄為parameter中的debug_path字段值 * @return 參見錯誤碼 */ -(NuiResultCode) nui_initialize:(const char *)parameters logLevel:(NuiSdkLogLevel)level saveLog:(BOOL)save_log;
nui_set_params:以JSON格式設置SDK參數。
/** * 以JSON格式設置參數 * @param params: 參數信息請參見接口說明文檔 * @return 參見錯誤碼 */ -(NuiResultCode) nui_set_params:(const char *)params;
nui_file_trans_start:發起文件識別請求。
/** * 開始識別 * @param params:設置識別參數,參考接口說明。 * @param task_id:開始轉寫的任務ID,SDK生成隨機字符串。 * @return:參見錯誤碼。 */ NuiResultCode nui_file_trans_start(const char *params, char *task_id);
nui_file_trans_cancel:取消正在工作的識別任務。
/** * 結束識別 * @param task_id:需要結束的轉寫任務ID。 * @return:參見錯誤碼 */ NuiResultCode nui_file_trans_cancel(const char *task_id);
nui_release:釋放SDK。
/** * 釋放SDK資源 * @return 參見錯誤碼 */ -(NuiResultCode) nui_release;
NeoNuiSdkDelegate事件代理
onFileTransEventCallback:SDK轉寫事件回調。
/** * SDK主要事件回調 * @param nuiEvent: 回調事件,參見如下事件列表 * @param asrResult: 語音識別結果 * @param taskId: 一個任務對應的唯一id * @param ifFinish: 本輪識別是否結束標志 * @param retCode: 參見錯誤碼,在出現EVENT_ASR_ERROR事件時有效 */ -(void) onFileTransEventCallback:(NuiCallbackEvent)nuiEvent asrResult:(const char *)asr_result taskId:(const char *)task_id ifFinish:(BOOL)finish retCode:(int)code;
NuiCallbackEvent事件列表:
名稱
說明
EVENT_FILE_TRANS_CONNECTED
連接文件轉寫服務成功
EVENT_FILE_TRANS_UPLOADED
上傳文件成功
EVENT_FILE_TRANS_RESULT
識別最終結果
EVENT_ASR_ERROR
根據錯誤碼信息判斷出錯原因
調用步驟
初始化SDK。
根據業務需求設置參數。
調用nui_file_trans_start開始識別。
在EVENT_FILE_TRANS_RESULT事件中獲取最終識別結果。
結束調用,使用release接口釋放SDK資源。
代碼示例
接口默認采用get_instance方式獲得單例,您如果有多例需求,也可以直接alloc對象進行使用。
NUI SDK初始化
//請注意此處的參數配置,其中賬號相關需要按照genInitParams的說明填入后才可訪問服務
NSString * initParam = [self genInitParams];
[_nui nui_initialize:[initParam UTF8String] logLevel:LOG_LEVEL_VERBOSE saveLog:save_log];
其中,genInitParams生成為String JSON字符串,包含資源目錄和用戶信息。主要包含如下字段。
-(NSString*) genInitParams {
NSString *strResourcesBundle = [[NSBundle mainBundle] pathForResource:@"Resources" ofType:@"bundle"];
NSString *bundlePath = [[NSBundle bundleWithPath:strResourcesBundle] resourcePath];
NSString *id_string = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
NSString *debug_path = [_utils createDir];
TLog(@"id: %s", [id_string UTF8String]);
//獲取token方式:
NSMutableDictionary *dictM = [NSMutableDictionary dictionary];
//賬號和項目創建
// ak_id ak_secret app_key如何獲得,請查看http://bestwisewords.com/document_detail/72138.html
[dictM setObject:@"<您申請創建的app_key>" forKey:@"app_key"]; // 必填
//方法1:
// 首先ak_id ak_secret app_key如何獲得,請查看http://bestwisewords.com/document_detail/72138.html
// 然后請看 http://bestwisewords.com/document_detail/466615.html 使用其中方案一獲取臨時憑證
// 此方案簡介: 遠端服務器使用以下方法獲得有效時限的臨時憑證, 下發給移動端進行使用, 保證賬號信息ak_id和ak_secret不被泄露
// 獲得Token方法(運行在APP服務端): http://bestwisewords.com/document_detail/450255.html?spm=a2c4g.72153.0.0.79176297EyBj4k
[dictM setObject:@"<服務器生成的具有時效性的臨時憑證>" forKey:@"token"]; // 必填
//方法2:
// STS獲取臨時憑證方法暫不支持
//方法3:(強烈不推薦,存在阿里云賬號泄露風險)
// 參考NuiSdkUtils類的實現在端上訪問阿里云Token服務獲取SDK進行獲取。請勿將ak/sk存在本地或端側環境。
// 此方法優點: 端側獲得Token, 無需搭建APP服務器。
// 此方法缺點: 端側獲得ak/sk賬號信息, 極易泄露。
// [_utils getTicket:dictM];
//工作目錄路徑,SDK從該路徑讀取配置文件
[dictM setObject:bundlePath forKey:@"workspace"]; // 必填
//debug目錄。當初始化SDK時的save_log參數取值為true時,該目錄用于保存中間音頻文件
[dictM setObject:debug_path forKey:@"debug_path"];
[dictM setObject:id_string forKey:@"device_id"]; // 必填, 推薦填入具有唯一性的id, 方便定位問題
[dictM setObject:@"https://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/FlashRecognizer" forKey:@"url"]; // 必填
//FullMix = 0 // 選用此模式開啟本地功能并需要進行鑒權注冊
//FullCloud = 1 // 在線實時語音識別可以選這個
//FullLocal = 2 // 選用此模式開啟本地功能并需要進行鑒權注冊
//AsrMix = 3 // 選用此模式開啟本地功能并需要進行鑒權注冊
//AsrCloud = 4 // 在線一句話識別可以選這個
//AsrLocal = 5 // 選用此模式開啟本地功能并需要進行鑒權注冊
[dictM setObject:@"1" forKey:@"service_mode"]; // 必填
NSData *data = [NSJSONSerialization dataWithJSONObject:dictM options:NSJSONWritingPrettyPrinted error:nil];
NSString * jsonStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
return jsonStr;
}
開始識別
調用nui_file_trans_start接口開啟識別。
char task_id[33] = {0};
[_nui nui_file_trans_start:param:[param_string UTF8String] taskId:task_id];
回調處理
onFileTransEventCallback:文件識別事件回調,請勿在事件回調中調用SDK的接口,可能引起死鎖。
-(void)onFileTransEventCallback:(NuiCallbackEvent)nuiEvent
asrResult:(const char *)asr_result
taskId:(const char *)task_id
ifFinish:(bool)finish
retCode:(int)code {
TLog(@"onNuiEventCallback event %d finish %d", nuiEvent, finish);
if (nuiEvent == EVENT_FILE_TRANS_CONNECTED) {
[myself showAsrResult:@"連接成功,正在上傳..."];
} else if (nuiEvent == EVENT_FILE_TRANS_UPLOADED) {
[myself showAsrResult:@"完成上傳,正在轉寫..."];
} else if (nuiEvent == EVENT_FILE_TRANS_RESULT) {
NSString *result = [NSString stringWithUTF8String:asr_result];
[myself showAsrResult:result];
} else if (nuiEvent == EVENT_ASR_ERROR) {
TLog(@"EVENT_ASR_ERROR error[%d]", code);
NSString *result = [NSString stringWithUTF8String:asr_result];
[myself showAsrResult:result];
}
if (finish) {
// 任務完成
[myself showStart];
}
return;
}
取消識別
[_nui nui_file_trans_cancel:[task_id UTF8String]];
常見問題
iOS是否支持后臺處理?
SDK本身不限制前后臺,iOS SDK的樣例工程默認僅支持前臺處理,如果您需要支持后臺處理,可以做如下修改:
在工程Info.list中添加Required background modes配置,并在該配置下添加Item,Value設置為App plays audio or streams audio/video using AirPlay。
在錄音模塊中進入后臺時,不停止錄音。亦即NLSVoiceRecorder.m中_appResignActive接口中不做停止錄音調用。
下載語音交互iOS SDK至本地靜態庫,運行Demo程序測試代碼時,模擬器可以正常運行,真機無法運行,報錯“Reason: no suitable image found. Did find:xxx”如何解決?
建議您刪除手機上對應的APP后,執行xcode clean
,并重新嘗試運行。除此以外,還需檢查簽名的正確性,如果簽名不正確,需撤銷原來的inHouse證書,重新制作新的證書和provisioning profile,并將代碼重新簽名,再次打包。
iOS端集成nuisdk運行報mic錯誤如何處理?
請檢查當前錄音設備是否被占用。
使用智能語音服務集成iOS SDK,接入nuisdk.framework后,導入頭文件#import "nuisdk.framework/Headers/NeoNui.h"后項目報錯如何解決?
一般情況下是SDK導入有問題導致,請您確認下圖參數是否已勾選,如果已勾選,建議您將頭文件導入方式換為#import <nuisdk/NeoNui.h>
。
按照文檔使用SDK接入后報錯“/Users/admin/FlashTranscription_iOS/Fc_ASR.xcodeproj Building for iOS, but the linked and embedded framework 'nuisdk.framework' was built for iOS + iOS Simulator."”如何解決?
可能因為版本過高導致,建議您修改項目配置Validate Workspace為Yes后,重新編譯。
使用集成語音服務iOS SDK,集成flutter_plugin時報錯“Undefined symbols for architecture arm64: "std::__1::mutex::~mutex()", referenced from: ___cxx_global_var_init in libflutter_tts.a(ringBuf.o)”如何解決?
您可以打開iOS工程下的Podfile文件,修改post_install do |installer|部分的代碼,再次執行構建即可成功。
TRTC實時音視頻和語音識別結合,當同時調用麥克風時可能會發生沖突,導致有一方沒有聲音如何解決?
建議嘗試TRTC的音視頻流,然后使用localStream.getAudioTrack
獲取MediaStreamTrack
對象,并轉換為符合ASR標準的音頻流,然后通過語音識別SDK發起請求。
使用App集成iOS SDK,提交到App store失敗,提示“Unsupported Architectures. The executable for AliYunSmart.app/Frameworks/nuisdk.framework contains unsupported architectures '[x86_ _64, i386]'. With error code”如何解決?
可能是模擬器架構影響,您可以參考如下方法查看framework版本并移除framework模擬器架構。
進入到framework目錄。
輸入命令
lipo -info xxxFramework
,查看framework的架構版本,如果含有模擬器打包需要把模擬器架構移除。
使用集成語音服務iOS SDK,接入nuisdk.framework后報錯,要修改Legacy Build system才可以運行,如何解決?
建議您修改項目配置Validate Workspace為Yes后,重新編譯。