import struct from fastapi import WebSocket from services.audio_session import audio_session_manager, AudioSession from utils.logger import session_logger from services.factory import get_asr, get_llm, get_tts DEVICE_ID_SIZE = 22 # 将大小设为22,在实际解析中会更灵活处理 SESSION_ID_SIZE = 33 SAMPLE_RATE = 16000 # 固定为16K采样率 CHANNELS = 1 # 单声道 SAMPLE_WIDTH = 2 # 16位 = 2字节 async def parse_packet(data: bytes, websocket: WebSocket): try: min_header_size = 4 + 1 + 4 # sequence_number + packet_type + data_size if len(data) < min_header_size: session_logger.warning( "unknown", "unknown", f"数据包太小: {len(data)} < {min_header_size}" ) return None, None, None, None, None null_pos = data.find(b'\x00') if null_pos == -1 or null_pos > 25: # 如果没找到或超出最大长度限制 null_pos = 22 # 使用默认值 device_id = data[:null_pos].decode("ascii") session_start = null_pos + 1 session_end = session_start + SESSION_ID_SIZE session_data = data[session_start:session_end] session_null_pos = session_data.find(b'\x00') if session_null_pos != -1: session_id = session_data[:session_null_pos].decode("ascii") else: session_id = session_data.decode("ascii").rstrip("\x00") offset = session_start + len(session_id) + 1 if offset + min_header_size > len(data): session_logger.warning( "unknown", "unknown", f"解析剩余头信息时数据包太小: {len(data)} < {offset + min_header_size}" ) return None, None, None, None, None remaining_data = data[offset:] offset = 0 sequence_number = struct.unpack("