3.4 KiB
3.4 KiB
3D 数字人语音聊天系统
这个项目提供一个浏览器侧渲染的 3D 数字人语音交互原型:
- 浏览器通过 WebRTC 上传麦克风音频,并接收服务端回传的 AI 语音。
- 浏览器通过 WebSocket 订阅字幕和口型/头部控制数据。
- 服务端执行 VAD -> ASR -> DeepSeek LLM -> TTS,并把音频特征转换为驱动 3D 数字人的控制帧。
当前形态更接近单机演示和研发验证环境,不是已经拆分完毕的生产化架构。
当前架构
语音链路:
Browser Mic
-> WebRTC audio upstream
-> FastAPI / aiortc
-> VAD
-> ASR
-> LLM
-> TTS
-> WebRTC audio downstream
-> browser audio playback
控制链路:
LLM reply text / TTS audio
-> AvatarService
-> /ws/animation
-> browser animation buffer
-> VRM or GLTF morph targets / head bones
字幕链路:
ASR text / LLM segmented reply
-> /ws/subtitles
-> browser message panel
关键目录
- main.py: FastAPI 入口,聚合 WebRTC、WebSocket、健康状态和文本对话接口。
- core/pipeline.py: 语音/文本对话流水线,负责 ASR、LLM、TTS 编排。
- core/state_machine.py: 简单会话状态机,处理用户说话、思考、数字人说话之间的切换。
- services/asr.py: ASR 封装,优先使用 FunASR,失败时进入降级模式。
- services/llm.py: 在线 LLM 封装,默认兼容 DeepSeek OpenAI-style API。
- services/tts.py: TTS 封装,优先使用 Kokoro,失败时返回静音兜底。
- services/vad.py: VAD 封装,基于 silero-vad。
- services/avatar.py: 把音频转换成 blendshape 和头部控制帧。
- web/app.js: 浏览器端 3D 舞台、WebRTC 建连、字幕和动画消费逻辑。
- scripts: 启动、证书生成、巡检和服务管理脚本。
快速启动
安装依赖:
pip install -r requirements.txt
准备环境变量,至少包括:
export LLM_API_KEY="..."
export LLM_BASE_URL="https://api.deepseek.com/v1"
export LLM_MODEL="deepseek-chat"
本地启动:
python main.py
或使用脚本:
bash scripts/start-public.sh
启动后访问:
http://127.0.0.1:8080/http://127.0.0.1:8080/health
如果浏览器与服务端跨机器访问,麦克风采集通常需要 HTTPS。可以先生成自签证书:
bash scripts/gen-self-signed-cert.sh
再在环境变量或 .env 中配置 SSL_CERTFILE 和 SSL_KEYFILE。
核心接口
GET /: 前端页面。POST /webrtc/offer: 建立 WebRTC 音频连接。POST /chat/text: 文本输入链路,跳过 ASR/VAD。POST /chat/reset: 清空上下文和运行时状态。GET /health: 返回后端运行指标和组件健康状态。GET /meta: 返回 STUN、HTTPS、端口和动画协议配置。GET /events: Server-Sent Events 运行状态流。WS /ws/subtitles: 字幕流。WS /ws/animation: 数字人控制流。GET /avatar/schema: 当前控制协议 schema。
后续开发建议
优先阅读 docs/development-guide.md。这个文档说明了:
- 语音与文本两条链路的完整时序。
- 前后端之间的协议约定。
- 当前实现的边界和适合继续扩展的位置。
- 已知的工程化约束。