如何构建一个类似Clubhouse的语音聊天应用 | 解决方案架构

10 分钟阅读
Feb 18, 2025

场景介绍

语音聊天室是一个在线互动社交的虚拟空间,采用纯音频格式。房间内通常有多个麦克风。主持人和连接的听众在麦克风上聊天,其他听众可以进入房间收听。不同类型的房间有不同数量的麦克风和最多听众数量。TRTC支持同时有50人聊天,麦克风之间的切换流畅,语音聊天延迟低于300毫秒,并支持变声、气氛音效、混响等音频效果,使语音聊天体验更加丰富。结合TRTC Chat,支持公开聊天、私聊、群聊、点赞、赠礼等多种消息互动形式,创造良好的互动体验。

Voice Chat Room Previews and In-Room Experience

* Voice chat room preview screen
* In-room chat interface
* Public chat room example

实现

通常,要实现完整的语音聊天室场景,涉及多个功能模块:房间管理、麦克风管理、音频流管理、录音与回顾等。各功能模块下的关键操作和功能点如以下表所示:

功能模块

关键操作和功能点

房间管理

房间列表、创建房间、加入房间、退出房间、销毁房间

麦克风管理

主动上麦、让某人上麦、主动离开麦、踢某人下麦、静音麦、锁定麦、移动麦克风

音频流管理

推拉流架构解决方案、实时流订阅模式

录音与回顾

TRTC云录音、天宇内容安全审查

聊天房间场景的整体业务架构如下图所示。房主创建一个房间,用户可以选择感兴趣的房间加入。进入房间后,用户可以使用麦克风与主持人进行互动。由于合规要求,房间内的语音内容需要被记录和审查。

Voice Chat Room Previews and In-Room Experience

* Overview of voice chat room functionality
* Preview screen with room name, type, and mode

房间管理

房间管理模块主要负责房间列表的维护,主要包括以下功能:

 创建房间:用户登录业务系统后,可以创建房间。创建房间后,需要将房间列表添加。

 加入房间:用户可以选择加入现有房间。加入房间后,需要添加当前房间人员列表。

 退出房间:用户可以选择退出当前房间。退出房间后,需要删除当前房间人员列表。

 销毁房间:所有用户退出房间后,需要销毁房间。销毁房间后,需要删除房间列表。

解决方案架构

在整个房间管理架构中,房间管理主要涉及三个模块:

  • 业务端房间管理:主要用于房间列表的维护和管理,如同步业务房间的属性和状态。功能包括房间列表查询、房间进出、房间创建和销毁。
  • 房间管理:主要用于房间成员列表、信令和消息交互,如批准/拒绝麦克风申请、带人上下麦、静音/解除静音麦克风,并按组维度区分,包括创建组、加入组、离开组、销毁组。
  • TRTC房间管理:主要用于音频流交互和传输,如发送和收听主持人/听众的声音/音乐,并按房间维度区分,包括进入和退出TRTC房间。

具体实施

在房间管理中,不同用户角色具有不同的功能权限和实施流程。语音聊天室中主要有两个角色:房主和听众。角色描述及其差异详见下表:

角色

角色描述

区别

房主

房间内最高权限的拥有者,可以创建或销毁房间。

 角色必须为主持人

 创建或销毁业务房间/RTC房间

听众

房间内的参与者,也可以上麦成为主持人。

 角色可以是听众/主持人

 进出房间

实施流程

房主

1. 获取房间列表。

2. 通过业务接口创建对应的房间。

3. 创建房间。

4. 进入业务房间/RTC房间并与他人互动。

5. 退出RTC房间/业务房间。

6.  销毁房间。

听众

1. 获取房间列表。

2. 进入业务房间/RTC房间并与他人互动。

3.  退出RTC房间/业务房间。

麦克风管理

语音聊天室中的麦克风通常是有序且有限的。例如,房间听众需要在获得房主的同意后才能依次上麦。房间内的麦克风数量通常不超过10个。麦克风管理主要负责根据业务场景定义房间内的麦克风数量,以及当前房间内所有麦克风的状态管理。

麦克风管理的主要功能包括:主动麦克风、让某人上麦、主动移除麦克风、踢某人下麦、静音麦克风、锁定麦克风、麦克风移动等。

 用户进入房间后,只有在有空闲麦克风时才能申请上麦。

 在房主同意用户上麦后,麦克风状态需要更改为非空闲状态。

 用户停止推流并下麦后,麦克风状态需要重置。

 房主有权锁定麦克风、邀请麦克风、强制下麦、静音麦克风等。

解决方案架构

以下是TRTC针对麦克风管理的解决方案架构介绍。在整个房间管理结构中,房主拥有最高权限,可以邀请人上麦/踢人下麦/静音和解锁麦克风音频/封禁和解禁麦克风。听众也可以申请上麦成为主持人与房间内其他主持人互动。

具体实施

在麦克风管理中,不同用户角色具有不同的功能权限和实施流程。主要有两个角色:主持人和听众。角色描述及其差异详见下表:

角色

描述

区别

房主

对所有麦克风位置拥有最高权限的人,负责所有麦克风位置的管理。所有麦克风位置在房主退房后会自动解散。

 角色必须为主持人

 主动上麦入房

 批准/拒绝麦克风申请

 让某人上下麦

 静音/解除静音麦克风音频

 封禁/解除封禁麦克风

听众

房间内的参与者可以通过打开和关闭麦克风进行互动。

 角色可以是听众/主持人

 申请上下麦

实施流程

房主

1. 主持人进入房间大厅,获取房间列表。

2. 主持人作为房主创建房间并加入房间。

3. 主持人依靠组属性获取麦克风列表并主动上麦。

4. 听众上麦。上麦后可以与其他用户互动。听众上麦有两种方式:听众主动申请上麦,主持人同意;主持人主动邀请听众上麦,听众同意。

5. 听众下麦。下麦有两种方式:听众主动下麦;主持人强制让听众下麦。

6. 主持人退出并销毁房间(房间解散,所有用户被强制下麦并退房)。

听众

1. 听众进入房间大厅,获取房间列表。

2. 听众选择并进入房间。

3. 听众根据组属性获取麦克风列表。

4. 听众申请上麦。主持人同意后,听众与其他用户互动。

5. 听众下麦并退出房间。

音频流管理

对于语音聊天互动场景,通常选择RTC流接入方案。接入简单快速,能够体验到实时互动的低延迟特性。如图所示,经典的实时互动语音聊天推拉流架构方案展示了两个角色:麦克风上的用户和麦克风外的听众。

在房间内的实时流订阅方面,TRTC提供两种订阅模式可供选择:自动订阅和手动订阅。

 自动订阅:用户进入房间后,将立即接收房间内的音视频流,音频会自动播放,视频开始解码。

 手动订阅:用户进入房间后,需要手动调用startRemoteView开始订阅和解码视频流,并需要手动调用muteRemoteAudio开始音频播放。

在大多数场景中, TRTC 默认使用自动订阅模式。用户进入房间后,将订阅房间内所有主播的音视频流,以获得更好的“二次开启体验”。手动订阅模式具有更好的灵活性和可定制性,用户可以选择性地订阅音视频流。

录音与回顾

如果需要在云中录制和存储媒体内容,或者需要对在线互动内容进行实时安全审查,可以及时控制非法聊天室,从而使在线社交平台更加规范化。

TRTC云录音

TRTC最新升级的云录音不依赖于云直播的能力,无需绕过和转发云直播,使用TRTC内部的实时录音集群进行音视频录制,提供更完整统一的录音体验。

 单流录音:通过TRTC的云录音功能,可以将房间内每个用户的音频流录制到单独的文件中。

 混合流录音:将同一房间内的音频媒体流混合成一个文件。

天宇内容安全审计

TRTC与T-Sec天宇合作,提供实时音视频内容识别和报警服务。在使用实时音视频服务时,支持全球自动或手动启动音视频内容识别和报警策略:

全球自动审计

客户可以指定审计策略和审计流类型。TRTC云自动完成应用下所有房间的音视频内容审计,并通过回调将违规信息发送至客户指定的回调URL,无需手动发起审计。此方法简单易用,节省了代码接入的工作量,但灵活性较差。

TRTC与天宇内容安全审计平台结合的实现原理如下图所示:实时内容安全以“哑终端”形式进入指定TRTC房间,拉取音视频流作为“观众”,对拉取的音视频流进行内容审计,然后通过回调将违规信息发送到用户指定的HTTP/HTTPS服务。

手动自定义审计

客户只需调用天宇音视频流接口即可实时检测音视频流中是否存在非法内容。音视频安全审计服务会通过回调将违规信息发送到客户指定的回调URL。这种方法更灵活,更具可定制性,但需要调用REST API来发起审计任务,具有一定的接入复杂性。

幽灵麦克风处理方案

幽灵麦克风,也称为炸麦克风或黑麦克风,指的是未在麦克风上发言的用户能发言,且其他用户能够听到该用户的声音。幽灵麦克风现象的根本原因是业务的麦克风状态与用户角色状态不一致。出现此问题可能有几种原因。

 听众离开麦克风并更新麦克风列表,但因为麦克风信息回调未到达或被拦截,导致听众未执行TRTC切换观众角色并在本地关闭麦克风,导致听众在麦克风下仍能说话。

 听众离开麦克风并更新麦克风列表,在收到麦克风信息回调后,未能在本地调用TRTC切换观众角色接口,导致听众在麦克风下仍能说话。

 App被暴力破解,导致UserSig被黑客拦截,从而使黑客能够随意进入TRTC房间并发言。

我们可以检测幽灵麦克风,主动识别并及时处理幽灵麦克风。以下介绍了客户端和服务器的幽灵麦克风检测和处理方案。

客户端处理方案

方案原理:通过TRTC音量回调,对比当前上行音频用户列表和业务麦克风状态列表,以识别未在麦克风上但有音频上行的幽灵麦克风。过程如下图所示。

当检测到幽灵麦克风时,客户端在本地静音用户的远程音频流,并报告给业务服务器。业务服务器可以决定是否禁止用户或将其踢出房间。

服务器端处理方案

方案原理:语音聊天互动场景中的用户角色分为主播和观众。只有主播角色可以上传本地音频,因此通过比较业务麦克风列表和TRTC用户角色列表来检测幽灵麦克风。

TRTC提供房间和媒体事件回调。在服务器端监控进入房间、切换角色、退出房间等事件,可以维护当前房间的实时主播列表。然后将TRTC实时主播列表与业务全麦克风列表进行比较,以便轻松检测和识别幽灵麦克风,并执行踢出房间或静音等操作。

1. 实时音视频TRTC控制台支持自定义回调信息配置。配置完成后,可以接收事件回调通知。

2. 接收并解析回调事件包,关注103/104/105事件,统计当前房间的实时在线主播角色用户列表

{
    "EventGroupId": 1, #房间事件组
    "EventType": 103, #房间进入事件
    "CallbackTs": 1687679847972, #回调时间,单位毫秒
    "EventInfo":     {
        "RoomId": "123456", #房间号
        "EventTs": 1687679847, #事件发生时间,单位秒
        "EventMsTs": 1687679847899, #事件发生时间,单位毫秒
        "UserId": "1a99b0a9", #用户名
        "Role": 20, #用户角色 20: 主播; 21: 观众
        "TerminalType": 2, #终端类型
        "UserType": 3, #用户类型
        "Reason": 1 #具体原因
    }
}

3. 最后,可以在特定时间(例如麦克风列表更改时)或通过周期性轮询比较每个房间的业务麦克风列表与TRTC实时主播列表,轻松识别幽灵麦克风,并进行禁言或踢出房间等操作。

防止上下麦延迟的解决方案

问题描述

由于移动设备的系统机制差异,语音聊天场景中上下麦的切换性能在Android和iOS之间不一致。在iOS侧切换麦克风时可能会出现短暂的音频冻结。

原因分析

这与iOS系统的音频机制有关。startLocalAudiostopLocalAudio操作获取和释放麦克风设备权限。SDK的音频重新采集导致AVAudioSession重新启动音频驱动,造成切换麦克风时短暂的音频冻结。

解决方案

常规TRTC方案切换上下麦的时机如下图所示。当切换角色时,开始或停止本地音频的采集和释放。这种方案在Android端可以正常使用。

在iOS端,可以在麦克风下麦操作时切换观众角色停止推流,而无需调用stopLocalAudio来停止音频采集和释放麦克风权限,以避免上下麦的延迟。

音频配置最佳实践

音质和音量类型是音频配置中的两个不同概念。在TRTC中,音质可以在启动本地音频采集和发布时设置,通过启动本地音频采集和发布,或通过setAudioQuality(TRTCAudioQuality)单独设置音质。音量类型由房间进入场景和音质设置等因素共同决定。此外,还可以通过setSystemVolumeType(TRTCSystemVolumeType)强制指定某种音量类型。

音质配置最佳实践

TRTC SDK目前提供三种精心调整的音质模式,以满足各种垂直场景对音质的不同追求。

音质模式

音质枚举值

音质参数

音质描述

人声模式

TRTCAudioQualitySpeech

采样率:16k;单声道;

编码率:16kbps

在弱网络环境下具有强大的网络抗干扰能力和良好的流畅性,适合以人声沟通为主的应用场景,如在线会议、语音通话等。

默认模式

TRTCAudioQualityDefault

采样率:48k;单声道;

编码率:50kbps

SDK默认模式在音乐还原方面优于人声模式,同时,传输的数据量远低于音乐模式,对各种场景具有良好的适应性。

音乐模式

TRTCAudioQualityMusic

采样率:48k;全频带立体声;

编码率:128kbps

在此模式下,传输的音频数据量非常大,确保音乐信号在所有频段中都能达到高保真细节还原,适合对高保真音乐传输有要求的场景。

从上表可以看出,音质效果从人声模式到音乐模式逐步提高,但传输的音频数据量也相应增加。

 在语音聊天室场景中,建议使用人声模式进行纯人声交流,在弱网络条件下能够实现更好的流畅性;

 对于需要播放背景音乐的语音聊天室,建议使用默认模式或音乐模式,以获得良好的音频细节还原;

 考虑到下游听众的网络带宽压力,为确保良好的用户体验,建议在麦克风数量超过十个的商业场景中谨慎使用音乐模式。

音量类型配置最佳实践

TRTC SDK目前提供三种系统音量类型控制模式,以满足不同场景对音量类型的差异化需求。

音量类型模式

音量类型模式枚举值

音量类型模式描述

全通话音量

TRTCSystemVolumeTypeVOIP

此方案的优势在于,用户在切换麦克风时,音频模块无需切换工作模式,可以实现无缝切换,适合用户需要频繁切换麦克风的应用场景。如果进入房间时选择的场景为TRTCAppSceneVideoCall或TRTCAppSceneAudioCall,SDK会自动使用此模式。

自动切换模式

TRTCSystemVolumeTypeAuto

也称为“通话时麦克风开,媒体时麦克风关”,即在主持人上麦时使用通话音量,在观众不在麦克风时使用媒体音量,适合在线直播场景。如果进入房间时选择的场景为TRTCAppSceneLIVE或TRTCAppSceneVoiceChatRoom,SDK会自动使用此模式。

全媒体音量

TRTCSystemVolumeTypeMedia

整个通话过程中使用媒体音量,适合对音质要求严格的音乐场景。如果大多数用户使用外部设备(如外置声卡),可以使用此模式。

 在通话场景中,建议使用默认全通话音量,此时音频模块无需切换;

 在语音聊天室场景中,建议使用默认自动切换模式进行纯人声交流,即麦克风开启为通话,麦克风关闭为媒体;

 在需要播放背景音乐的语音聊天室中,可以考虑设置全媒体音量,以避免用户在麦克风开关时感受到远程音乐的冻结和音量的突然变化。

单流音量评估

在聊天室场景中,一些客户可能选择推拉RTC单流以减少带宽和节省成本,观众将在房间中拉取混合流。然而,聊天房间场景通常要求根据麦克风上用户的音量在UI上进行相应提示,例如“声波图”或“音量条”。单通道音频的音量评估反馈功能在TRTC房间中容易实现,但在纯音频混合流中则需要一些特殊方法来实现。以下将介绍这两种解决方案的具体实施。

RTC房间中的单流音量评估

步骤1:启用音量提示

通过enableAudioVolumeEvaluation接口启用音量回调,并可选启用本地语音检测功能。启用此功能后,SDK将反馈本地用户和远程推流用户的音量、最大音量值以及本地语音检测结果,在onUserVoiceVolume回调中返回。

步骤2:监听音量回调

TRTCCloudListener中监听onUserVoiceVolume回调。该回调将提供本地用户和远程流用户的音量反馈,以及远程用户的最大音量。您可以根据音量在UI上显示相应的声波。

纯音频混合流单流音量评估

纯音频混合流的单流音量评估实施过程如上图所示。麦克风上的主持人需要监控音量回调,判断本地音量和远程音量,将本地音量值和用户信息以SEI消息的形式插入音频流中,然后在混合流后透明传输给观众。或者房主可以通过SEI将所有麦克风上的主持人的回调音量值发送。

如下图所示,观众端将显示从混合流解析出的SEI消息中的相应发言者音量。

最佳语音聊天室用例

作为云端实时音视频通话服务的提供商, 腾讯RTC已使客户能够推出创新的 语音聊天产品。以下是一些在全球范围内引起共鸣的流行社交音频用例:

a. 语音聊天室 + 迷你游戏

将语音聊天室与游戏结合,通过整合互动游戏元素提升平台的社交属性,带来新的综合玩法,解决破冰挑战,从而增加连接麦克风时间的持续性。

不仅用作大型多人游戏(如大逃杀)的语音工具,还常用于诸如谋杀之谜、真心话大冒险和乒乓球等在线迷你游戏。用户通过语音轮换参与游戏接力,增强游戏的乐趣和互动性。

b. 语音广播电台

语音广播是一种流行的社交音频功能。主持人可以向语音广播电台的听众广播实时音频流,并邀请某些听众(通常是付费用户或发送虚拟礼物的用户)参与对话。主持人创建内容,如讨论时事、播放音乐、讲故事或进行采访,并进行直播。除了单向广播,主持人还可以邀请观众参与实时讨论,增强节目的互动性和参与感。

c. 卡拉OK

除了基本的语音聊天,用户还可以在与在线KTV结合的语音聊天室中进行卡拉OK式的互动。主持人可以为互动语音聊天播放背景音乐,常用于音乐房间、学习房间或听歌房间。此外,用户可以通过选择歌曲来创建播放列表进行独唱,歌手现场演唱,而其他人则参与文本聊天并发送礼物。

d. 语音聊天室 + 头像

在传统的语音聊天室中,仅通过声音进行沟通,整合头像允许传递更多信息,如用户图像、表情和手势,提供一种面对面的沟通体验,而无需展示真实面孔。这有助于打破僵局,加深用户关系,同时通过3D礼物和虚拟背景进一步丰富体验。

结论

语音聊天房间的多样性和创新已经重新定义了数字通信。从亲密的聊天到热闹的小组讨论,再到语音广播和卡拉OK,它们通过创新的娱乐方式促进了全球连接和丰富的在线体验。随着技术的不断进步,我们期待语音聊天房间有更多创意的应用案例。

想要建立类似的应用或平台吗?现在就获取你的免费10,000分钟

免费开始

如果你有任何问题或需要在线帮助,我们的支持团队随时准备为您服务。请随时联系我们,或者加入我们的 Telegram Discord。对于技术问题,你也可以直接在 Stack Overflow 寻求帮助。