Google Speech-to-Text实时转录超时配置报错499排查
问题分析与解决方案
你的超时配置存在几个潜在问题,结合报错499 The operation was cancelled,可以从以下几点排查修复:
1. 确认Duration的正确导入
首先确保你已经正确导入Protobuf的Duration类型,否则speech_start_timeout的赋值会无效,间接导致服务端异常:
from google.protobuf.duration_pb2 import Duration
2. 规范VoiceActivityTimeout的构造方式
虽然你的写法语法上没问题,但更推荐直接在StreamingRecognitionConfig中嵌套构造VoiceActivityTimeout,避免对象赋值可能带来的隐式问题:
streaming_config = speech.StreamingRecognitionConfig( config=config, interim_results=False, enable_voice_activity_events=True, voice_activity_timeout=speech.StreamingRecognitionConfig.VoiceActivityTimeout( speech_start_timeout=Duration(seconds=60) ) )
3. 调整客户端GRPC超时设置
报错的核心原因大概率是客户端GRPC默认超时短于你设置的60秒语音启动超时,导致客户端主动取消了请求。你需要在调用streaming_recognize时显式设置更长的客户端超时:
# 假设requests是你的音频流生成器 responses = client.streaming_recognize( streaming_config, requests, timeout=3600 # 设置为比speech_start_timeout更长的值,比如1小时 )
4. 确保音频流持续发送(关键)
即使麦克风没有采集到有效语音,也要持续发送静音帧或符合格式的空音频数据,保持GRPC连接活跃。如果流中断,服务端会直接取消操作并返回499错误。比如在音频采集循环中,即使没有声音也要定时发送数据块。
验证逻辑
设置完成后,测试时:
- 如果60秒内没有检测到语音,服务端会返回
speech_start_timeout触发的错误(而非499),这是预期行为 - 如果在60秒内检测到语音,转录会正常进行
内容的提问来源于stack exchange,提问作者Avanst
相关产品推荐
相关产品推荐

