Skip to content

Commit 8df11ea

Browse files
committed
update:优化目录结构
1 parent 4e58ba4 commit 8df11ea

26 files changed

+1487
-412
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
__pycache__
22
logs
33
/data
4+
*.log

Dockerfile

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,36 @@
1-
# 第一阶段:构建Python依赖
2-
FROM python:3.10-slim AS builder
1+
# 使用Python 3.9作为基础镜像
2+
FROM python:3.9-slim
33

4+
# 设置工作目录
45
WORKDIR /app
56

7+
# 安装系统依赖
8+
RUN apt-get update && apt-get install -y \
9+
gcc \
10+
g++ \
11+
libsndfile1 \
12+
libasound2-dev \
13+
portaudio19-dev \
14+
python3-dev \
15+
&& rm -rf /var/lib/apt/lists/*
16+
17+
# 复制依赖文件
618
COPY requirements.txt .
719

20+
# 安装Python依赖
821
RUN pip install --no-cache-dir -r requirements.txt
922

10-
# 第二阶段:生产镜像
11-
FROM python:3.10-slim
12-
13-
WORKDIR /app
14-
15-
# 安装系统依赖
16-
RUN apt-get update && \
17-
apt-get install -y --no-install-recommends libopus0 ffmpeg && \
18-
apt-get clean && \
19-
rm -rf /var/lib/apt/lists/*
20-
21-
# 复制Python依赖
22-
COPY --from=builder /usr/local/lib/python3.10/site-packages /usr/local/lib/python3.10/site-packages
23-
2423
# 复制应用代码
25-
COPY . .
24+
COPY app/ ./app/
25+
COPY data/ ./data/
26+
COPY start_server.py .
2627

2728
# 创建临时目录
28-
RUN mkdir -p /app/tmp
29+
RUN mkdir -p tmp
30+
31+
# 设置环境变量
32+
ENV PYTHONPATH=/app
33+
ENV PYTHONUNBUFFERED=1
2934

30-
# 启动应用
31-
CMD ["python", "app.py"]
35+
# 启动命令
36+
CMD ["python", "start_server.py"]

README.md

Lines changed: 219 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,80 +1,247 @@
1-
# voiceprint-api
1+
# 3D-Speaker 声纹识别API
22

3-
基于3D-Speaker的声纹识别API服务
3+
基于3D-Speaker模型的声纹识别服务,提供声纹注册、识别、删除等功能。
44

5-
## 项目简介
5+
## 🚀 新版本特性
66

7-
本项目是一个基于FastAPI开发的声纹识别HTTP服务,使用3D-Speaker模型实现声纹识别功能。支持声纹注册和识别功能,并提供完整的API文档。
7+
### 架构重构
8+
- **模块化设计**: 清晰的目录结构,便于维护和扩展
9+
- **高并发支持**: 使用gunicorn + gevent,支持高并发访问
10+
- **配置管理**: 统一的配置管理,支持环境变量和配置文件
11+
- **日志系统**: 完善的日志记录和监控
12+
- **错误处理**: 统一的异常处理和错误响应
813

9-
目前用于[xiaozhi-esp32-server](https://github.com/xinnan-tech/xiaozhi-esp32-server)项目,识别小智设备说话人
14+
### 性能优化
15+
- **连接池**: 数据库连接池,提高并发性能
16+
- **异步处理**: 支持异步音频处理
17+
- **内存管理**: 优化的内存使用和临时文件清理
18+
- **缓存策略**: 模型预加载,减少响应时间
1019

11-
## 主要功能
20+
## 📁 项目结构
1221

13-
1. 声纹注册
14-
- 输入:说话人ID和声音WAV文件
15-
- 输出:注册成功状态
22+
```
23+
voiceprint-api/
24+
├── app/ # 应用主目录
25+
│ ├── main.py # FastAPI应用入口
26+
│ ├── core/ # 核心模块
27+
│ │ ├── config.py # 配置管理
28+
│ │ ├── security.py # 安全认证
29+
│ │ └── logging.py # 日志配置
30+
│ ├── api/ # API模块
31+
│ │ ├── v1/ # API v1版本
32+
│ │ │ ├── endpoints/ # API端点
33+
│ │ │ │ ├── voiceprint.py # 声纹相关API
34+
│ │ │ │ └── health.py # 健康检查API
35+
│ │ │ └── api.py # API路由
36+
│ │ └── dependencies.py # API依赖
37+
│ ├── models/ # 数据模型
38+
│ │ └── voiceprint.py # 声纹数据模型
39+
│ ├── services/ # 业务服务
40+
│ │ └── voiceprint_service.py # 声纹识别服务
41+
│ ├── database/ # 数据库模块
42+
│ │ ├── connection.py # 数据库连接
43+
│ │ └── voiceprint_db.py # 声纹数据库操作
44+
│ └── utils/ # 工具模块
45+
│ └── audio_utils.py # 音频处理工具
46+
├── data/ # 配置文件
47+
│ └── .voiceprint.yaml # 主配置文件
48+
├── tmp/ # 临时文件目录
49+
├── start_server.py # 生产环境启动脚本
50+
├── requirements.txt # Python依赖
51+
├── Dockerfile # Docker配置
52+
└── README.md # 项目文档
53+
```
54+
55+
## 🛠️ 安装和配置
56+
57+
### 1. 环境要求
58+
- Python 3.9+
59+
- MySQL 5.7+
60+
- 至少4GB内存(用于模型加载)
1661

17-
2. 声纹识别
18-
- 输入:可能的说话人ID列表(逗号分隔)和声音WAV文件
19-
- 输出:识别到的说话人ID(未识别则返回空)
62+
### 2. 安装依赖
63+
```bash
64+
pip install -r requirements.txt
65+
```
2066

21-
## 技术栈
67+
### 3. 数据库配置
68+
创建MySQL数据库和表:
69+
```sql
70+
CREATE DATABASE voiceprint_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2271

23-
- FastAPI:Web框架
24-
- 3D-Speaker:声纹识别模型
25-
- MySQL:数据存储
72+
USE voiceprint_db;
2673

27-
## 安装说明
74+
CREATE TABLE voiceprints (
75+
id INT AUTO_INCREMENT PRIMARY KEY,
76+
speaker_id VARCHAR(255) NOT NULL UNIQUE,
77+
feature_vector LONGBLOB NOT NULL,
78+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
79+
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
80+
INDEX idx_speaker_id (speaker_id)
81+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
82+
```
2883

29-
1. 克隆项目
84+
### 4. 配置文件
85+
复制voiceprint.yaml到data目录,并编辑 `data/.voiceprint.yaml`
86+
```yaml
87+
mysql:
88+
host: "127.0.0.1"
89+
port: 3306
90+
user: "root"
91+
password: "your_password"
92+
database: "voiceprint_db"
93+
```
94+
95+
## 🚀 启动服务
96+
97+
### 开发环境
3098
```bash
31-
git clone https://github.com/xinnan-tech/voiceprint-api.git
32-
cd voiceprint-api
99+
python -m app.main
33100
```
34101

35-
2. 安装依赖
102+
### 生产环境
36103
```bash
37-
conda remove -n voiceprint-api --all -y
38-
conda create -n voiceprint-api python=3.11 -y
39-
conda activate voiceprint-api
104+
python start_server.py
105+
```
40106

41-
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
42-
pip install -r requirements.txt
107+
### Docker部署
108+
```bash
109+
docker build -t voiceprint-api .
110+
docker run -d -p 8005:8005 --name voiceprint-api voiceprint-api
43111
```
44112

45-
3. 配置数据库
46-
- 创建数据库
113+
## 📚 API文档
114+
115+
启动服务后,访问以下地址查看API文档:
116+
- Swagger UI: http://localhost:8005/docs
117+
- ReDoc: http://localhost:8005/redoc
118+
119+
### 主要API接口
120+
121+
#### 1. 声纹注册
122+
```http
123+
POST /api/v1/voiceprint/register
124+
Content-Type: multipart/form-data
125+
Authorization: Bearer <your_token>
126+
127+
speaker_id: user_001
128+
file: audio.wav
47129
```
48-
CREATE DATABASE voiceprint_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
130+
131+
#### 2. 声纹识别
132+
```http
133+
POST /api/v1/voiceprint/identify
134+
Content-Type: multipart/form-data
135+
Authorization: Bearer <your_token>
136+
137+
speaker_ids: user_001,user_002,user_003
138+
file: audio.wav
49139
```
50-
- 创建数据表
140+
141+
#### 3. 删除声纹
142+
```http
143+
DELETE /api/v1/voiceprint/{speaker_id}
144+
Authorization: Bearer <your_token>
51145
```
52-
CREATE TABLE voiceprints (
53-
id INT AUTO_INCREMENT PRIMARY KEY,
54-
speaker_id VARCHAR(50) UNIQUE,
55-
feature_vector LONGBLOB NOT NULL,
56-
INDEX idx_speaker_id (speaker_id)
57-
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
146+
147+
#### 4. 获取所有说话人
148+
```http
149+
GET /api/v1/voiceprint/speakers
150+
Authorization: Bearer <your_token>
58151
```
59-
- 复制 `voiceprint.yaml``data/.voiceprint.yaml`
60152

61-
4. 修改配置
62-
修改`data/.voiceprint.yaml`连接数据库的IP、用户名和密码
153+
#### 5. 健康检查
154+
```http
155+
GET /api/v1/health
63156
```
64-
mysql:
65-
database: voiceprint_db
66-
# 你的mysql所在的局域网ip
67-
host: "127.0.0.1"
68-
# 密码
69-
password: 123456
70-
# 端口
71-
port: 3306
72-
# 用户名
73-
user: root
157+
158+
## 🔧 高并发配置
159+
160+
### 1. 系统级优化
161+
```bash
162+
# 增加文件描述符限制
163+
echo "* soft nofile 65536" >> /etc/security/limits.conf
164+
echo "* hard nofile 65536" >> /etc/security/limits.conf
165+
166+
# 增加网络连接数
167+
echo "net.core.somaxconn = 65535" >> /etc/sysctl.conf
168+
sysctl -p
169+
```
170+
171+
### 2. 数据库优化
172+
```sql
173+
-- 增加连接数
174+
SET GLOBAL max_connections = 1000;
175+
SET GLOBAL innodb_buffer_pool_size = 1073741824; -- 1GB
74176
```
75177

178+
### 3. 应用级优化
179+
- 使用连接池管理数据库连接
180+
- 异步处理音频文件
181+
- 合理的超时设置
182+
- 内存监控和清理
183+
184+
## 📊 监控和日志
185+
186+
### 日志文件
187+
- 应用日志: `voiceprint_api.log`
188+
- 访问日志: stdout
189+
- 错误日志: stderr
190+
191+
### 监控指标
192+
- 请求响应时间
193+
- 并发连接数
194+
- 内存使用情况
195+
- 数据库连接状态
76196

77-
5. 启动
197+
## 🔒 安全特性
198+
199+
- API令牌认证
200+
- 文件类型验证
201+
- 音频文件大小限制
202+
- 临时文件自动清理
203+
- CORS配置
204+
205+
## 🐛 故障排除
206+
207+
### 常见问题
208+
209+
1. **模型加载失败**
210+
- 检查网络连接
211+
- 确保有足够的内存
212+
- 检查modelscope版本
213+
214+
2. **数据库连接失败**
215+
- 检查数据库配置
216+
- 确保数据库服务运行
217+
- 检查网络连接
218+
219+
3. **音频处理失败**
220+
- 检查音频文件格式
221+
- 确保音频文件完整
222+
- 检查磁盘空间
223+
224+
### 日志查看
225+
```bash
226+
# 查看应用日志
227+
tail -f voiceprint_api.log
228+
229+
# 查看Docker日志
230+
docker logs -f voiceprint-api
78231
```
79-
python app.py
80-
```
232+
233+
## 🤝 贡献指南
234+
235+
1. Fork 项目
236+
2. 创建功能分支
237+
3. 提交更改
238+
4. 推送到分支
239+
5. 创建 Pull Request
240+
241+
## 📄 许可证
242+
243+
本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情。
244+
245+
## 📞 联系方式
246+
247+
如有问题或建议,请提交 Issue 或联系开发团队。

0 commit comments

Comments
 (0)