You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Cloud Run中Google Speech-to-Text long_running_recognize报错

根因分析

这个503报错属于瞬态网络中断,触发的核心原因和Cloud Run的运行机制强相关:

  • 你在请求处理逻辑中启动后台线程处理长音频转写,对于时长超过10分钟的音频,接口会直接返回响应结束请求处理。默认Cloud Run仅在请求处理期间分配CPU资源,请求结束后CPU会被限流,后台线程在调用Speech API、发起鉴权元数据请求时没有足够的资源维持连接,就会触发远端断连报错,这也是本地环境无报错、仅长音频在Cloud Run触发问题的核心原因。
  • 额外的次要诱因包括gRPC连接空闲超时、默认重试策略未覆盖503类服务不可用错误、鉴权令牌续期失败。

解决方案

1. 调整Cloud Run配置

  • 开启「CPU始终分配」(即关闭CPU节流),允许请求结束后后台任务仍能获得CPU资源正常运行
  • 将Cloud Run的最大请求超时时间调整到不短于你设置的转写超时(90分钟),避免运行到一半被平台强制中断

2. 优化异步任务处理逻辑

不建议在用户请求的进程内直接启动后台线程跑长任务,Serverless环境下非常不稳定,建议调整为:

  • 接收到转写请求后,先将任务元数据存入数据库,把任务推送至Cloud Tasks或Pub/Sub队列
  • 单独部署一个转写处理服务,由队列触发执行转写逻辑,和用户请求链路完全解耦

3. 给Speech API客户端增加显式重试配置

修改_long_recognize方法的调用逻辑,针对503这类瞬态错误增加重试策略,示例代码如下:

from google.api_core import retry
from google.api_core.exceptions import ServiceUnavailable
from http.client import RemoteDisconnected

@stop_watch
def _long_recognize(self, audio):
    # 自定义重试策略:重试503等瞬态错误,最大重试间隔30秒,总重试时长10分钟
    custom_retry = retry.Retry(
        predicate=retry.if_exception_type(
            ServiceUnavailable,
            ConnectionError,
            RemoteDisconnected
        ),
        initial=1.0,
        maximum=30.0,
        multiplier=2,
        timeout=600
    )
    operation = self.client.long_running_recognize(
        config=self.config, 
        audio=audio,
        retry=custom_retry
    )
    logger.info("Waiting for speech_to_text to complete...")
    self.response = operation.result(timeout=60 * 90)

4. 鉴权逻辑优化

你当前的鉴权配置本身没有问题,开启CPU始终分配后,SDK会自动处理服务账号令牌的续期,不需要额外修改代码。如果还是偶发鉴权相关的断连,可以在初始化Speech客户端的时候显式传入你加载好的GS_CREDENTIALS,避免SDK重复读取环境变量加载凭证:

# 初始化Speech客户端时传入凭证
self.client = speech.SpeechClient(credentials=GS_CREDENTIALS)

内容的提问来源于stack exchange,提问作者Nori

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:36:03