funasr_protocol_compatibility_fix.md 3.28 KB

AIfeng/2025-07-17 17:04:42

FunASR协议兼容性修复方案

问题分析

根本原因

  • 协议不匹配: FunASRSync客户端发送的分块协议与ASR_server.py期望的格式不兼容
  • 服务端限制: ASR_server.py只处理包含urlaudio_data字段的消息
  • 分块协议: FunASRSync使用audio_startaudio_chunkaudio_end等新格式

现象确认

  • 小文件正常:使用简单模式,发送标准audio_data格式
  • 大文件失败:使用分块模式,发送不兼容的协议格式
  • 服务端无响应:ASR_server.py无法识别分块协议消息

解决方案

方案一:服务端协议扩展(推荐)

优势

  • 保持客户端分块优化不变
  • 服务端支持更灵活的协议
  • 向后兼容现有格式

实施步骤

  1. 扩展消息处理: 在ws_serve函数中添加分块协议支持
  2. 分块重组: 实现音频分块的接收和重组逻辑
  3. 状态管理: 维护每个连接的分块接收状态

方案二:客户端协议回退(备选)

优势

  • 无需修改服务端
  • 实施简单快速

劣势

  • 失去分块传输优势
  • 大文件仍可能超时

推荐实施:服务端协议扩展

核心修改点

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小时)

  1. 添加分块消息路由
  2. 实现基础分块重组
  3. 测试小规模分块

Phase 2: 稳定性增强(4小时)

  1. 完善错误处理
  2. 添加状态管理
  3. 实施超时机制

Phase 3: 性能优化(1天)

  1. 内存优化
  2. 并发处理
  3. 监控指标

测试验证

测试用例

  1. 小文件兼容性: 确保现有简单模式正常
  2. 大文件分块: 验证2MB、5MB、10MB文件处理
  3. 并发处理: 多客户端同时发送
  4. 异常恢复: 网络中断、分块丢失等场景

成功指标

  • 大文件传输成功率 >95%
  • 服务端内存使用稳定
  • 响应时间合理(<文件大小/1MB * 2秒)
  • 向后兼容性100%

风险评估

低风险

  • 向后兼容:现有协议完全保留
  • 渐进式:可分阶段实施
  • 可回滚:出问题可快速恢复

注意事项

  • 内存使用监控
  • 并发连接限制
  • 分块大小合理性
  • 超时参数调优

监控指标

关键指标

  • 分块接收成功率
  • 音频重组完整性
  • 服务端内存峰值
  • 平均处理延迟

告警阈值

  • 分块丢失率 >1%
  • 内存使用 >1GB
  • 处理延迟 >30秒
  • 会话超时率 >5%