云信小课堂丨10分钟,快速集成 AI 互动数字人

77 阅读5分钟

近期,网易云信正式对外发布了基于 IM+AI、RTC+AI 底层技术的“融合通讯+AI”全新解决方案。

方案实现了将多种 AI 技术与社交场景进行深度融合,并将社交开场话术、聊天话题推荐、一键回复对话、交友技巧建议等多种 AI 功能融入到解决方案中。

同时,方案支持 AI 陪伴社交,AI 陪伴支持为动漫角色、小说等 IP 创建智能体,让每个角色都有其独特的性格和背景故事。

开发者只需要集中对应的 SDK,即可以为自己的应用接入信息秒回、不会失联、7×24h 情感陪伴随时提供情绪价值的虚拟数字人。

本文将以 iOS 集成的工程实现为例,采用“手把手”教学的方式,让开发者方便、快速地接入方案。

视频讲解

**,时长07:31

10 分钟视频详解,手把手教你接入

前期准备

  1. 登录网易云信官网yunxin.163.com/)注册云信账号;2. 登录网易云信后台创建账号和 App,获取 Appkey2. 通过服务端接口(163.lu/FfWJVb1)获取加… 房间的token。

新项目集成

1. pod引入需要的库创建一个新项目,在终端 cd 到项目目录下,执行 pod init 创建 podfile 文件,在 podfile 文件里面添加要引入的 NERtcSDK。pod 'NERtcSDK', '5.6.40'
2. 引入头文件,进行 SDK 初始化

#import <NERtcSDK/NERtcSDK.h>NERtcEngine *coreEngine = [NERtcEngine sharedEngine];NERtcEngineContext *context = [[NERtcEngineContext alloc] init];
// 设置通话相关信息的回调    context.engineDelegate = self;
// 设置当前应用的appKey#warning 这里输入appkey 加入房间可以随便输入房间id和uid    context.appKey = @"";
NERtcLogSetting *setting = [[NERtcLogSetting alloc] init];    setting.logLevel = kNERtcLogLevelInfo;    context.logSetting = setting;
    [coreEngine setupEngineWithContext:context];

3. 加入房间初始化之后,就可以加入 RTC 房间。

NSInteger req = [NERtcEngine.sharedEngine joinChannelWithToken:@"" channelName:self.ridTf.text myUid:self.uidTf.text.longLongValue completion:^(NSError * _Nullable error, uint64_t channelId, uint64_t elapesd, uint64_t uid) {
if (error) {NSLog(@"=== %@", error.localizedDescription);        }
NSLog(@"=== $加入房间结束");if (error) {NSLog(@"加入房间失败");        } else {NSLog(@"加入房间成功");        }
        weakSelf.cId = [NSNumber numberWithLongLong:channelId];
    }];

这里保存下加入房间之后的房间 id channelId,后续调用接口使 AI 虚拟人离开房间要用到这个参数。
4. 开启实时字幕调用 setParameters 方法开启实时字幕

NSMutableDictionary* params = [NSMutableDictionary dictionary];    [params setObject:@(YES) forKey:@"sdk.enable.asr.caption"];    [[NERtcEngine sharedEngine] setParameters:params];
    NSMutableDictionary* params1 = [NSMutableDictionary dictionary];    [params1 setObject:@"" forKey:@"sdk.private.api.request.asr.caption"];    [[NERtcEngine sharedEngine] setParameters:params1];

5.关闭实时字幕调用 setParameters 方法关闭实时字幕

NSMutableDictionary* params = [NSMutableDictionary dictionary];    [params setObject:@(NO) forKey:@"sdk.enable.asr.caption"];    [[NERtcEngine sharedEngine] setParameters:params];
    NSMutableDictionary* params1 = [NSMutableDictionary dictionary];    [params1 setObject:@"" forKey:@"sdk.private.api.request.asr.caption"];    [[NERtcEngine sharedEngine] setParameters:params1];

6.AI数字人加入房间通过请求服务端接口(doc.yunxin.163.com/nertc/serve… AI 数字人加入当前 RTC 房间,cname 传当前加入房间时候传的 cname。

- (void)joinRtcRoomTaskWithConfig:(NSDictionary *)config callback:(id<TaskCallback>)callback {// 设置请求 URLNSURL *url = [NSURL URLWithString:@"https://rtc-ai.netease.im/ai/task/create"];
// 构建请求体(JSON 格式)NSMutableDictionary *dataDict = [NSMutableDictionary dictionary];
    dataDict[@"llm"] = @{@"llmVendor": @2, @"role": @1, @"contextSize": @1};    dataDict[@"tts"] = @{@"ttsVendor": @4, @"language": @"Chinese", @"gender": @"Female"};    dataDict[@"asr"] = @{@"asrVendor": @1};
NSDictionary *requestBody = @{@"cname": @"1234567",@"taskType": @7,@"data": dataDict    };
NSError *error;NSData *jsonData = [NSJSONSerialization dataWithJSONObject:requestBody options:0 error:&error];
if (error) {if ([callback respondsToSelector:@selector(onError:)]) {            [callback onError:@"Error creating JSON body"];        }return;    }
// 创建请求NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];    [request setHTTPMethod:@"POST"];    [request setValue:@"自己的appkey" forHTTPHeaderField:@"AppKey"];    [request setValue:@"1234567" forHTTPHeaderField:@"Cname"];    [request setValue:@"123" forHTTPHeaderField:@"Uid"];    [request setValue:@"前期准备获取到的rtc房间token" forHTTPHeaderField:@"Token"];    [request setHTTPBody:jsonData];
// 创建会话并发送请求NSURLSession *session = [NSURLSession sharedSession];NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {if (error) {if ([callback respondsToSelector:@selector(onError:)]) {                [callback onError:error.localizedDescription];            }return;        }
// 解析响应数据NSError *jsonError;NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];
if (jsonError) {if ([callback respondsToSelector:@selector(onError:)]) {                [callback onError:@"Error parsing response"];            }return;        }
// 检查返回的 code 是否是 200NSInteger code = [jsonResponse[@"code"] integerValue];if (code == 200) {NSString *taskId = jsonResponse[@"result"][@"taskId"];if ([callback respondsToSelector:@selector(onSuccess:)]) {                [callback onSuccess:taskId];            }        } else {if ([callback respondsToSelector:@selector(onError:)]) {                [callback onError:[NSString stringWithFormat:@"Error: %@", jsonResponse[@"message"]]];            }        }    }];
// 启动请求    [dataTask resume];}

7.AI数字人离开房间通过请求服务端接口(doc.yunxin.163.com/nertc/serve… RTC 房间,cid 传当前加入房间时候返回的 channelId,taskId 传 AI 数字人加入当前房间接口返回的taskId。

- (void)leaveRtcRoomTaskWithConfig:(NSDictionary *)config callback:(id<TaskCallback>)callback {// 设置请求 URLNSURL *url = [NSURL URLWithString:@"https://rtc-ai.netease.im/ai/task/close"];
// 构建请求体(JSON 格式)NSMutableDictionary *requestBody = [NSMutableDictionary dictionary];    [requestBody setObject:config[@"cid"] forKey:@"cid"];    [requestBody setObject:@"自己的appkey" forKey:@"appkey"];    [requestBody setObject:config[@"taskId"] forKey:@"taskId"];    [requestBody setObject:@7 forKey:@"taskType"]; // 固定值 7
NSError *error;NSData *jsonData = [NSJSONSerialization dataWithJSONObject:requestBody options:0 error:&error];
if (error) {if ([callback respondsToSelector:@selector(onError:)]) {            [callback onError:@"Error creating JSON body"];        }return;    }
// 创建请求NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];    [request setHTTPMethod:@"POST"];    [request setValue:@"自己的appkey" forHTTPHeaderField:@"AppKey"];    [request setValue:@"1234567" forHTTPHeaderField:@"Cname"];    [request setValue:@"123" forHTTPHeaderField:@"Uid"];    [request setValue:@"前期准备获取到的rtc房间token" forHTTPHeaderField:@"Token"];    [request setHTTPBody:jsonData];
// 创建会话并发送请求NSURLSession *session = [NSURLSession sharedSession];NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {if (error) {if ([callback respondsToSelector:@selector(onError:)]) {                [callback onError:error.localizedDescription];            }return;        }
// 解析响应数据NSError *jsonError;NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];
if (jsonError) {if ([callback respondsToSelector:@selector(onError:)]) {                [callback onError:@"Error parsing response"];            }return;        }
// 检查返回的 code 是否是 200NSInteger code = [jsonResponse[@"code"] integerValue];if (code == 200) {//            NSString *message = @"Room task closed successfully.";//            if ([callback respondsToSelector:@selector(onSuccess:)]) {//                [callback onSuccess:message];//            }        } else {if ([callback respondsToSelector:@selector(onError:)]) {                [callback onError:[NSString stringWithFormat:@"Error: %@", jsonResponse[@"message"]]];            }        }    }];
// 启动请求    [dataTask resume];}

8.开启字幕和ai数字人加入的回调SDK 通过回调返回字幕开启状态和字幕内容以及 AI 数字人加入房间是否成功。

#pragma mark - NERtcEngineDelegateEx- (void)onNERtcEngineUserDidJoinWithUserID:(uint64_t)userID userName:(NSString *)userName joinExtraInfo:(nullable NERtcUserJoinExtraInfo *)joinExtraInfo{//AI 数字人加入房间}- (void)onNERtcEngineLabFeatureDidCallbackWithKey:(NSString *)key param:(id)param {if ([key isEqualToString:@"asr_caption_state"]) {// 开启/关闭字幕状态//解析 state 字段NSString* realParam = (NSString*)param;NSData* jsonData = [realParam dataUsingEncoding:NSUTF8StringEncoding];NSDictionary* asrStateData = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil];int state = [[asrStateData objectForKey:@"state"] intValue];// iOS 中可根据解析到的字段更新 UI 或逻辑处理if (state == 0) {//开启字幕失败NSLog(@"=== 开启字幕失败");        } else if (state == 1) {//关闭字幕失败NSLog(@"=== 关闭字幕失败");        } else if (state == 2) {//开启字幕成功NSLog(@"=== 开启字幕成功");        } else if (state == 3) {//关闭字幕成功NSLog(@"=== 关闭字幕成功");        }      }if ([key isEqualToString:@"asr_caption_result"]) {// 收到字幕消息NSString* realParam = (NSString*)param;NSData* jsonData = [realParam dataUsingEncoding:NSUTF8StringEncoding];NSArray* asrResultList = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil];for (NSDictionary* asrResult in asrResultList) {NSString* text = [asrResult objectForKey:@"content"];//此处可以根据解析的 content 进行页面展示NSLog(@"=== %@", text);        }      }}

9.自己离开房间

[NERtcEngine.sharedEngine leaveChannel];

以上就是本期《云信小课堂》全部内容,仅需按照以上步骤操作,即可快速集成属于你自己的AI互动数字人。目前,“融合通讯+AI”全新解决方案已经被广泛应用于社交互动企业会议虚拟主播语言学习游戏娱乐旅游文化推广领域。

立即体验:aigc.yunxin.163.com/?from=jj_wy…