尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

如何读懂 Dograh WebRTC 信令:浏览器实时语音通话的完整技术解析

如何读懂 Dograh WebRTC 信令:浏览器实时语音通话的完整技术解析 如何读懂 Dograh WebRTC 信令浏览器实时语音通话的完整技术解析【免费下载链接】dograhOpen source voice AI platform. Self-hosted alternative to Vapi and Retell. On Prem, BYOK across Speech to Speech or LLM/STT/TTS, with a visual workflow builder, MCP native and telephony support.项目地址: https://gitcode.com/GitHub_Trending/do/dograhDograh 是一个开源、可自托管的语音 AI 平台其 WebRTC 信令signaling模块负责打通浏览器与服务器之间的实时语音通道点击开始测试按钮后几秒内你就能在浏览器里和 AI 语音助手对话。这篇文章带你用大白话看懂这套 Dograh WebRTC 信令协议、ICE 候选与 TURN 中继的完整实现即使你不是 WebRTC 专家也能掌握其工作原理。浏览器实时语音通话为什么需要信令WebRTC 让浏览器之间或浏览器与服务器之间直接传输音视频但它有个特点双方不能直接喊话需要先交换一套连接说明书包括SDP 描述我支持什么音频编码、采样率是多少ICE 候选地址我可以通过哪些 IP/端口被访问到直连还是走中继。负责传输这些说明书的辅助通道就是信令通道。Dograh 的选择是WebSocket JSON 消息核心实现在 api/routes/webrtc_signaling.py。选 WebSocket 而非 HTTP 请求是因为在多 Worker 部署下它天然是一条稳定的双向通道可以承载ICE 候选逐个滴灌trickling这种流式交换。一次通话的完整旅程从点击到接通前端逻辑集中在 useWebSocketRTC.tsx 这个 React Hook 中整个握手流程分为六步第 1 步获取限时 TURN 凭证。浏览器先请求后端/api/v1/turn/credentials实现见 api/routes/turn_credentials.py。凭证格式为过期时间戳:用户ID密码由共享密钥做 HMAC-SHA1 签名生成——每次通话都是新凭证到期自动失效比静态账号安全得多。第 2 步建立 WebSocket 信令连接。浏览器连接到/ws/signaling/{workflow_id}/{workflow_run_id}URL 中携带访问令牌完成身份认证。第 3 步创建 RTCPeerConnection 并打开麦克风。浏览器用 Web Crypto 生成一个随机pc_id作为这条 PeerConnection 的唯一标识配置好 STUN/TURN 服务器列表然后通过getUserMedia拿到麦克风音频轨。第 4 步发送 offer立即得到 answer。浏览器创建 SDP offer 后不等 ICE 收集完成就直接发送服务器端用 aiortc 框架创建对应的SmallWebRTCConnection回一个 answer。这一步叫ICE trickling候选滴灌——先接通骨架媒体地址后补。第 5 步双方逐个交换 ICE 候选。每发现一个可用的网络地址浏览器就发一条ice-candidate消息服务器同理。第 6 步语音管线启动。服务器确认 offer 合法后检查配额、并发上限、run 状态异步启动run_pipeline_smallwebrtc管线见 api/services/pipecat/run_pipeline.py把 STT → LLM → TTS 组件接到这条 WebRTC 传输上传输工厂在 api/services/pipecat/transport_setup.py。此刻起你的语音流正式进入 AI 流水线。信令协议详解WebSocket 上流动的 JSON 消息整个会话就靠几类 JSON 消息驱动理解了它们就理解了 Dograh 的 WebRTC 信令协议方向消息类型作用浏览器 → 服务器offer携带 SDP 与pc_id发起通话浏览器 → 服务器ice-candidate逐个推送 ICE 候选candidate为 null 表示结束浏览器 → 服务器renegotiate修改媒体参数或重启 ICE网络变化时服务器 → 浏览器answer回应 SDP同样可后续滴灌候选服务器 → 浏览器error配额不足、并发超限、run 已结束等业务错误服务器 → 浏览器call-ended通话被服务端结束附原因服务器 → 浏览器rtf-*系列实时反馈用户转写文本、机器人输出文本、工具调用起止、节点跳转、首字节延迟TTFB指标其中rtf-*real-time feedback系列特别巧妙信令通道不只用于握手通话全程还复用这条 WebSocket 向下推送转写文字和管线状态。前端据此渲染出边说边出字的对话流无需额外接口。服务器侧还有一个细节SignalingManager会为每条连接维护pc_id到 PeerConnection 的所有权映射任何 ICE 候选都必须来自主人自己那条 WebSocket防止跨会话串扰。ICE 候选与 TURN 中继音频到底走哪条路这是自托管部署中最容易踩坑的部分Dograh 在这里做了大量工程化处理1. 智能过滤候选地址。服务器按部署环境自动选择过滤策略NonRelayFilterPolicy本地开发 / 内网部署不过滤怎么快怎么来公网部署自动丢弃私有 IP 的 host 候选避免 coturn 报 denied-peer-ip 错误开启FORCE_TURN_RELAY诊断模式后强制所有流量走 TURN 中继用于验证 TURN 配置是否真正可用。2. 限时 TURN 凭证 coturn 配置。TURN 服务器使用标准的 REST API 认证模式配置模板见 config/coturn/turnserver.conf开启use-auth-secret、共享密钥static-auth-secret与后端TURN_SECRET环境变量一致、媒体端口范围限定在 49152–49200。浏览器侧则按环境智能排序 TURN URI 优先级生产环境优先 UDPmacOS Docker 环境优先 TCP。3. 通话结束的资源清理。WebSocket 断开时服务器会关闭其名下所有 PeerConnection、注销实时反馈发送器、释放并发槽位——避免多通话场景下的资源泄漏。两种入口平台内测试与第三方网站嵌入同一条信令管线服务于两种场景平台内测试/ws/signaling/{workflow_id}/{workflow_run_id}使用登录令牌认证并强制组织级并发控制公开嵌入/ws/public/signaling/{session_token}通过嵌入 token 签发的会话令牌认证额外校验令牌是否过期、run 模式是否为语音会话并对请求 Origin 做嵌入域名白名单校验——防止令牌泄露后被任意网站调用。这也意味着你的客户网站上嵌着一个语音助手按钮背后跑的正是同一套 WebSocket 信令 ICE trickling TURN 中继机制。关键文件速查模块路径WebRTC 信令主路由api/routes/webrtc_signaling.pyTURN 限时凭证api/routes/turn_credentials.pycoturn 服务配置config/coturn/turnserver.conf浏览器端 Hookui/src/app/workflow/[workflowId]/run/[runId]/hooks/useWebSocketRTC.tsxWebRTC 管线启动api/services/pipecat/run_pipeline.pyWebRTC 传输工厂api/services/pipecat/transport_setup.py一句话总结Dograh 的 WebRTC 信令 WebSocket JSON 协议offer/answer ICE 滴灌 实时反馈复用环境自适应的 ICE 过滤策略HMAC 签名的限时 TURN 凭证。三者配合让自托管的语音 AI 平台在浏览器里获得既低延迟又跨网络可靠的实时通话体验。【免费下载链接】dograhOpen source voice AI platform. Self-hosted alternative to Vapi and Retell. On Prem, BYOK across Speech to Speech or LLM/STT/TTS, with a visual workflow builder, MCP native and telephony support.项目地址: https://gitcode.com/GitHub_Trending/do/dograh创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表