# 硅基Duix-SDK(1.0.0)使⽤⽂档

# ⼀. 物料准备

GJDigitalSDK.framework、WebRTC.framework 下载:下载Demo

# ⼆. 开发环境

开发⼯具: Xcode

# 三. sdk引⽤(参照GJDigitalSDKDemo)

  1. 将 GJDigitalSDK.framework和webrtc⽂件拖拽至工程的资源目录下: 工程-General-Frameworks,Libraries,and Embedded Content中的以下framework
GJDigitalSDK.framework 
WebRTC.framework 

改为Embed & Sign

  1. Info.plist文件中添加录音权限和本地网络权限
<key>NSLocalNetworkUsageDescription</key>
<string>获取本地网络权限</string>
<key>NSMicrophoneUsageDescription</key>
<string>需要录音权限来语音识别</string>
<key>NSCameraUsageDescription</key>
<string>需要相机权限</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>需要相机权限保存图片到相册</string>

# SDK关键接口

/*
* SDK初始化
* - Parameters:
*   - appId: appId
*   - appKey: appkey
*   - block: 回调初始化成功-执行toStart
*/
- (void)initWithAppId:(NSString *)appId appKey:(NSString *)appKey block:(void (^) (BOOL isSuccee, NSString *errorMsg))block;


/*
* 开始初始化通讯并且是否开启本地摄像头
*/
-(void)toStart;

/*
* 结束通讯
*/
-(void)toStop;

/*
* 客户端控制开启、关闭asr识别
* isOpen yes:打开,no:关闭
*/
- (void)changeAsrEvent:(BOOL)isOpenAsr;

/*
*给中控发送文本
* @param content 文本内容
* @param interrupt 是否打断上一句
*/
- (void)commandEvent:(NSString *)content interrupt:(BOOL)interrupt;

/*
*发送说话内容给中控
* @param content 文本内容
* @param wavPath 音频地址
* @param interrupt 是否打断上一句
*/
- (void)commandEvent:(NSString *)content wavPath:(NSString *)wavPath interrupt:(BOOL)interrupt;

# SDK代理

@protocol DigitalViewDelegate <NSObject>
@optional
/*
*错误信息返回码
*/
- (void)onError:(NSInteger)errorCode errorMsg:(NSString *)errorMsg;

/*
*远程视频通讯完成
*/
- (void)onRTCReomteSuccess;

/*
*中控获取到渲染端信息后通知客户端
*@param ID id
*@param name name
*/
- (void)onRender:(NSString *)ID name:(NSString *)name;

/*
*识别出来的asr数据 vad 开始信息和结束信息
*@param asrText asr识别文本
*@param vad vad[@"state"] 1开始播放 0播放结束
*/
-(void)detectedSpeech:(NSString*)asrText vad:(NSDictionary *)vad;

/*
*一句话开始播放和停止播放状态
*dic[@"state"] == playStart  开始播放, ==playStop 播放结束
*dic[@"content"] 播放文本
*/
-(void)playState:(NSDictionary *)dic;

/*
*播放异常 可重试播放或终止
*/
- (void)playException:(NSString *)wavUrl content:(NSString *)content;

/*
*webrtc连接状态回调
*@param state RTCIceConnectionState
*/
- (void)didIceConnectionChange:(RTCIceConnectionState)state;

/*
*中控结束通话,发送bye事件
*/
- (void)onByeBye;

/*
*是否成功加载数字人
*/
- (void)onVideoShow:(BOOL)isSuccess :(float)progress;

/*
*获取本地视频的视频流
*/
- (void)capturer:(RTCVideoCapturer *)capturer didCaptureVideoFrame:(RTCVideoFrame *)frame;

/*
   提问后获取答案成功
   - Parameters:
   - answerStr: 答案
   - filePath: filepath
*/
- (void)answerWithAnserStr:(NSString *)answerStr filePath:(NSString *)filePath;

/*      
   提问后获取答案失败
   - Parameters:
   - errorMsg: 错误
*/
- (void)answerWithErrorMsg:(NSString *)errorMsg;

@end

# 模块使⽤ 代码样例

详细⻅Demo终代码,:

//初始化
[[GJAccess manager] getCamerapermissions:^(bool isPermis) {
    if (isPermis)  {
        [DigitalConfig shareConfig].conversationId = conversationId;
        [[DigitalManager manager] initWithAppId:appId appKey:appKey block:^(BOOL isSuccee, NSString *errorMsg) {
           if (isSuccee) {
               [[DigitalManager manager] toStart];
            } else {
                NSLog(@"errorMsg==%@",errorMsg);
             }
         }];
    }
}];

//提问
- (void)startQuestion:(NSString *)userQuestion {
    
    [[DigitalManager manager] questionCommandEvent:userQuestion userId:@"123"];
}



//给中控发送文本&语音
- (void)vcCommandEvent:(NSString *)content wavPath:(NSString *)wavPath interrupt:(BOOL)interrupt {
    
    [[DigitalManager manager] commandEvent:content wavPath:wavPath interrupt:interrupt];
}

#pragma mark -DigitalViewDelegate
//问题回答
- (void)answerWithQuestion:(NSString *)question anserStr:(NSString *)answerStr filePath:(NSString *)filePath errorMsg:(NSString *)errorMsg {
    
    if (errorMsg.length == 0) {
        [self vcCommandEvent:answerStr wavPath:filePath interrupt:YES];
    }
}


/// 错误信息返回
- (void)onError:(NSInteger)error_code errorMsg:(NSString *)errorMsg {
    
    if (error_code == 50001) {
        //错误或者空的appId
    } else if (error_code == 50002) {
        //资源检查失败,请联系管理员
    } else if (error_code == 50003) {
        //资源占用中,请检查后再试~
    } else if (error_code == 50004) {
        //human请求超时~
    } else if (error_code == 50005) {
        //从资源组中获取资源异常
    } else if (error_code == 50006) {
        //签名失败
    } else if (error_code == 50007) {
        //资源总并发不足,请检查后再试~
    }  else if (error_code == 50009) {
        //资源超时或未配置~
    }
    NSLog(@"errorMsg==%@",errorMsg);

}

///识别出来的asr内容
- (void)detectedSpeech:(NSString*)asrText vad:(NSDictionary *)vad {
    
    if (vad.count > 0) {
        return;
    }
    if (asrText.length == 0) {
        return;
    }
    [self startQuestion:asrText];

}

/// 显示视频是否加载完成
- (void)onVideoShow:(BOOL)isSuccess progress:(float)progress {
    if (isSuccess) {
        
    } else {
        //可做加载进度
    }
}

- (void)playState:(NSDictionary *)dic {
    NSString * state=dic[@"state"];
    if ([state isEqualToString:@"playStart"]) {
        NSLog(@"一句话开始播放");
    } else if([state isEqualToString:@"playStop"]) {
        NSLog(@"一句话结束播放");
    }
}