閱讀677 返回首頁    go 財經資訊


iOS SDK__一句話識別_語音識別(ASR)_智能語音交互-阿裏雲

功能介紹

語音iOS SDK提供一句話識別服務,提供將實時短語音轉成文字的功能,可直接用於語音搜索類應用。

SDK下載地址

一句話識別iOSSDK

重要接口說明

發送語音請求的對象及方法NlsRequest.h

語音請求初始化方法

- (instancetype)init;

  • 說明 語音識別、語音合成的語音請求初始化方法
  • 返回值 self

設置語音請求的appkey

- (void)setAppkey:(NSString *)appKey;

  • 說明 設置語音請求的appkey。
  • 參數
    • appKey 用戶申請的appKey
  • 返回值 無

設置發送的請求是否需要帶語音數據

- (void)setBstreamAttached:(BOOL)bstreamAttached;

  • 說明 設置發送的請求是否需要帶語音數據。若發送的是語音識別請求,則bstreamAttached為YES;若發送的是語音合成請求,則bstreamAttached為NO。
  • 參數
    • bstreamAttached 請求是否需要帶語音數據。
  • 返回值 無

設置語音識別ASR請求

- (void)setAsrRequest:(NSString *)userId;

  • 說明 設置語音識別ASR請求
  • 參數
    • userId 用戶id
  • 返回值 無

數加驗證

- (void)Authorize:(NSString )authId withSecret:(NSString )secret;

  • 說明 數加驗證,未經過數加驗證的語音請求均為非法請求。
  • 參數
    • authId 數加驗證的ak_id
    • secret 數加驗證的ak_secret
  • 返回值 無

將語音請求NlsRequest對象轉換成JSON字符串

+ (NSString )getJSONStringfromNlsRequest:(NlsRequest )nlsRequest;

  • 說明 將語音請求NlsRequest對象轉換成JSON字符串形式。
  • 參數
    • nlsRequest NlsRequest對象
  • 返回值 NlsRequest的JSON字符串

將對象轉換成JSONString方法

+ (NSString *)getJSONString:(id)obj options:(NSJSONWritingOptions)options error:(NSError)error;**

  • 說明 將object轉換成JSONString。
  • 參數
    • obj 被轉化對象
    • options NSJSONWritingOptions
    • error NSError
  • 返回值 NlsRequest的JSON字符串

將對象轉換成NSDictionary方法

+ (NSDictionary *)getObjectData:(id)obj;

  • 說明 將object轉換成NSDictionary。
  • 參數
    • obj 被轉化對象
  • 返回值 NSDictionary

語音服務SDK的核心類NlsRecognizer.h

語音服務SDK的核心類,封裝了錄音設備的初始化,壓縮處理,語音檢測(VAD)等複雜邏輯,自動的將語音數據同步傳送到語音服務器上。開發者隻需要傳遞正確的delegate,就能完成語音識別和語音合成。

語音識別的關鍵回調函數

-(void)recognizer:(NlsRecognizer )recognizer didCompleteRecognizingWithResult:(NlsRecognizerResult)result error:(NSError*)error;

  • 說明 語音識別的關鍵回調函數,delegate必須實現。若appkey為流式返回appkey,將會多次回調該方法。
  • 參數
    • recognizer NlsRecognizer
    • result 返回值對象 NlsRecognizerResult
    • error 語音識別錯誤和異常 NSError
  • 返回值 無

返回錄音的語音音量

-(void)recognizer:(NlsRecognizer *)recognizer recordingWithVoiceVolume:(NSUInteger)voiceVolume;

  • 說明 返回錄音的語音音量,調用頻率取決於SDK內部設定。
  • 參數
    • recognizer NlsRecognizer
    • voiceVolume 0-100的數值
  • 返回值 無

返回錄音的數據

-(void)recognizer:(NlsRecognizer )recognizer recordingWithVoiceData:(NSData)voiceData;

  • 說明 返回錄音的數據,調用頻率取決於SDK內部設定。
  • 參數
    • recognizer NlsRecognizer
    • frame 返回的語音
  • 返回值 無

開始錄音的回調通知

-(void)recognizerDidStartRecording:(NlsRecognizer *)recognizer;

  • 說明 開始錄音的回調通知
  • 參數
    • recognizer NlsRecognizer
  • 返回值 無

停止錄音的回調通知

-(void)recognizerDidStopRecording:(NlsRecognizer *)recognizer;

  • 說明 停止錄音的回調通知
  • 參數
    • recognizer NlsRecognizer
  • 返回值 無

錄音模式下停止的回調通知

-(void)recognizerDidStopRecording:(NlsRecognizer )recognizer withRecorderData:(NSData)data;

  • 說明 錄音模式下停止的回調通知,可得到錄音數據(保留方法)
  • 參數
    • recognizer NlsRecognizer
    • data 錄音數據
  • 返回值 無

設置SDK工作模式

NlsRecognizer @property(nonatomic,assign,readwrite) kNlsRecognizerMode mode;

  • 說明 設置語音SDK的工作模式,若不設置,則為kMODE_RECOGNIZER

設置SDK是否監聽App狀態

NlsRecognizer @property(nonatomic,assign,readwrite) BOOL cancelOnAppEntersBackground;

  • 說明 設置SDK是否監聽App狀態,缺省為NO。如果設為YES,則SDK會監聽App狀態,一旦切換到後台,就自動取消請求。

設置cancel時是否回調onRecognizeComplete方法

NlsRecognizer @property(nonatomic,assign,readwrite) BOOL enableUserCancelCallback;

  • 說明 NlsRecognizer的cancel方法被調用的時候,會觸發delegate的onRecognizeComplete方法,錯誤碼為kERR_USER_CANCELED,錯誤信息為kNlsRecognizerErrorUserCanceled。如果App不想被回調,請設置為NO即可。參見 cancel方法。

設置是否記錄語音

NlsRecognizer @property(nonatomic,assign,readwrite) BOOL enableVoiceLog;

  • 說明 打開語音記錄功能,SDK將會把語音識別的文件記錄到當前App的document下麵,調試用。缺省關閉,在DEBUG模式下有效,Release模式下無效。(保留字段)

配置語音服務模塊的基礎參數

+(void)configure;

  • 說明 配置語音服務模塊的基礎參數,請在App啟動的時候調用
  • 參數 無
  • 返回值 無

初始化NlsRecognizer

-(id)initWithNlsRequest:(NlsRequest )nlsRequest svcURL:(NSString )svcURL;

  • 說明 初始化NlsRecognizer,注意: 通過該API使用的appKey必須提前通過configure函數預先配置好
  • 參數
    • nlsRequest 語音請求NlsRequest
    • svcURL 語音服務地址
  • 返回值 無

設置是否打開VAD開關

-(void)setVad;

  • 說明 設置是否打開VAD開關,VAD默認關閉。
  • 參數
    • isVad 是否打開靜音檢測開關
  • 返回值 無

檢測到用戶語音後,自動停止的間隙

-(void)setVadAutoStopTimeInterval:(NSTimeInterval) timeinterval;

  • 說明 檢測到用戶語音後,自動停止的間隙。
  • 參數
    • timeinterval 靜音觸發自動停止的時長,以秒表示.缺省0.7s
  • 返回值 無

打開VAD時,設置最短錄音時間,缺省時為5s

-(void)setMinRecordTime:(NSTimeInterval) timeinterval;

  • 說明 打開VAD時,設置最短錄音時間,缺省時為5s
  • 參數
    • timeinterval 最短錄音時間,缺省時為5s
  • 返回值 無

設置最長錄音時間,缺省時為60s

-(void)setMaxRecordTime:(NSTimeInterval) timeinterval;

  • 說明 設置最長錄音時間,缺省時為60s
  • 參數
    • timeinterval 最短錄音時間,缺省時為60s
  • 返回值 無

語音主服務是否可用

+(BOOL)isServiceAvailable;

  • 說明 語音主服務是否可用,開發者可以根據測返回值,調整UI行為
  • 返回值 返回語音主服務當前是否可用。

開始語音識別

-(void)start;

  • 說明 開始語音識別。打開錄音設備,同時開始識別。
  • 返回值 無

停止語音識別

-(void)stop;

  • 說明 停止語音識別。停止錄音設備,delegate的didStopRecord會被回調。網絡請求在後台繼續,如果有識別結果返回,則會通過delegate的didCompleteRecognizingWithResult回調方法單獨返回。
  • 返回值 無

取消語音識別

-(void)cancel;

  • 說明 取消語音識別。取消語音識別,錄音會停止,網絡請求會取消。根據enableUserCancelCallback的設置,決定是否回調delegate方法。
  • 返回值 無

語音識別是否已經開始

-(BOOL)isStarted;

  • 說明 語音識別是否已經開始
  • 返回值 YES表示語音識別已經開始,NO表示語音識別未開始。

參數和錯誤碼說明

發送ASR語音請求的參數:

  1. {
  2. "requests" : {
  3. "asr_in" : {
  4. "version" : "3.0",// 協議版本號
  5. "asrSC" : "opu",// 輸入的語音格式,默認opu
  6. "user_id" : ""// 用戶名,可選項
  7. },
  8. "context" : {
  9. "auth" : {} //requested
  10. }
  11. },
  12. "app_key" : "",
  13. "bstream_attached" : true,// 請求包的後麵是不是還接著二進製語音流。語音識別時bstream_attached = YES 。
  14. "version" : "4.0"// 協議版本號
  15. }

返回的識別結果result是一個NlsRecognizerResult的對象:

  1. {
  2. "status" : "1",// 服務器狀態,0為失敗,非零為成功
  3. "id" : "",// 透傳係統始終的uuid,服務端配置是否返回
  4. "finish" : "1",// 0為未結束,非零為結束,識別是否已經結束
  5. "results" : {
  6. "asr_out" : {
  7. "result" : "",// 語音識別結果
  8. "status" : 1,// 服務器狀態,0為失敗,非零為成功
  9. "finish" : 1,// 0為未結束,非零為結束,識別是否已經結束
  10. "version" : "4.0"
  11. },
  12. "out" : {}//保留字段
  13. },
  14. "bstream_attached" : false,// 應答包的後麵是不是還接著二進製語音流。
  15. "version" : "4.0"// 協議版本號
  16. }

若識別發生錯誤,recognizer:didCompleteRecognizingWithResult:error:的回調函數中error不為nil。相應錯誤碼的對應表如下所示。

  • 客戶端錯誤碼
字段名 錯誤碼 含義
kERR_NO_ERROR 0 成功
kERR_GENERIC_ERROR 1 識別失敗
kERR_USER_CANCELED 520 用戶取消
kERR_NETWORK_ERROR 530 網絡及通訊異常
kERR_SERVICE_ERROR 540 語音服務異常或被降級
kERR_VOICE_ERROR 550 錄音及語音識別異常
kERR_MIC_ERROR 560 Mic無法訪問或硬件異常
kERR_TOOSHORT_ERROR 570 用戶點擊過快
  • 服務端返回結果錯誤碼
狀態 status_code CloseFrame狀態碼 HTTP語義
成功 200 1000 成功處理
請求格式有誤 400 4400 錯誤請求
需要鑒權信息 401 4401 請求要求身份驗證
鑒權失敗 403 4403 服務器拒絕請求
超出最大並發量 429 4429 太多請求
請求超時 408 4408 處理請求超時
處理出錯 500 4500 服務器內部錯誤
服務不可用 503 4503 服務不可用

完整示例

創建應用

使用Xcode創建iOS application應用工程。

添加Framework

在Xcode工程中需要引入所需要的framework,NlsClientSDK.framework。

添加方法:選中工程,點擊TARGETS,在右側的Build Phases中選擇 Link Binary With Libraries,點擊上圖中左下角的+號,在彈出界麵中依次添加所依賴的framework。

Link Binary With Libraries

  1. $lipo -info NlsClientSDK
  2. Architectures in the fat file: NlsClientSDK are: armv7 i386 x86_64 arm64

引入頭文件

在需要調用SDK的文件中,添加如下頭文件:

  1. #import <NlsClientSDK/NlsClientSDK.h>

語音服務注冊

AppDelegate中注冊語音服務:

  1. #import "AppDelegate.h"
  2. #import "ViewController.h"
  3. #import <NlsClientSDK/NlsClientSDK.h>
  4. @interface AppDelegate ()
  5. @end
  6. @implementation AppDelegate
  7. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  8. -
  9. #warning configure語音服務,必須在調用語音服務前執行該方法。
  10. [NlsRecognizer configure];
  11. ……

實現語音識別功能

ViewController中實現語音識別方法:

  1. #import "ViewController.h"
  2. #import <NlsClientSDK/NlsClientSDK.h>
  3. @interface ViewController ()<NlsRecognizerDelegate>
  4. @property(nonatomic,strong) NlsRecognizer *recognizer;
  5. @end
  6. @implementation ViewController
  7. - (void)viewWillAppear:(BOOL)animated
  8. {
  9. [super viewWillAppear:animated];
  10. // 檢查asr服務是否可用
  11. if([NlsRecognizer isServiceAvailable]) {
  12. NSLog(@"當前語音服務可用");
  13. }
  14. else {
  15. NSLog(@"當前語音服務不可用");
  16. }
  17. // 監測語音服務狀態
  18. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(asrStatusChanged:) name:kNlsRecognizerServiceStatusChanged object:nil];
  19. }
  20. #pragma mark - Actions
  21. - (void)onStartAsrButtonClick:(id)sender {
  22. // 初始化語音請求類
  23. NlsRequest * nlsRequest = [[NlsRequest alloc] init];
  24. #warning appkey請從 "快速開始" 幫助頁麵的appkey列表中獲取
  25. [nlsRequest setAppkey:@""]; // requested
  26. [nlsRequest setBstreamAttached:YES]; // requested 語音識別,setBstreamAttached = YES
  27. [nlsRequest setAsrRequest:@"input_userid"]; // requested 設置asr_in參數
  28. #warning 請修改為您在阿裏雲申請的數字驗證串Access Key ID和Access Key Secret
  29. [nlsRequest Authorize:@"" withSecret:@""]; // requested
  30. // 初始化語音服務核心類
  31. NlsRecognizer *r = [[NlsRecognizer alloc] initWithNlsRequest:nlsRequest svcURL:nil]; // requested 采用默認svcURL
  32. //vad:自動語音檢測,可根據需要設置是否打開,YES為打開,NO為關閉。
  33. [r setVad:self.setVadFlag];
  34. r.delegate = self;
  35. r.cancelOnAppEntersBackground = YES;
  36. r.enableUserCancelCallback = YES;
  37. self.recognizer = r;
  38. NSString *nlsRequestJSONString = [NlsRequest getJSONStringfromNlsRequest:nlsRequest];
  39. NSLog(@"setupAsrIn : %@",nlsRequestJSONString);
  40. //開始語音識別
  41. [self.recognizer start];
  42. }
  43. - (void)onStopAsrButtonClick:(id)sender {
  44. //結束語音識別
  45. [self.recognizer stop];
  46. }
  47. #pragma mark - Notification Callbacks
  48. -(void)asrStatusChanged:(NSNotification*)notify{
  49. //處理網絡變化
  50. }
  51. #pragma mark - RecognizerDelegate
  52. -(void) recognizer:(NlsRecognizer *)recognizer didCompleteRecognizingWithResult:(NlsRecognizerResult*)result error:(NSError*)error{
  53. //處理識別結果和錯誤信息
  54. //若appkey為流式返回appkey,將會多次回調該方法
  55. }
  56. -(void) recognizer:(NlsRecognizer *)recognizer recordingWithVoiceVolume:(NSUInteger)voiceVolume{
  57. //處理音量變化
  58. }
  59. -(void) recognizerDidStartRecording:(NlsRecognizer *)recognizer{
  60. //處理開始識別事件
  61. }
  62. -(void) recognizerDidStopRecording:(NlsRecognizer *)recognizer{
  63. //處理結束識別事件
  64. }
  65. @end

FAQ

問題1 : bitcode。
  1. ld: 'xxx/NlsClientSDK.framework/NlsClientSDK(NlsRecognizer.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture arm64
  2. clang: error: linker command failed with exit code 1 (use -v to see invocation)
解決1 : 打開項目-targets-build settings-Enable Bitcode-設置為No。
問題2 : 數加驗證失敗4403。
  1. {
  2. NSLocalizedDescription = "server closed connection, code:4403, reason:Unauthorized AppKey [xxx], wasClean:1";
  3. }
解決2 : 檢查數加驗證的 ak_id 和 ak_secret 是否正確;檢查 appkey 填寫是否正確。
  1. #warning 請修改為您在阿裏雲申請的數字驗證串Authorize withSecret
  2. [nlsRequest Authorize:@"Access Key ID" withSecret:@"Access Key Secret"]; // requested Access Key ID和Access Key Secret
  1. #warning appkey請從 "快速開始" 幫助頁麵的appkey列表中獲取。
  2. [nlsRequest setAppkey:@"your_appkey"]; // requested
問題3 : Assertion failed。
解決3 : 檢查在開始語音識別前,是否注冊;檢查NlsRecognizer初始化時svcURL是否為nil。
  1. //Config appkey.
  2. [NlsRecognizer configure];
  1. NlsRecognizer *r = [[NlsRecognizer alloc] initWithNlsRequest:nlsRequest svcURL:nil];
問題4 : 錯誤碼4400。
  1. {
  2. NSLocalizedDescription = "server closed connection, code:4400, reason:illegal params, operation forbidden, wasClean:1";
  3. }
解決4 : 檢查appkey是否為空,填寫正確的appkey。
  1. #warning 請修改為您在阿裏雲申請的APP_KEY
  2. [nlsRequest setAppkey:@"your_appkey"]; // requested

最後更新:2016-12-08 11:07:23

  上一篇:go Android SDK__一句話識別_語音識別(ASR)_智能語音交互-阿裏雲
  下一篇:go OPUS格式語音編解碼__一句話識別_語音識別(ASR)_智能語音交互-阿裏雲