demo.mp4
WebRTC AI Voice Agent 是一个面向实时语音交互场景的工程化示例项目,重点覆盖 WebRTC 媒体链路、会话编排、流式 AI 调用、工具调用以及业务闭环等关键能力。
项目当前以“电话预订酒店房间”作为首个垂直演示场景,用于验证实时语音 Agent 在以下方面的工程边界:
- 实时音频链路建立与控制
- 自定义信令协议设计
- DataChannel 控制面建模
- 流式 ASR / LLM / TTS 编排
- Tool Calling 驱动的业务事实获取
- Provider Adapter 插件式扩展
- 会话状态机、中断与结束控制
该项目既可作为实时语音 Agent 的技术样例,也可作为后续扩展至客服、前台、语音表单、硬件终端等场景的系统基础。
- 支持浏览器端麦克风音频采集
- 支持 Web 端
offer / answer / ice_candidate协商流程 - 支持 Bot 侧
PeerConnection建立与维护 - 支持音频媒体流与控制流分离
- 采用 WebSocket 作为信令传输通道
- 定义独立的会话创建与协商消息格式
- 明确
client / bot / signal三方职责边界 - 支持协议版本化与向后兼容扩展
- 使用
controlDataChannel 承载控制与状态事件 - 统一表达
session.* / turn.* / asr.* / llm.* / tts.*事件 - 支持联调、可视化和调试过程中的状态观测
- 支持
ASR final -> LLM stream -> punctuation boundary -> TTS的流式处理链路 - 支持 token/chunk 级别输出
- 支持句段级 TTS 合成与播放
- 支持回复链路的取消、中断和结束控制
- 定义统一的
ASRAdapter / LLMAdapter / TTSAdapter接口 - 支持 mock provider 与真实 provider 的替换
- 支持 OpenAI-compatible、讯飞、火山等 provider 接入
- 避免核心会话编排与单一供应商 SDK 耦合
- 通过
list_room_types查询结构化库存信息 - 通过
create_reservation执行预订写入 - 通过
end_call控制本轮回复完成后的会话结束 - 将业务事实读取与模型文本生成分离,降低幻觉风险
- 定义
created / negotiating / active / processing / responding / closing / closed等状态 - 将
interrupt建模为高优先级系统事件 - 支持 bot speaking、用户插话、turn cancel、会话结束等关键流程
- 支持“本轮播报完成后结束通话”的延迟结束策略
- 面向实时双工语音交互场景设计
- 采用服务端权威 turn 裁决模型
- 将媒体流、控制流和业务事实流分离建模
- 采用插件式 provider 扩展机制
- 支持垂直业务通过 tool 层接入
- 采用单机多进程边界划分,便于联调与后续扩展
系统采用单机多进程 monorepo 架构,主要模块如下:
apps/webWeb 客户端,负责麦克风采集、PeerConnection、DataChannel 与界面状态展示。cmd/signalSignaling 进程,负责鉴权、创建会话、SDP / ICE 中继以及 session 与 bot 路由。cmd/botBot 进程,负责 WebRTC 终端、音频接入、SessionTask 编排、工具调用与 provider 调度。internal/session会话生命周期管理与 turn 编排核心。internal/adaptersASR / LLM / TTS provider 的统一接入层。internal/hotel酒店库存与预订领域服务,作为演示场景中的业务事实源。
相关说明见 docs/architecture.md。
- Web 客户端调用 signal 创建 session。
- Web 与 bot 通过 signal 完成
offer / answer / ice_candidate协商。 - 浏览器麦克风音频通过 WebRTC 持续上行。
- Bot 接收音频并执行 endpointing、解码和 ASR。
ASR final结果触发 LLM 流式回复。- LLM 按需调用库存查询、预订和结束通话相关 tool。
- 回复文本按标点分段进入 TTS。
- TTS 音频通过 WebRTC 下行返回客户端。
- DataChannel 同步会话状态、turn 事件与调试信息。
- 服务端在用户插话或结束条件满足时执行统一状态裁决。
- Signaling 进程保持薄层路由职责,不承担会话级业务编排。
- Bot 进程负责实时音频处理、状态机执行与下游任务协调。
- DataChannel 作为控制面总线,不与媒体通道混用。
- Tool 层负责获取结构化业务事实,避免依赖 prompt 假设。
- Adapter 层负责隔离 provider 差异,降低核心模块耦合。
- 服务端负责最终的 interrupt、cancel、end 等状态裁决。
当前版本可视为项目 1.0,已具备以下能力:
- WebSocket signaling 与会话创建链路
- WebRTC 协商闭环
controlDataChannel 双向事件流- 服务端 endpointing placeholder
Opus -> PCM -> 16k mono -> ASR接线骨架ASR -> LLM -> TTS流式回复运行时- Provider Adapter 机制与真实 provider 接入
- 酒店库存查询、预订、结束通话 tool
- 酒店库存与预订展示页面
- SessionManager / SessionTask / response runtime 核心骨架
当前版本的重点在于建立清晰、可扩展、可验证的实时语音 Agent 工程边界。后续演进方向见 docs/roadmap.md。
- 后端:Go
- WebRTC:Pion
- 前端:TypeScript + React + Vite
- Signaling:WebSocket
- 控制面:DataChannel JSON
- Provider 接入:Adapter Pattern
- 本地开发方式:单机多进程
.
├── apps/
│ └── web/ # Web 客户端
├── cmd/
│ ├── bot/ # Bot 进程入口
│ └── signal/ # Signaling 进程入口
├── docs/ # 架构、协议、路线图、状态机等文档
├── internal/
│ ├── adapters/ # ASR / LLM / TTS provider adapters
│ ├── app/ # signal / bot 装配与 runtime
│ ├── audio/ # 音频解码与 PCM 流处理
│ ├── hotel/ # 酒店库存与预订领域服务
│ ├── protocol/ # signaling / datachannel 协议
│ └── session/ # SessionManager / SessionTask
├── scripts/ # 本地开发与检查脚本
└── tests/ # 测试与后续 e2e 扩展入口
当前默认本地组合:
- ASR: SenseVoice-Small(句级,sherpa-onnx sidecar)
- LLM: 豆包
doubao-1-5-lite(Ark 在线,流式) - TTS: sherpa-onnx 中文 VITS(
xiao_yaint8,轻量快)或macos-say
# 1) 复制并填写密钥(仓库已提供 .env.local 模板思路,见 .env.example)
cp .env.example .env.local
# 编辑 .env.local:填入 LLM_OPENAI_COMPAT_API_KEY 等
# 2) 安装本地 ASR 依赖(一次)
# 如遇 GitHub 网络问题:export all_proxy=http://127.0.0.1:7897
uv pip install --python ~/.venv/bin/python sherpa-onnx
./scripts/download-sensevoice-model.sh
# 3) 一键启动:local-asr + signal + bot + web
pnpm install
./scripts/dev-all.sh浏览器打开 http://localhost:5173,授权麦克风后开始通话。
默认端口:
- Signal:
:8080 - Bot:
:8081 - Local ASR:
:8091 - Local TTS:
:8092 - Web:
:5173
切换 TTS:
# 神经网络本地 TTS(默认)
TTS_PROVIDER=local-sherpa-tts
# 系统 TTS
TTS_PROVIDER=macos-saymake test-go
./scripts/dev-local-asr.sh # 当 ASR_PROVIDER=local-sensevoice
make run-signal
make run-bot或使用一键脚本启动多端:
./scripts/dev-all.shpnpm install
make run-web默认地址:
- Web:
http://localhost:5173
1.0完成实时语音 Agent 基础工程边界、核心链路与酒店演示页面。1.1完善语音质量、VAD、异常恢复与运行稳定性。1.2优化房型推荐、无房替代与端到端演示稳定性。2.0面向生产运行时补齐 TURN、多实例路由、追踪与容错能力。
详细规划见 docs/roadmap.md。
本项目的定位不是通用聊天演示页面,而是一个围绕实时语音交互构建的工程化 Agent 样例。其重点在于协议边界、状态机设计、流式链路编排、工具调用约束以及面向替换的系统扩展能力。