跳到主要内容

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 → 实时提醒用户。
text
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