mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-26 00:53:54 +08:00
update:优化声纹识别,添加服务器健康检查机制避免运行时超时等待
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
import json
|
|
||||||
import time
|
import time
|
||||||
import aiohttp
|
import aiohttp
|
||||||
|
import requests
|
||||||
from urllib.parse import urlparse, parse_qs
|
from urllib.parse import urlparse, parse_qs
|
||||||
from typing import Optional, Dict
|
from typing import Optional, Dict
|
||||||
from config.logger import setup_logging
|
from config.logger import setup_logging
|
||||||
@@ -57,8 +57,13 @@ class VoiceprintProvider:
|
|||||||
logger.bind(tag=TAG).warning("未配置有效的说话人,声纹识别将被禁用")
|
logger.bind(tag=TAG).warning("未配置有效的说话人,声纹识别将被禁用")
|
||||||
self.enabled = False
|
self.enabled = False
|
||||||
else:
|
else:
|
||||||
self.enabled = True
|
# 进行健康检查,验证服务器是否可用
|
||||||
logger.bind(tag=TAG).info(f"声纹识别已配置: API={self.api_url}, 说话人={len(self.speaker_ids)}个")
|
if self._check_server_health():
|
||||||
|
self.enabled = True
|
||||||
|
logger.bind(tag=TAG).info(f"声纹识别已启用: API={self.api_url}, 说话人={len(self.speaker_ids)}个")
|
||||||
|
else:
|
||||||
|
self.enabled = False
|
||||||
|
logger.bind(tag=TAG).warning(f"声纹识别服务器不可用,声纹识别已禁用: {self.api_url}")
|
||||||
|
|
||||||
def _parse_speakers(self) -> Dict[str, Dict[str, str]]:
|
def _parse_speakers(self) -> Dict[str, Dict[str, str]]:
|
||||||
"""解析说话人配置"""
|
"""解析说话人配置"""
|
||||||
@@ -76,6 +81,41 @@ class VoiceprintProvider:
|
|||||||
logger.bind(tag=TAG).warning(f"解析说话人配置失败: {speaker_str}, 错误: {e}")
|
logger.bind(tag=TAG).warning(f"解析说话人配置失败: {speaker_str}, 错误: {e}")
|
||||||
return speaker_map
|
return speaker_map
|
||||||
|
|
||||||
|
def _check_server_health(self) -> bool:
|
||||||
|
"""检查声纹识别服务器健康状态"""
|
||||||
|
if not self.api_url or not self.api_key:
|
||||||
|
return False
|
||||||
|
|
||||||
|
try:
|
||||||
|
# 健康检查URL
|
||||||
|
parsed_url = urlparse(self.api_url)
|
||||||
|
health_url = f"{parsed_url.scheme}://{parsed_url.netloc}/voiceprint/health?key={self.api_key}"
|
||||||
|
|
||||||
|
# 发送健康检查请求
|
||||||
|
response = requests.get(health_url, timeout=3)
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
result = response.json()
|
||||||
|
if result.get("status") == "healthy":
|
||||||
|
logger.bind(tag=TAG).info("声纹识别服务器健康检查通过")
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
logger.bind(tag=TAG).warning(f"声纹识别服务器状态异常: {result}")
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
logger.bind(tag=TAG).warning(f"声纹识别服务器健康检查失败: HTTP {response.status_code}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
except requests.exceptions.ConnectTimeout:
|
||||||
|
logger.bind(tag=TAG).warning("声纹识别服务器连接超时")
|
||||||
|
return False
|
||||||
|
except requests.exceptions.ConnectionError:
|
||||||
|
logger.bind(tag=TAG).warning("声纹识别服务器连接被拒绝")
|
||||||
|
return False
|
||||||
|
except Exception as e:
|
||||||
|
logger.bind(tag=TAG).warning(f"声纹识别服务器健康检查异常: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
async def identify_speaker(self, audio_data: bytes, session_id: str) -> Optional[str]:
|
async def identify_speaker(self, audio_data: bytes, session_id: str) -> Optional[str]:
|
||||||
"""识别说话人"""
|
"""识别说话人"""
|
||||||
if not self.enabled or not self.api_url or not self.api_key:
|
if not self.enabled or not self.api_url or not self.api_key:
|
||||||
@@ -132,3 +172,4 @@ class VoiceprintProvider:
|
|||||||
elapsed = time.monotonic() - api_start_time
|
elapsed = time.monotonic() - api_start_time
|
||||||
logger.bind(tag=TAG).error(f"声纹识别失败: {e}")
|
logger.bind(tag=TAG).error(f"声纹识别失败: {e}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user