WebRTC
- WebRTC为 Web 提供了强大的多媒体功能,包括支持音频和视频会议、文件交换、屏幕共享、身份管理以及与传统电话系统的接口
- RTC = Real-Time Communication(实时通信)
- RTC:WebRTC 底层主要基于 UDP。在语音通话中, 实时性 > 完整性。如果网络抖动丢失了 几个数据包,UDP 会直接丢弃(用戶只听到极其短暂的杂音),而不会像 TCP 那样重传导致后续 声音全部卡顿
- Socket/HTTP: 都是基于 TCP 的。TCP 必须保证数据包按顺序到达,一旦某个包丢了,后续所有包都要等待重传
RTC房间理解
- RTC是需要实时通信的用户共享一个房间
- 比如一个实时通信的房间,里面有一群人在互相通信,共用这个房间进行通信
注意什么时候需要创建用户独立的房间,取决于业务
- 用户之间需要互相通信、互相音视频对话,需要进同一个房间
- 每个用户的对话都是隔离的,不需要通信的,那么就需要创建独立的房间,每个用户对应一个独立房间
SFU架构理解
- SFU负责“音视频怎么传”
- SFU:Selective Forwarding Unit
- 选择性转发节点
- 收到一个用户的音视频流,然后根据需要转发给房间里的其他用户
RTC业务架构设计
- 前端职责
- 获取可用的设备,如麦克风、摄像头
- 拿到房间id,以及token,加入RTC房间
- 建立WebRTC连接
- 后端职责
- 创建RTC房间,生成房间id
- 通知Python Agent加入房间
- oken的颁发生成
- Token身份认证
- 用户权限
- 管理房间
- python-agent职责
- 拿到房间id,以及token,加入RTC房间
- 理解用户意图、思考、生成回复
- ASR:语音转文字生成
- TTS:文本转语音生成
- agent工具调用
- 如ASR -> LLM -> TTS
相关问题
- 多个用户共享一个房间通信,那么这些用户都是共享房间的token?
- 不是。多个用户共享同一个 RTC 房间, 共享的是RTC房间id(room id),token是用户的身份认证的状态,每个用户都是独立的token生成
- RTC的token身份认证作用
- 通过token身份认证,可以知道哪个用户进入这个房间
- 服务端进行判断用户身份、权限控制
- RTC房间的数据通信存储
- 文本聊天的数据放在业务数据库
- 音视频流,不需要存储
RTC全流程链路
前后端+python服务流程
- 前端申请设备权限(麦克风、摄像头),采集设备
- 前端拿到业务后端下发的RTC Token进去指定的RTC房间
- 用户进入房间后,通过 RTC 发布音频 Track 和视频 Track。
- 后端会进行会话记录,根据RTC房间id、用户id、identity身份表示
- 后端通知给 Python Agent 服务,拿到对应的房间号和token进去对应的RTC房间,通过订阅房间中的远程 Track
- 这里需要python agent提供启动服务的接口,给到业务后端调用
- 通过轨道Track,可以知道是谁发布的这个轨道,在回调中能拿到身份的标识identity,找到对应的用户
- 收到轨道Track之后,进行STT转换为文本处理给到LLM大模型,在通过TTS转换为语音,将语音发布到音频的轨道,用户侧能实时接收
- 对于 Audio Track:Agent 持续接收 AudioFrame → STT 转文本 → LLM 理解并生成回复 → TTS 转语音 → Agent 将生成的音频发布为 RTC Audio Track → 用户实时订阅并播放。
- 对于 Video Track:Agent 持续接收 VideoFrame → 抽帧 → CV / VLM 分析用户行为 → 判断异常行为 → 必要时生成提醒 → TTS → 发布 RTC Audio Track → 实时提醒用户。
1. 前端申请摄像头 / 麦克风权限
↓
2. 前端采集 Audio Track / Video Track
↓
3. 前端请求业务后端获取 RTC Token
↓
4. 用户使用 Token 加入指定 RTC Room
↓
5. 用户向 Room 发布:
- Microphone Track
- Camera Track
↓
6. 业务后端记录:
room_id + user_id + session_id
↓
7. Python agent获取自己的 Agent Token
↓
8. Python agent作为 Participant 加入同一个 Room
↓
9. Python agent订阅房间里的 Remote Track
↓
10. RTC SDK 持续把 AudioFrame / VideoFrame 推给 agent
↓
11. 根据 Participant.identity
判断 Track 属于哪个用户
↓
12. 分别进入音频、视频 AI Pipeline
消息队列优化
当多并发的情况下,可以引入消息队列
- 用户的发布的音视频track轨道,创建RTC,后端收到之后,创建会话记录,写入消息队列
- python worker不断读取队列,来消费这个队列,worker需要常驻在后台进程中
- worker每读取到一个消息,就会让Agent 加入 RTC 房间处理音视频流
RTC回调测试
问题:RTC云端服务器在火山引擎的机房里(公网环境),它需要POST请求到我们的 /api/chat_callback 接口。如果我们的服务跑在本地 localhost:3001 ,RTC云端根本访问不到。
- 可以通过内网穿透,使用Ngrok
RTC相关平台
- livekit
- 基于WebRTC的音视频的云服务RTC平台
- 支持js、python、go等等语言sdk
- 火山引擎实时音视频
- 腾讯云TRTC