modelscope-funasr这是服务端关闭了连接吗?

我用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这是服务端关闭了连接吗?

展开
收起
三分钟热度的鱼 2024-05-05 14:23:25 252 分享 版权
阿里云 AI 助理回答

根据您描述的问题,当使用 funasr-runtime-sdk-cpu-0.4.4 镜像部署离线文件转写服务时,发送长音频(如超过30分钟)会导致客户端在 await websocket.recv() 时抛出 websockets.exceptions.ConnectionClosedError: no close frame received or sent 错误。这表明 WebSocket 连接被意外关闭。

以下是对此问题的分析和解决方案:


1. 问题原因分析

WebSocket 连接的关闭可能由以下几种原因导致: - 服务端超时限制:服务端可能对 WebSocket 连接设置了最大空闲时间或最大处理时间。如果音频过长,处理时间超出限制,服务端会主动关闭连接。 - 网络不稳定:长时间的 WebSocket 连接容易受到网络波动的影响,可能导致连接中断。 - 客户端未正确处理心跳机制:某些 WebSocket 实现需要客户端定期发送心跳包以维持连接。如果客户端未发送心跳包,服务端可能会认为连接已失效并关闭连接。 - 资源限制:服务端可能因资源不足(如内存、CPU 等)而无法处理长时间任务,从而关闭连接。

根据错误信息 no close frame received or sent,可以推测服务端未正常发送关闭帧,可能是由于超时或异常终止导致的。


2. 解决方案

2.1 检查服务端配置

确认服务端是否对 WebSocket 连接设置了超时限制。如果是,请调整相关参数以支持更长的音频处理时间。例如: - 如果服务端使用了类似 timeoutmax_connection_duration 的配置项,请将其值设置为更大的范围。 - 如果服务端依赖于某种框架(如 FastAPI 或 Flask),请检查其 WebSocket 超时设置。

重要提示:如果服务端是基于阿里云函数计算或其他 Serverless 平台部署的,请确保预留模式的实例已就绪,并且资源配置足够支持长时间任务。

2.2 增加心跳机制

在客户端代码中添加心跳机制,定期向服务端发送心跳包以维持连接。例如,可以在 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

2.3 分段上传音频

对于长音频文件,建议将其分段上传并逐段处理,而不是一次性发送整个文件。这样可以避免单次请求耗时过长导致连接关闭。具体实现步骤如下: 1. 将音频文件按固定时长(如5分钟)分割为多个片段。 2. 依次发送每个片段,并在服务端拼接处理结果。 3. 在客户端合并所有片段的转写结果。

您可以使用工具如 ffmpeg 对音频进行分割:

ffmpeg -i long_audio.wav -f segment -segment_time 300 -c copy segment_%03d.wav

2.4 检查网络稳定性

通过以下方法排查网络问题: - 使用 pingcurl 测试客户端与服务端之间的网络连通性。 - 如果网络不稳定,建议更换网络环境或使用内网通信。

2.5 延长超时时间

如果服务端允许配置超时时间,请适当延长读超时时间和连接超时时间。例如,在 SDK 中可以通过运行时参数设置超时时间:

runtime_options = RuntimeOptions()
runtime_options.connect_timeout = 60000  # 连接超时时间(毫秒)
runtime_options.read_timeout = 60000    # 读超时时间(毫秒)

3. 其他注意事项

  • 日志排查:检查服务端日志,确认是否有超时或资源不足的记录。如果有,请优化服务端资源配置。
  • 版本兼容性:确保使用的 funasr-runtime-sdk-cpu-0.4.4 镜像与服务端版本兼容。如果不兼容,建议升级到最新版本。
  • 模型性能:长音频处理可能对模型性能提出更高要求。如果服务端资源有限,建议使用 GPU 加速实例以提高处理效率。

4. 总结

针对您遇到的问题,建议优先检查服务端的超时配置和网络稳定性,同时在客户端添加心跳机制或采用分段上传的方式处理长音频文件。如果问题仍未解决,请进一步排查服务端日志和资源配置情况。

希望以上解决方案能够帮助您解决问题!您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答

包含命名实体识别、文本分类、分词、关系抽取、问答、推理、文本摘要、情感分析、机器翻译等多个领域

热门讨论

热门文章

还有其他疑问?
咨询AI助理