funasr_protocol_compatibility_fix.md
3.28 KB
AIfeng/2025-07-17 17:04:42
FunASR协议兼容性修复方案
问题分析
根本原因
- 协议不匹配: FunASRSync客户端发送的分块协议与ASR_server.py期望的格式不兼容
-
服务端限制: ASR_server.py只处理包含
url或audio_data字段的消息 -
分块协议: FunASRSync使用
audio_start、audio_chunk、audio_end等新格式
现象确认
- 小文件正常:使用简单模式,发送标准
audio_data格式 - 大文件失败:使用分块模式,发送不兼容的协议格式
- 服务端无响应:ASR_server.py无法识别分块协议消息
解决方案
方案一:服务端协议扩展(推荐)
优势
- 保持客户端分块优化不变
- 服务端支持更灵活的协议
- 向后兼容现有格式
实施步骤
-
扩展消息处理: 在
ws_serve函数中添加分块协议支持 - 分块重组: 实现音频分块的接收和重组逻辑
- 状态管理: 维护每个连接的分块接收状态
方案二:客户端协议回退(备选)
优势
- 无需修改服务端
- 实施简单快速
劣势
- 失去分块传输优势
- 大文件仍可能超时
推荐实施:服务端协议扩展
核心修改点
1. 消息路由扩展
# 在ws_serve函数中添加
if 'type' in data:
# 处理分块协议
await handle_chunked_protocol(websocket, data)
else:
# 现有逻辑保持不变
if 'url' in data:
await task_queue.put((websocket, data['url'], 'url'))
elif 'audio_data' in data:
await task_queue.put((websocket, data, 'audio_data'))
2. 分块状态管理
# 全局状态管理
chunk_sessions = {} # {user_id: {filename, chunks, total_chunks, ...}}
3. 分块处理逻辑
- audio_start: 初始化接收会话
- audio_chunk: 累积音频分块
- audio_end: 完成重组并处理
性能优化
内存管理
- 使用临时文件而非内存缓存大文件
- 及时清理完成的会话
- 设置会话超时机制
错误处理
- 分块丢失检测
- 会话超时清理
- 异常状态恢复
实施计划
Phase 1: 基础协议支持(2小时)
- 添加分块消息路由
- 实现基础分块重组
- 测试小规模分块
Phase 2: 稳定性增强(4小时)
- 完善错误处理
- 添加状态管理
- 实施超时机制
Phase 3: 性能优化(1天)
- 内存优化
- 并发处理
- 监控指标
测试验证
测试用例
- 小文件兼容性: 确保现有简单模式正常
- 大文件分块: 验证2MB、5MB、10MB文件处理
- 并发处理: 多客户端同时发送
- 异常恢复: 网络中断、分块丢失等场景
成功指标
- 大文件传输成功率 >95%
- 服务端内存使用稳定
- 响应时间合理(<文件大小/1MB * 2秒)
- 向后兼容性100%
风险评估
低风险
- 向后兼容:现有协议完全保留
- 渐进式:可分阶段实施
- 可回滚:出问题可快速恢复
注意事项
- 内存使用监控
- 并发连接限制
- 分块大小合理性
- 超时参数调优
监控指标
关键指标
- 分块接收成功率
- 音频重组完整性
- 服务端内存峰值
- 平均处理延迟
告警阈值
- 分块丢失率 >1%
- 内存使用 >1GB
- 处理延迟 >30秒
- 会话超时率 >5%