# 硅基Duix-SDK使⽤⽂档

更新时间:2024年3月12日

本文介绍如何使用SAAS DUIX iOS SDK,包括安装下载,关键接口及其代码示例。

# 物料准备

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

# 开发环境

开发⼯具: Xcode

# 快速开始

    [[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);
                }
            }];
        }
    }];

# 调用流程

1.启动DUIX服务前需要准备好授权的appId,appKey,conversationId;
2.授权麦克风权限、相机权限;
3.init初始化数字人渲染,ASR及对话交互服务,开始初始化通讯;
4.根据需要是否打开麦克风-(void)setMute:(BOOL)isEnabled;
5.asr语音识别说话内容并调用问答接口- (void)questionCommandEvent:(NSString *)content userId:(NSString *)userId;
6.给中控发送答案文本和音频地址,是否中断上一句话- (void)commandEvent:(NSString *)content wavPath:(NSString *)wavPath interrupt:(BOOL)interrupt;
7.打断数字人播报- (void)toBreakDigital;
8.结束通讯-(void)toStop。

# 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>

# 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(@"一句话结束播放");
    }
}

# 常见错误

错误码 说明
-1 客户端网络请求异常
-2 客户端接口请求http状态码异常。
-3 客户端获取DUIX资源异常
-4 客户端MQTT连接失败
-5 客户端WebRTC的SDP创建失败,一般为iceServer异常。
-6 客户端WebRTC的SDP设置失败,一般为iceServer异常。
-7 客户端会话交互异常,常见的有鉴权失败、ASR资源启动失败等。
1005 服务端token不能为空
1006 服务端toke失效
1007 服务端话术信息不存在
1009 服务端用户可用次数不足
2002 服务端会话信息不存在
40001 服务端appid或者appscrect无效
40002 服务端内部错误
50001 错误或者空的appId
50002 资源检查失败,请联系管理员
50003 资源占用中,请检查后再试~
50004 human请求超时~
50005 从资源组中获取资源异常
50006 签名失败
50007 资源总并发不足,请检查后再试~
50009 资源超时或未配置~