这是一个基于WebSocket的语音聊天服务,支持用户注册、设备管理,以及语音对话功能。服务器端实现了完整的语音处理流程:语音活动检测(VAD)、语音识别(ASR)、大语言模型(LLM)处理和语音合成(TTS)。
项目采用清晰的模块化架构,遵循单一职责原则和最少知识原则,具有高内聚、低耦合的特点。
- API模块 - RESTful API接口,用于用户注册、登录和设备管理
- 认证模块 - 负责用户认证和JWT令牌管理
- WebSocket模块 - 实现设备和服务器之间的双向通信
- 状态机模块 - 管理会话状态流转
- 服务模块 - 包含VAD、ASR、LLM、TTS等语音处理服务
- 数据库模块 - MongoDB数据访问层
douhua-server/
├── app/
│ ├── api/ - API路由定义
│ ├── auth/ - 认证相关功能
│ ├── core/ - 核心功能和状态管理
│ │ ├── state_machine.py - 会话状态机
│ │ └── audio_pipeline.py- 音频处理管道
│ ├── database/ - 数据库连接和操作
│ ├── models/ - 数据模型定义
│ ├── services/ - 业务服务实现
│ │ ├── vad/ - 语音活动检测服务
│ │ ├── asr/ - 语音识别服务
│ │ ├── llm/ - 大语言模型服务
│ │ └── tts/ - 语音合成服务
│ ├── utils/ - 工具函数
│ ├── websocket/ - WebSocket处理
│ ├── __init__.py
│ └── main.py - 应用入口
├── configs/ - 配置文件
├── tests/ - 测试代码
├── .env - 环境变量(不提交到版本控制)
├── .gitignore - Git忽略文件
├── requirements.txt - 依赖包列表
└── README.md - 项目说明文档
- 用户认证 - 完整的用户注册、登录功能
- 设备管理 - 支持设备注册和授权管理
- WebSocket通信 - 双向实时通信,支持PCM格式音频流
- 消息类型 - 支持不同类型的消息(语音、文本、状态、命令等)
- 状态管理 - 基于状态机的会话状态管理
- 语音处理 - 集成语音处理流程(VAD → ASR → LLM → TTS)
- 可扩展性 - 采用设计模式实现模型和参数的灵活配置
- 动态设置 - 支持通过API和WebSocket命令动态设置LLM模型和TTS角色
- Python 3.8+
- MongoDB 4.0+
- 克隆代码库
git clone https://github.com/your-username/douhua-server.git
cd douhua-server
- 创建并激活Anaconda环境
# 创建环境
conda create -n douhua-server python=3.9
# 激活环境
conda activate douhua-server
- 安装依赖包
pip install -r requirements.txt
# 如果使用conda安装部分库会更稳定
conda install -c conda-forge pymongo
- 配置环境变量
创建.env
文件并添加必要配置(下面有例子)
- 启动服务器
# 开发模式
python -m app.main
# 或者使用uvicorn
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
- 克隆代码库
git clone https://github.com/your-username/douhua-server.git
cd douhua-server
- 创建并激活虚拟环境
# 创建虚拟环境
python -m venv venv
# 激活虚拟环境(Windows)
venv\Scripts\activate
# 激活虚拟环境(Linux/Mac)
source venv/bin/activate
- 安装依赖包
pip install -r requirements.txt
- 配置环境变量
创建.env
文件并添加如下配置(根据需要调整):
# MongoDB配置
MONGODB_URL=mongodb://localhost:27017
DB_NAME=voice_chat_db
# JWT配置
SECRET_KEY=your-secret-key-for-jwt
ACCESS_TOKEN_EXPIRE_MINUTES=60
# 服务器配置
HOST=0.0.0.0
PORT=8000
# VAD配置
VAD_THRESHOLD=0.5
VAD_FRAME_DURATION=30
# 默认模型配置
DEFAULT_LLM_MODEL=gpt-3.5-turbo
DEFAULT_TTS_VOICE=default
- 启动服务器
# 开发模式
python -m app.main
# 或者使用uvicorn
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
对于生产环境,建议使用Gunicorn和Nginx:
# 安装gunicorn
pip install gunicorn
# 启动服务
gunicorn app.main:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000
服务启动后,可访问以下地址查看API文档:
- Swagger UI:
http://localhost:8000/docs
- ReDoc:
http://localhost:8000/redoc
POST /api/auth/register
- 注册新用户POST /api/auth/login
- 用户登录POST /api/auth/token
- 获取访问令牌GET /api/auth/me
- 获取当前用户信息
GET /api/devices
- 获取所有设备POST /api/devices
- 注册新设备GET /api/devices/{device_id}
- 获取设备详情DELETE /api/devices/{device_id}
- 删除设备PATCH /api/devices/{device_id}/settings
- 更新设备设置(LLM模型和TTS角色)GET /api/devices/{device_id}/settings
- 获取设备设置
客户端需要先通过API获取设备令牌,然后使用该令牌建立WebSocket连接:
ws://localhost:8000/ws?token=your-device-token
{
"type": "audio",
"format": "pcm",
"sample_rate": 16000,
"data": "base64编码的音频数据"
}
{
"type": "text",
"text": "消息内容",
"source": "user"
}
{
"type": "status",
"status": "processing",
"details": {}
}
用于控制会话行为或设置参数:
{
"type": "command",
"command": "stop_listening",
"params": {}
}
支持的命令:
stop_listening
- 停止接收语音,开始处理当前音频reset
- 重置会话状态set_llm_model
- 设置LLM模型,例如:{"type": "command", "command": "set_llm_model", "params": {"model": "gpt-4"}}
set_tts_voice
- 设置TTS角色,例如:{"type": "command", "command": "set_tts_voice", "params": {"voice": "female"}}
get_settings
- 获取当前设置
会话状态会通过状态消息通知客户端:
idle
- 空闲状态,等待用户输入listening
- 正在接收语音processing
- 正在处理(ASR, LLM, TTS)speaking
- 正在播放合成的语音error
- 发生错误
项目采用接口抽象和工厂模式设计,便于扩展:
- 要实现新的VAD检测算法,继承
VADDetector
接口并实现相应方法 - 要实现新的ASR服务,继承
ASRProcessor
接口并实现相应方法 - 要实现新的LLM模型,继承
LLMGenerator
接口并实现相应方法 - 要实现新的TTS服务,继承
TTSSynthesizer
接口并实现相应方法
- 在
configs/config.py
中添加新的模型或角色名称:
LLM_MODELS = {
"default": "gpt-3.5-turbo",
"available": ["gpt-3.5-turbo", "gpt-4", "your-new-model"]
}
TTS_VOICES = {
"default": "default",
"available": ["default", "female", "male", "your-new-voice"]
}
- 在相应的服务实现中添加对新模型或角色的支持。
- 当前实现中的VAD、ASR、LLM和TTS服务均为模拟实现,生产环境应替换为实际的服务
- 服务支持PCM格式音频流,如需支持其他格式需进行扩展
- 生产环境部署时应配置更强的密钥和必要的安全措施
- 如果使用Anaconda部署,注意某些包可能需要通过conda安装以获得更好的性能和兼容性