mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-22 07:03:53 +08:00
101 lines
3.5 KiB
Python
101 lines
3.5 KiB
Python
"""
|
|
ASR上报功能已集成到ConnectionHandler类中。
|
|
|
|
上报功能包括:
|
|
1. 每个连接对象拥有自己的上报队列和处理线程
|
|
2. 上报线程的生命周期与连接对象绑定
|
|
3. 使用ConnectionHandler.enqueue_asr_report方法进行上报
|
|
|
|
具体实现请参考core/connection.py中的相关代码。
|
|
"""
|
|
|
|
import os
|
|
from config.logger import setup_logging
|
|
from config.manage_api_client import report
|
|
|
|
TAG = __name__
|
|
logger = setup_logging()
|
|
|
|
async def report_asr(conn, text, file_path):
|
|
"""执行ASR上报操作
|
|
|
|
Args:
|
|
conn: 连接对象
|
|
text: 识别文本
|
|
file_path: 音频文件路径(可以为None或空字符串,表示纯文本上报)
|
|
"""
|
|
audio_data = None
|
|
try:
|
|
# 处理无音频的纯文本上报
|
|
if not file_path or not os.path.exists(file_path):
|
|
# 纯文本上报时使用空音频数据
|
|
result = await report(
|
|
mac_address=conn.device_id,
|
|
session_id=conn.session_id,
|
|
sort=int(conn.session_open_time),
|
|
chat_type=1, # ASR类型为1
|
|
content=text,
|
|
audio=b'', # 空音频数据
|
|
file_extension="wav"
|
|
)
|
|
logger.bind(tag=TAG).info(f"纯文本上报成功: {conn.device_id}, {conn.session_id}")
|
|
else:
|
|
# 读取文件为二进制数据
|
|
with open(file_path, 'rb') as f:
|
|
audio_data = f.read()
|
|
|
|
# 正常ASR上报(带音频)
|
|
result = await report(
|
|
mac_address=conn.device_id,
|
|
session_id=conn.session_id,
|
|
sort=int(conn.session_open_time),
|
|
chat_type=1, # ASR类型为1
|
|
content=text,
|
|
audio=audio_data,
|
|
file_extension="wav"
|
|
)
|
|
logger.bind(tag=TAG).info(f"ASR上报成功: {conn.device_id}, {conn.session_id},文件: {file_path}")
|
|
|
|
return result
|
|
except Exception as e:
|
|
logger.bind(tag=TAG).error(f"ASR上报失败: {e}")
|
|
return None
|
|
finally:
|
|
# 清理资源
|
|
if file_path and os.path.exists(file_path):
|
|
try:
|
|
os.remove(file_path)
|
|
logger.bind(tag=TAG).debug(f"ASR上报后删除文件: {file_path}")
|
|
except Exception as e:
|
|
logger.bind(tag=TAG).error(f"ASR上报后删除文件失败: {e}")
|
|
|
|
# 手动清理audio_data
|
|
if audio_data:
|
|
del audio_data
|
|
|
|
def enqueue_asr_report(conn, text, audio):
|
|
"""将ASR数据加入上报队列
|
|
|
|
Args:
|
|
conn: 连接对象
|
|
text: 识别文本
|
|
audio: 音频数据(可以为空列表,表示纯文本上报)
|
|
"""
|
|
try:
|
|
if not audio or len(audio) == 0:
|
|
# 纯文本上报,不需要保存文件
|
|
file_path = None
|
|
else:
|
|
# 保存音频数据到文件
|
|
file_path = conn.asr.save_audio_to_file(audio, conn.session_id)
|
|
|
|
# 使用连接对象的队列,传入文件路径
|
|
conn.asr_report_queue.put((text, file_path))
|
|
|
|
if not audio or len(audio) == 0:
|
|
logger.bind(tag=TAG).info(f"纯文本数据已加入上报队列: {conn.device_id}, {text[:20] if text else ''}...")
|
|
else:
|
|
logger.bind(tag=TAG).info(f"ASR数据已加入上报队列: {conn.device_id}, 文件: {file_path}")
|
|
except Exception as e:
|
|
logger.bind(tag=TAG).error(f"加入ASR上报队列失败: {e}")
|