我用funasr-runtime-sdk-cpu-0.4.4镜像部署离线文件转写服务,通过funasr_wss_client.py请求,音频较短时一切正常,当发送长音频比如超过30min,funasr_wss_client.py中meg = await websocket.recv()时会报websockets.exceptions.ConnectionClosedError: no close frame received or sent,modelscope-funasr这是服务端关闭了连接吗?
根据您描述的问题,当使用 funasr-runtime-sdk-cpu-0.4.4
镜像部署离线文件转写服务时,发送长音频(如超过30分钟)会导致客户端在 await websocket.recv()
时抛出 websockets.exceptions.ConnectionClosedError: no close frame received or sent
错误。这表明 WebSocket 连接被意外关闭。
以下是对此问题的分析和解决方案:
WebSocket 连接的关闭可能由以下几种原因导致: - 服务端超时限制:服务端可能对 WebSocket 连接设置了最大空闲时间或最大处理时间。如果音频过长,处理时间超出限制,服务端会主动关闭连接。 - 网络不稳定:长时间的 WebSocket 连接容易受到网络波动的影响,可能导致连接中断。 - 客户端未正确处理心跳机制:某些 WebSocket 实现需要客户端定期发送心跳包以维持连接。如果客户端未发送心跳包,服务端可能会认为连接已失效并关闭连接。 - 资源限制:服务端可能因资源不足(如内存、CPU 等)而无法处理长时间任务,从而关闭连接。
根据错误信息 no close frame received or sent
,可以推测服务端未正常发送关闭帧,可能是由于超时或异常终止导致的。
确认服务端是否对 WebSocket 连接设置了超时限制。如果是,请调整相关参数以支持更长的音频处理时间。例如: - 如果服务端使用了类似 timeout
或 max_connection_duration
的配置项,请将其值设置为更大的范围。 - 如果服务端依赖于某种框架(如 FastAPI 或 Flask),请检查其 WebSocket 超时设置。
重要提示:如果服务端是基于阿里云函数计算或其他 Serverless 平台部署的,请确保预留模式的实例已就绪,并且资源配置足够支持长时间任务。
在客户端代码中添加心跳机制,定期向服务端发送心跳包以维持连接。例如,可以在 funasr_wss_client.py
中实现如下逻辑:
import asyncio
import websockets
async def send_heartbeat(websocket):
while True:
await asyncio.sleep(30) # 每30秒发送一次心跳
await websocket.ping()
async def process_audio():
async with websockets.connect("ws://your-funasr-endpoint") as websocket:
# 启动心跳任务
asyncio.create_task(send_heartbeat(websocket))
# 发送音频数据
await websocket.send(audio_data)
# 接收结果
while True:
try:
msg = await websocket.recv()
print(msg)
except websockets.exceptions.ConnectionClosedError as e:
print(f"Connection closed: {e}")
break
对于长音频文件,建议将其分段上传并逐段处理,而不是一次性发送整个文件。这样可以避免单次请求耗时过长导致连接关闭。具体实现步骤如下: 1. 将音频文件按固定时长(如5分钟)分割为多个片段。 2. 依次发送每个片段,并在服务端拼接处理结果。 3. 在客户端合并所有片段的转写结果。
您可以使用工具如 ffmpeg
对音频进行分割:
ffmpeg -i long_audio.wav -f segment -segment_time 300 -c copy segment_%03d.wav
通过以下方法排查网络问题: - 使用 ping
或 curl
测试客户端与服务端之间的网络连通性。 - 如果网络不稳定,建议更换网络环境或使用内网通信。
如果服务端允许配置超时时间,请适当延长读超时时间和连接超时时间。例如,在 SDK 中可以通过运行时参数设置超时时间:
runtime_options = RuntimeOptions()
runtime_options.connect_timeout = 60000 # 连接超时时间(毫秒)
runtime_options.read_timeout = 60000 # 读超时时间(毫秒)
funasr-runtime-sdk-cpu-0.4.4
镜像与服务端版本兼容。如果不兼容,建议升级到最新版本。针对您遇到的问题,建议优先检查服务端的超时配置和网络稳定性,同时在客户端添加心跳机制或采用分段上传的方式处理长音频文件。如果问题仍未解决,请进一步排查服务端日志和资源配置情况。
希望以上解决方案能够帮助您解决问题!您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。