Skip to content

Commit a8341a4

Browse files
committed
update:增加环节耗时统计,调试响应速度
1 parent 5f0fe1c commit a8341a4

File tree

5 files changed

+185
-15
lines changed

5 files changed

+185
-15
lines changed

app/api/v1/health.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from fastapi import APIRouter, HTTPException, Query
2+
import time
23
from ...services.voiceprint_service import voiceprint_service
34
from ...core.logging import get_logger
45
from ...core.config import settings
@@ -29,14 +30,28 @@ async def health_check(
2930
Raises:
3031
HTTPException: 当密钥不正确时返回401错误
3132
"""
33+
start_time = time.time()
34+
logger.info("收到健康检查请求")
35+
3236
# 验证密钥
37+
key_check_start = time.time()
3338
if key != settings.api_token:
3439
logger.warning(f"健康检查接口收到无效密钥: {key}")
3540
raise HTTPException(status_code=401, detail="密钥验证失败")
41+
key_check_time = time.time() - key_check_start
42+
logger.info(f"密钥验证完成,耗时: {key_check_time:.3f}秒")
3643

3744
try:
45+
count_start = time.time()
46+
logger.info("开始获取声纹统计信息...")
3847
count = voiceprint_service.get_voiceprint_count()
48+
count_time = time.time() - count_start
49+
logger.info(f"声纹统计信息获取完成,总数: {count},耗时: {count_time:.3f}秒")
50+
51+
total_time = time.time() - start_time
52+
logger.info(f"健康检查请求完成,总耗时: {total_time:.3f}秒")
3953
return {"total_voiceprints": count, "status": "healthy"}
4054
except Exception as e:
41-
logger.error(f"获取统计信息异常: {e}")
55+
total_time = time.time() - start_time
56+
logger.error(f"获取统计信息异常,总耗时: {total_time:.3f}秒,错误: {e}")
4257
raise HTTPException(status_code=500, detail=f"获取统计信息失败: {str(e)}")

app/api/v1/voiceprint.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from fastapi import APIRouter, File, UploadFile, Form, HTTPException, Depends
22
from fastapi.security import HTTPBearer
33
from typing import List
4+
import time
45
from ...models.voiceprint import VoiceprintRegisterResponse, VoiceprintIdentifyResponse
56
from ...services.voiceprint_service import voiceprint_service
67
from ...api.dependencies import AuthorizationToken
@@ -83,30 +84,58 @@ async def identify_voiceprint(
8384
Returns:
8485
VoiceprintIdentifyResponse: 识别结果
8586
"""
87+
start_time = time.time()
88+
logger.info(f"开始声纹识别请求 - 候选说话人: {speaker_ids}, 文件: {file.filename}")
89+
8690
try:
8791
# 验证文件类型
92+
validation_start = time.time()
8893
if not file.filename.lower().endswith(".wav"):
8994
raise HTTPException(status_code=400, detail="只支持WAV格式音频文件")
95+
validation_time = time.time() - validation_start
96+
logger.info(f"文件类型验证完成,耗时: {validation_time:.3f}秒")
9097

9198
# 解析候选说话人ID
99+
parse_start = time.time()
92100
candidate_ids = [x.strip() for x in speaker_ids.split(",") if x.strip()]
93101
if not candidate_ids:
94102
raise HTTPException(status_code=400, detail="候选说话人ID不能为空")
103+
parse_time = time.time() - parse_start
104+
logger.info(
105+
f"候选说话人ID解析完成,共{len(candidate_ids)}个,耗时: {parse_time:.3f}秒"
106+
)
95107

96108
# 读取音频数据
109+
read_start = time.time()
97110
audio_bytes = await file.read()
111+
read_time = time.time() - read_start
112+
logger.info(
113+
f"音频文件读取完成,大小: {len(audio_bytes)}字节,耗时: {read_time:.3f}秒"
114+
)
98115

99116
# 识别声纹
117+
identify_start = time.time()
118+
logger.info("开始调用声纹识别服务...")
100119
match_name, match_score = voiceprint_service.identify_voiceprint(
101120
candidate_ids, audio_bytes
102121
)
122+
identify_time = time.time() - identify_start
123+
logger.info(f"声纹识别服务调用完成,耗时: {identify_time:.3f}秒")
124+
125+
total_time = time.time() - start_time
126+
logger.info(
127+
f"声纹识别请求完成,总耗时: {total_time:.3f}秒,识别结果: {match_name}, 分数: {match_score:.4f}"
128+
)
103129

104130
return VoiceprintIdentifyResponse(speaker_id=match_name, score=match_score)
105131

106132
except HTTPException:
133+
total_time = time.time() - start_time
134+
logger.error(f"声纹识别请求失败,总耗时: {total_time:.3f}秒")
107135
raise
108136
except Exception as e:
109-
logger.error(f"声纹识别异常: {e}")
137+
total_time = time.time() - start_time
138+
logger.error(f"声纹识别异常,总耗时: {total_time:.3f}秒,错误: {e}")
110139
raise HTTPException(status_code=500, detail=f"声纹识别失败: {str(e)}")
111140

112141

app/database/voiceprint_db.py

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import numpy as np
2+
import time
23
from typing import Dict, List, Optional
34
from .connection import db_connection
45
from ..core.logging import get_logger
@@ -46,6 +47,14 @@ def get_voiceprints(
4647
Returns:
4748
Dict[str, np.ndarray]: {speaker_id: 特征向量}
4849
"""
50+
start_time = time.time()
51+
query_type = (
52+
f"指定ID查询({len(speaker_ids) if speaker_ids else 0}个)"
53+
if speaker_ids
54+
else "全量查询"
55+
)
56+
logger.info(f"开始数据库查询: {query_type}")
57+
4958
try:
5059
with db_connection.get_cursor() as cursor:
5160
if speaker_ids:
@@ -56,15 +65,29 @@ def get_voiceprints(
5665
sql = "SELECT speaker_id, feature_vector FROM voiceprints"
5766
cursor.execute(sql)
5867

68+
fetch_start = time.time()
5969
results = cursor.fetchall()
70+
fetch_time = time.time() - fetch_start
71+
logger.info(
72+
f"数据库查询完成,获取到{len(results)}条记录,查询耗时: {fetch_time:.3f}秒"
73+
)
74+
6075
# 将数据库中的二进制特征转为numpy数组
76+
convert_start = time.time()
6177
voiceprints = {
6278
row[0]: np.frombuffer(row[1], dtype=np.float32) for row in results
6379
}
64-
logger.info(f"获取到 {len(voiceprints)} 个声纹特征")
80+
convert_time = time.time() - convert_start
81+
logger.info(f"数据转换完成,转换耗时: {convert_time:.3f}秒")
82+
83+
total_time = time.time() - start_time
84+
logger.info(
85+
f"获取到 {len(voiceprints)} 个声纹特征,总耗时: {total_time:.3f}秒"
86+
)
6587
return voiceprints
6688
except Exception as e:
67-
logger.error(f"获取声纹特征失败: {e}")
89+
total_time = time.time() - start_time
90+
logger.error(f"获取声纹特征失败,总耗时: {total_time:.3f}秒,错误: {e}")
6891
return {}
6992

7093
def delete_voiceprint(self, speaker_id: str) -> bool:
@@ -98,15 +121,22 @@ def count_voiceprints(self) -> int:
98121
Returns:
99122
int: 声纹特征总数
100123
"""
124+
start_time = time.time()
125+
logger.info("开始查询声纹特征总数...")
126+
101127
try:
102128
with db_connection.get_cursor() as cursor:
103129
sql = "SELECT COUNT(*) FROM voiceprints"
104130
cursor.execute(sql)
105131
result = cursor.fetchone()
106132
count = result[0] if result else 0
133+
134+
total_time = time.time() - start_time
135+
logger.info(f"声纹特征总数查询完成: {count},耗时: {total_time:.3f}秒")
107136
return count
108137
except Exception as e:
109-
logger.error(f"获取声纹特征总数失败: {e}")
138+
total_time = time.time() - start_time
139+
logger.error(f"获取声纹特征总数失败,总耗时: {total_time:.3f}秒,错误: {e}")
110140
return 0
111141

112142

app/services/voiceprint_service.py

Lines changed: 70 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import numpy as np
22
import torch
3+
import time
34
from typing import Dict, List, Tuple, Optional
45
from modelscope.pipelines import pipeline
56
from modelscope.utils.constant import Tasks
@@ -53,13 +54,28 @@ def extract_voiceprint(self, audio_path: str) -> np.ndarray:
5354
Returns:
5455
np.ndarray: 声纹特征向量
5556
"""
57+
start_time = time.time()
58+
logger.info(f"开始提取声纹特征,音频文件: {audio_path}")
59+
5660
try:
61+
pipeline_start = time.time()
5762
result = self._pipeline([audio_path], output_emb=True)
63+
pipeline_time = time.time() - pipeline_start
64+
logger.info(f"模型推理完成,耗时: {pipeline_time:.3f}秒")
65+
66+
convert_start = time.time()
5867
emb = self._to_numpy(result["embs"][0]).astype(np.float32)
59-
logger.debug(f"声纹特征提取成功,维度: {emb.shape}")
68+
convert_time = time.time() - convert_start
69+
logger.info(f"数据转换完成,耗时: {convert_time:.3f}秒")
70+
71+
total_time = time.time() - start_time
72+
logger.info(
73+
f"声纹特征提取成功,维度: {emb.shape},总耗时: {total_time:.3f}秒"
74+
)
6075
return emb
6176
except Exception as e:
62-
logger.error(f"声纹特征提取失败: {e}")
77+
total_time = time.time() - start_time
78+
logger.error(f"声纹特征提取失败,总耗时: {total_time:.3f}秒,错误: {e}")
6379
raise
6480

6581
def calculate_similarity(self, emb1: np.ndarray, emb2: np.ndarray) -> float:
@@ -138,30 +154,56 @@ def identify_voiceprint(
138154
Returns:
139155
Tuple[str, float]: (识别出的说话人ID, 相似度分数)
140156
"""
157+
start_time = time.time()
158+
logger.info(f"开始声纹识别流程,候选说话人数量: {len(speaker_ids)}")
159+
141160
audio_path = None
142161
try:
143162
# 验证音频文件
163+
validation_start = time.time()
144164
if not audio_processor.validate_audio_file(audio_bytes):
145165
logger.warning("音频文件验证失败")
146166
return "", 0.0
167+
validation_time = time.time() - validation_start
168+
logger.info(f"音频文件验证完成,耗时: {validation_time:.3f}秒")
147169

148170
# 处理音频文件
171+
audio_process_start = time.time()
149172
audio_path = audio_processor.ensure_16k_wav(audio_bytes)
173+
audio_process_time = time.time() - audio_process_start
174+
logger.info(f"音频文件处理完成,耗时: {audio_process_time:.3f}秒")
150175

151176
# 提取声纹特征
177+
extract_start = time.time()
178+
logger.info("开始提取声纹特征...")
152179
test_emb = self.extract_voiceprint(audio_path)
180+
extract_time = time.time() - extract_start
181+
logger.info(f"声纹特征提取完成,耗时: {extract_time:.3f}秒")
153182

154183
# 获取候选声纹特征
184+
db_query_start = time.time()
185+
logger.info("开始查询数据库获取候选声纹特征...")
155186
voiceprints = voiceprint_db.get_voiceprints(speaker_ids)
187+
db_query_time = time.time() - db_query_start
188+
logger.info(
189+
f"数据库查询完成,获取到{len(voiceprints)}个声纹特征,耗时: {db_query_time:.3f}秒"
190+
)
191+
156192
if not voiceprints:
157193
logger.info("未找到候选说话人声纹")
158194
return "", 0.0
159195

160196
# 计算相似度
197+
similarity_start = time.time()
198+
logger.info("开始计算相似度...")
161199
similarities = {}
162200
for name, emb in voiceprints.items():
163201
similarity = self.calculate_similarity(test_emb, emb)
164202
similarities[name] = similarity
203+
similarity_time = time.time() - similarity_start
204+
logger.info(
205+
f"相似度计算完成,共计算{len(similarities)}个,耗时: {similarity_time:.3f}秒"
206+
)
165207

166208
# 找到最佳匹配
167209
if not similarities:
@@ -172,19 +214,30 @@ def identify_voiceprint(
172214

173215
# 检查是否超过阈值
174216
if match_score < self.similarity_threshold:
175-
logger.info(f"未识别到说话人,最高分: {match_score:.4f}")
217+
logger.info(
218+
f"未识别到说话人,最高分: {match_score:.4f},阈值: {self.similarity_threshold}"
219+
)
220+
total_time = time.time() - start_time
221+
logger.info(f"声纹识别流程完成,总耗时: {total_time:.3f}秒")
176222
return "", match_score
177223

178-
logger.info(f"识别到说话人: {match_name}, 分数: {match_score:.4f}")
224+
total_time = time.time() - start_time
225+
logger.info(
226+
f"识别到说话人: {match_name}, 分数: {match_score:.4f}, 总耗时: {total_time:.3f}秒"
227+
)
179228
return match_name, match_score
180229

181230
except Exception as e:
182-
logger.error(f"声纹识别异常: {e}")
231+
total_time = time.time() - start_time
232+
logger.error(f"声纹识别异常,总耗时: {total_time:.3f}秒,错误: {e}")
183233
return "", 0.0
184234
finally:
185235
# 清理临时文件
236+
cleanup_start = time.time()
186237
if audio_path:
187238
audio_processor.cleanup_temp_file(audio_path)
239+
cleanup_time = time.time() - cleanup_start
240+
logger.debug(f"临时文件清理完成,耗时: {cleanup_time:.3f}秒")
188241

189242
def delete_voiceprint(self, speaker_id: str) -> bool:
190243
"""
@@ -205,7 +258,18 @@ def get_voiceprint_count(self) -> int:
205258
Returns:
206259
int: 声纹总数
207260
"""
208-
return voiceprint_db.count_voiceprints()
261+
start_time = time.time()
262+
logger.info("开始获取声纹总数...")
263+
264+
try:
265+
count = voiceprint_db.count_voiceprints()
266+
total_time = time.time() - start_time
267+
logger.info(f"声纹总数获取完成: {count},耗时: {total_time:.3f}秒")
268+
return count
269+
except Exception as e:
270+
total_time = time.time() - start_time
271+
logger.error(f"获取声纹总数失败,总耗时: {total_time:.3f}秒,错误: {e}")
272+
raise
209273

210274

211275
# 全局声纹服务实例

0 commit comments

Comments
 (0)