mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-29 04:23:55 +08:00
update:常用音频增加缓存,抵御高并发未授权设备访问
This commit is contained in:
@@ -101,7 +101,7 @@ async def checkWakeupWords(conn, text):
|
|||||||
}
|
}
|
||||||
|
|
||||||
# 获取音频数据
|
# 获取音频数据
|
||||||
opus_packets = await audio_to_data(response.get("file_path"))
|
opus_packets = await audio_to_data(response.get("file_path"), use_cache=False)
|
||||||
# 播放唤醒词回复
|
# 播放唤醒词回复
|
||||||
conn.client_abort = False
|
conn.client_abort = False
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ class CacheType(Enum):
|
|||||||
CONFIG = "config"
|
CONFIG = "config"
|
||||||
DEVICE_PROMPT = "device_prompt"
|
DEVICE_PROMPT = "device_prompt"
|
||||||
VOICEPRINT_HEALTH = "voiceprint_health" # 声纹识别健康检查
|
VOICEPRINT_HEALTH = "voiceprint_health" # 声纹识别健康检查
|
||||||
|
AUDIO_DATA = "audio_data" # 音频数据缓存
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
@@ -58,5 +59,8 @@ class CacheConfig:
|
|||||||
CacheType.VOICEPRINT_HEALTH: cls(
|
CacheType.VOICEPRINT_HEALTH: cls(
|
||||||
strategy=CacheStrategy.TTL, ttl=600, max_size=100 # 10分钟过期
|
strategy=CacheStrategy.TTL, ttl=600, max_size=100 # 10分钟过期
|
||||||
),
|
),
|
||||||
|
CacheType.AUDIO_DATA: cls(
|
||||||
|
strategy=CacheStrategy.TTL, ttl=600, max_size=100 # 10分钟过期
|
||||||
|
),
|
||||||
}
|
}
|
||||||
return configs.get(cache_type, cls())
|
return configs.get(cache_type, cls())
|
||||||
|
|||||||
@@ -269,13 +269,27 @@ def audio_to_data_stream(
|
|||||||
pcm_to_data_stream(raw_data, is_opus, callback)
|
pcm_to_data_stream(raw_data, is_opus, callback)
|
||||||
|
|
||||||
|
|
||||||
async def audio_to_data(audio_file_path: str, is_opus: bool = True) -> list[bytes]:
|
async def audio_to_data(
|
||||||
|
audio_file_path: str, is_opus: bool = True, use_cache: bool = True
|
||||||
|
) -> list[bytes]:
|
||||||
"""
|
"""
|
||||||
将音频文件转换为Opus/PCM编码的帧列表
|
将音频文件转换为Opus/PCM编码的帧列表
|
||||||
Args:
|
Args:
|
||||||
audio_file_path: 音频文件路径
|
audio_file_path: 音频文件路径
|
||||||
is_opus: 是否进行Opus编码
|
is_opus: 是否进行Opus编码
|
||||||
|
use_cache: 是否使用缓存
|
||||||
"""
|
"""
|
||||||
|
from core.utils.cache.manager import cache_manager
|
||||||
|
from core.utils.cache.config import CacheType
|
||||||
|
|
||||||
|
# 生成缓存键,包含文件路径和编码类型
|
||||||
|
cache_key = f"{audio_file_path}:{is_opus}"
|
||||||
|
|
||||||
|
# 尝试从缓存获取结果
|
||||||
|
if use_cache:
|
||||||
|
cached_result = cache_manager.get(CacheType.AUDIO_DATA, cache_key)
|
||||||
|
if cached_result is not None:
|
||||||
|
return cached_result
|
||||||
|
|
||||||
def _sync_audio_to_data():
|
def _sync_audio_to_data():
|
||||||
# 获取文件后缀名
|
# 获取文件后缀名
|
||||||
@@ -324,7 +338,13 @@ async def audio_to_data(audio_file_path: str, is_opus: bool = True) -> list[byte
|
|||||||
|
|
||||||
loop = asyncio.get_running_loop()
|
loop = asyncio.get_running_loop()
|
||||||
# 在单独的线程中执行同步的音频处理操作
|
# 在单独的线程中执行同步的音频处理操作
|
||||||
return await loop.run_in_executor(None, _sync_audio_to_data)
|
result = await loop.run_in_executor(None, _sync_audio_to_data)
|
||||||
|
|
||||||
|
# 将结果存入缓存,使用配置中定义的TTL(10分钟)
|
||||||
|
if use_cache:
|
||||||
|
cache_manager.set(CacheType.AUDIO_DATA, cache_key, result)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
def audio_bytes_to_data_stream(
|
def audio_bytes_to_data_stream(
|
||||||
|
|||||||
Reference in New Issue
Block a user