最近 Clubhouse 一码难求,获得众多互联网圈和投资圈人士的关注,一时之间风靡全球。
但受限于各方面原因,Clubhouse 目前还是存在很多限制,比如采用邀请机制、只能 iOS 用户下载以及国内 Apple 账号无法下载等。
就产品本身而言,作为一个初创的即时语聊产品,Clubhouse 也不可避免地存在如房间被动退出、语音延迟性等问题,而这也是国外用户反映普遍存在的问题。
尽管如此,Clubhouse 的突然火爆,还是让我们看到了即时语聊市场的庞大需求,声音社交仍有广泛的空间。
为了更快地帮助国内一些即将或者已经开始着手搭建即时语音聊天的企业了解 Clubhouse,抢占先机,本篇文章将从产品设计、技术实现以及在搭建中可能存在的技术难点几个维度,对 Clubhouse 进行全面的分析和解读。
只需五步,即可轻松构建本土「Clubhouse」!
架构设计
客户端组件: 封装实现客户端与应用服务 Clubhouse Server 的交互,封装实现与音视频的交互
网关代理: 应用服务的网关服务
Clubhouse Server: 仿 ClubHouse 应用服务
网易 G2 音视频 RTC 服务: 提供稳定流畅、搞品质、全平台的点对点和多人实时音视频通话服务,其中包括:
- 网易云信 IM SDK
- 网易云信 G2 SDK
架构图如下:
核心流程
分解一下需求,除去用户标签、房间标签和话题推荐,Clubhouse 的功能大概分为以下几个板块:
- 房间列表
- 创建/加入房间
- 管理员邀请用户
- 举手发言
- 离开房间
其中,整体的房间控制需要在网易云信 G2 音视频 SDK 的基础之上,借助服务端来控制;加入房间后的音视频能力,则直接由 SDK 提供;另外服务端通知则由网易云信 IM SDK 提供的长链接服务来负责传递。详细流程图如下:
第一步:获取房间列表
在这一步中,我们调用服务端接口获取到房间列表。
第二步:创建/加入房间
在这一步中,不论是创建房间还是加入房间,都会调用服务端提供的 /clubRoom/join 接口。在用户加入到 channelName 房间时,应用服务器会判断 channelName 是否存在。如果对应房间不存在,会创建一个房间并加入同时返回相应的房间信息;如果传入 channelName 存在,则用户直接加入该房间。当获取到服务端返回的房间信息时,再调用 G2 SDK 的加入房间 API joinChannelWithToken,真正加入音频房间。当加入房间成功后,G2 SDK 会抄送消息至应用服务器,更新用户在房间中的状态。
第三步:管理员邀请用户加入房间
当管理员点击邀请用户加入房间时,会先获取到好友列表,然后服务端生成一个短链返回到客户端。当被邀请者点击短链后,会自动加入房间。
第四步:举手发言
在这一步中,客户端会先调用/clubRoom/handsup接口,告诉服务端我想发言。然后,服务端通过云信 IM 提供的透传协议以及长链接将消息发送给房间管理员。管理员点击同意时,会调用管理员会控接/clubRoom/control/host更新成员音频状态为「发言状态」,同时应用服务器通过 IM 透传协议通知举手者音频已打开,此时举手者调用 G2 的 API enableLocalAudio 来开启麦克风。
第五步:离开房间
最后,当用户点击离开房间按钮后,直接调用 G2 SDK 的 leaveChannel 方法离开房间,此时,G2 会抄送用户离开消息至应用服务器,服务器标记该用户离开。
G2 SDK 详细说明
其中,G2 SDK 用到的方法的详细说明如下:
1. 导入类
在项目中导入 NERtcSDK 类:
#import <NERtcSDK/NERtcSDK.h>
2. 初始化
打开 App 后,先执行 - setupEngineWithContext: 方法完成初始化。
@interface Myapp ()<NERtcEngineDelegateEx>
...
NERtcEngine *coreEngine = [NERtcEngine sharedEngine];
NERtcEngineContext *context = [[NERtcEngineContext alloc] init];
// 设置通话相关信息的回调
context.engineDelegate = self;
// 设置当前应用的appKey
context.appKey = AppKey;
[coreEngine setupEngineWithContext:context];
...
3. 加入房间
加入房间前,请确保已完成初始化相关事项。
通过 – joinChannelWithToken:channelName:myUid:completion: 方法加入房间。
// 示例
[NERtcEngine.sharedEngine joinChannelWithToken:@""
channelName:roomId
myUid:userId
completion:^(NSError * _Nullable error, uint64_t channelId, uint64_t elapesd) {
if (error) {
//加入失败
} else {
//加入成功
}
}];
4. 退出通话房间
通过 leaveChannel 接口退出通话房间。
// 示例
// 退出通话房间
[NERtcEngine.sharedEngine leaveChannel];
NERtcEngineDelegate 提供 – onNERtcEngineDidLeaveChannelWithResult: 来监听当前用户退出房间的结果。
本土 Clubhouse 技术难点分析
1. 通用性技术难点与解决方案
- 问题描述
(1)弱网情况下的丢包问题
(2)设备适配问题
(3)音质问题
- 解决方案
(1)自研的网络引擎弱网算法,保证在80%丢包的传输场景下,音频也能进行正常通话,弱网优势更明显。
(2)针对超过数千款设备进行音质适配,保证回声抑制的效果在绝大多数机型上都有最优的表现。
(3)自研的音频AI降噪算法,可以针对嘈杂人声、键盘声等非稳态噪声进行定向降噪,提升对于环境稳态噪声的抑制能力,保留更纯粹人声。
2. 适用于国内的技术难题与解决方案
- 问题描述
(1)对于 Clubhouse 这一类声音社交的语音聊天室场景,场景中可能出现如暴恐、涉政、色情、广告等不可控违规内容。随着有关部门的监管力度不断增强,平台对于内容进行管控的工作成为了必要。
(2)实时音频场景下的内容审核,由于其场景实时进行的特殊性,对反垃圾服务也提出了较为严苛的要求。例如,审核结果必须足够实时,嘈杂场景下的音频采集不能严重影响检出率,高并发场景下需要做到快速响应不拥塞等等。
- 解决方案
云信针对该场景打磨除了一套完备的实时音频反垃圾服务,为客户的业务合规性保驾护航。该服务通过业内领先的语音识别技术,结合反垃圾文本过滤规则体系,精准、高效分析识别违规音频。此外,依托网易云计算资源,动态扩容,弹性伸缩,满足客户的涉黄、涉政、广告等其他多维度场景的高并发、高精准的反垃圾检测。
总结
按照如上五步,我们就可以基于网易云信提供的强大的基础能力,轻松快速地打造一个属于自己的「Clubhouse」,赶上风口,下一个致富的就是你!