Skip to content

prohan-git/douhua-server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

语音聊天服务(WebSocket版)

这是一个基于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                - 项目说明文档

功能特点

  1. 用户认证 - 完整的用户注册、登录功能
  2. 设备管理 - 支持设备注册和授权管理
  3. WebSocket通信 - 双向实时通信,支持PCM格式音频流
  4. 消息类型 - 支持不同类型的消息(语音、文本、状态、命令等)
  5. 状态管理 - 基于状态机的会话状态管理
  6. 语音处理 - 集成语音处理流程(VAD → ASR → LLM → TTS)
  7. 可扩展性 - 采用设计模式实现模型和参数的灵活配置
  8. 动态设置 - 支持通过API和WebSocket命令动态设置LLM模型和TTS角色

部署流程

环境要求

  • Python 3.8+
  • MongoDB 4.0+

安装步骤

方法一:使用Anaconda部署(推荐)

  1. 克隆代码库
git clone https://github.com/your-username/douhua-server.git
cd douhua-server
  1. 创建并激活Anaconda环境
# 创建环境
conda create -n douhua-server python=3.9

# 激活环境
conda activate douhua-server
  1. 安装依赖包
pip install -r requirements.txt

# 如果使用conda安装部分库会更稳定
conda install -c conda-forge pymongo
  1. 配置环境变量

创建.env文件并添加必要配置(下面有例子)

  1. 启动服务器
# 开发模式
python -m app.main

# 或者使用uvicorn
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload

方法二:使用Python虚拟环境

  1. 克隆代码库
git clone https://github.com/your-username/douhua-server.git
cd douhua-server
  1. 创建并激活虚拟环境
# 创建虚拟环境
python -m venv venv

# 激活虚拟环境(Windows)
venv\Scripts\activate

# 激活虚拟环境(Linux/Mac)
source venv/bin/activate
  1. 安装依赖包
pip install -r requirements.txt
  1. 配置环境变量

创建.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
  1. 启动服务器
# 开发模式
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文档

服务启动后,可访问以下地址查看API文档:

  • Swagger UI: http://localhost:8000/docs
  • ReDoc: http://localhost:8000/redoc

主要API端点

认证相关

  • 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 - 获取设备设置

WebSocket通信

客户端需要先通过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 - 发生错误

扩展开发

项目采用接口抽象和工厂模式设计,便于扩展:

  1. 要实现新的VAD检测算法,继承VADDetector接口并实现相应方法
  2. 要实现新的ASR服务,继承ASRProcessor接口并实现相应方法
  3. 要实现新的LLM模型,继承LLMGenerator接口并实现相应方法
  4. 要实现新的TTS服务,继承TTSSynthesizer接口并实现相应方法

添加新的LLM模型或TTS角色

  1. 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"]
}
  1. 在相应的服务实现中添加对新模型或角色的支持。

注意事项

  • 当前实现中的VAD、ASR、LLM和TTS服务均为模拟实现,生产环境应替换为实际的服务
  • 服务支持PCM格式音频流,如需支持其他格式需进行扩展
  • 生产环境部署时应配置更强的密钥和必要的安全措施
  • 如果使用Anaconda部署,注意某些包可能需要通过conda安装以获得更好的性能和兼容性

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages