近期,网易云信正式对外发布了基于 IM+AI、RTC+AI 底层技术的“融合通讯+AI”全新解决方案。
方案实现了将多种 AI 技术与社交场景进行深度融合,并将社交开场话术、聊天话题推荐、一键回复对话、交友技巧建议等多种 AI 功能融入到解决方案中。
同时,方案支持 AI 陪伴社交,AI 陪伴支持为动漫角色、小说等 IP 创建智能体,让每个角色都有其独特的性格和背景故事。
开发者只需要集中对应的 SDK,即可以为自己的应用接入信息秒回、不会失联、7×24h 情感陪伴、随时提供情绪价值的虚拟数字人。
本文将以 iOS 集成的工程实现为例,采用“手把手”教学的方式,让开发者方便、快速地接入方案。
视频讲解
**,时长07:31
10 分钟视频详解,手把手教你接入
前期准备
- 登录网易云信官网(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”全新解决方案已经被广泛应用于社交互动、企业会议、虚拟主播、语言学习、游戏娱乐和旅游文化推广领域。