基于 React + Vite + Three.js 的实时 3D 虚拟人前端,配套 FastAPI 后端,通过 WebSocket 与 DashScope Qwen Realtime 进行语音双向交互。
- 手势识别(挥手触发会话)
- 语音实时对话(PCM 直传)
- 3D 角色动画与表情驱动
- 会话自动结束(用户离开 / 静默)
- 前端:React、Vite、@react-three/fiber、Three.js、MediaPipe Tasks
- 后端:FastAPI、websockets、python-dotenv
- 语音模型:DashScope Qwen Realtime(WebSocket)
avatar1/
├─ backend/
│ ├─ .env # 后端环境变量(DashScope 等)
│ └─ main.py # FastAPI WS 中转服务
├─ public/
│ ├─ models/ # 3D 模型 + MediaPipe 任务模型
│ │ ├─ avatar.fbx
│ │ ├─ face_landmarker.task
│ │ └─ gesture_recognizer.task
│ └─ audios/
│ └─ mic-worklet.js # 录音 AudioWorklet
├─ src/
│ ├─ App.jsx # 主逻辑:会话、VAD、打断
│ ├─ Screen/AvatarView.jsx # 画布与全屏
│ ├─ components/
│ │ ├─ GestureDetector.jsx# 挥手 + 人脸/手 presence
│ │ └─ Avatar.jsx # 3D Avatar 组件
│ └─ audio/voiceWsClient.js# 采集/播放/WS 传输
└─ README.md
npm install
npm run dev默认开发端口:http://localhost:5173/
进入 backend/ 并安装依赖:
pip install fastapi uvicorn websockets python-dotenv启动服务(默认端口 8787):
uvicorn main:app --host 0.0.0.0 --port 8787仅后端需要环境变量。
DASHSCOPE_API_KEY=YOUR_DASHSCOPE_API_KEY
QWEN_RT_URL=wss://dashscope.aliyuncs.com/api-ws/v1/realtime
QWEN_MODEL=qwen3-omni-flash-realtime
QWEN_VOICE=Cherry
SYSTEM_PROMPT=你的系统提示词
QWEN_DEBUG=0说明:
DASHSCOPE_API_KEY:必填QWEN_RT_URL:可选,默认 DashScope 实时 WS 地址QWEN_MODEL/QWEN_VOICE:模型与音色SYSTEM_PROMPT:角色设定/口吻QWEN_DEBUG=1:打印调试日志
- 前端打开页面后,摄像头与麦克风权限允许
- 挥手识别成功后自动建立语音会话
- 前端将麦克风 PCM16(16k)通过 WS 发送到后端
- 后端转发到 DashScope Qwen Realtime,接收音频流并回传
- 用户离开(10s 未检测到人脸/手)或静默超时自动结束会话
- 后端 WS 地址:
src/App.jsx中的WS_URL - 3D 模型替换:
public/models/avatar.fbx - 手势模型:
public/models/gesture_recognizer.task - 人脸模型:
public/models/face_landmarker.task - 音频采集工作线程:
public/audios/mic-worklet.js
- 浏览器必须允许麦克风/摄像头访问
- 本地开发可用
http://localhost正常调用getUserMedia - 部署到线上时建议使用 HTTPS
Private / Internal