Watson API返回408状态代码

时间:2017-06-01 08:51:41

标签: python python-3.5 speech-to-text ibm-watson watson

我们遇到了一个奇怪的Watson API行为。

我们正在使用Watson的语音转文本转录音频文件,最近已升级到更新版本的python sdk。现在,对于一个特定文件(49 min45 MB wave file),Watson API会继续使用status code 408和消息Session timed out进行回复。

它主要发生在我们的登台服务器上,并且在我们的本地环境中大部分时间都能正常工作(我们只能在多次尝试时重现它一次)。我们的逻辑假定在每个请求之前创建新会话。

我们检查了API文档,但找不到任何解决方案。我们正在使用python 3.5watson-developer-cloud==0.26.0

你知道如何解决这个问题吗?

编辑:负责请求的代码

speech_to_text = SpeechToTextV1(
        username=WATSON_USER,
        password=WATSON_PASSWORD
)

with open(path, 'rb') as audio_file:
    return speech_to_text.recognize(
        audio_file,
        content_type=kwargs.get('content_type'),
        timestamps=kwargs.get('timestamps'),
        inactivity_timeout=kwargs.get('inactivity_timeout'),
        word_alternatives_threshold=kwargs.get('word_alternatives_threshold'),
        word_confidence=kwargs.get('word_confidence'),
        model=kwargs.get('model'),
        profanity_filter=kwargs.get('profanity_filter'),
        smart_formatting=kwargs.get('smart_formatting'),
        speaker_labels=kwargs.get('speaker_labels'),
    )

我们发送的参数

content_type = "wav"
timestamps = True
inactivity_timeout = -1
word_alternatives = 0.99
word_confidence = True
profanity_filter = False
smart_formatting = True
speaker_labels = True
model = en-US_NarrowbandModel

2 个答案:

答案 0 :(得分:3)

我几天前遇到同样的问题,为我解决的问题是在30秒会话超时发生之前,通过静音发送任何音频数据来维持会话活动。

当客户端启动会话但服务未收到30 seconds的音频时,会发生会话超时( HTTP状态代码408 )。它也会在会话处于活动状态但未从客户端收到请求30秒时发生。仅当服务从客户端收到数据30秒并且尚未收到最后一块数据时,才会出现后一种情况。如果客户端已发送所有数据,则该服务可能需要30秒以上才能生成响应;在这种情况下,请求不会超时。

对于WebSocket连接和HTTP会话,您可以通过在30秒会话超时发生之前发送任何音频数据(包括静音)来保持会话处于活动状态。 (您还必须将inactivity_timeout参数设置为-1,如下一个项目中所述。)您需要为发送到服务的任何数据的持续时间付费,包括您发送到服务的静默延长会话时间。

理想情况下,您可以在获取转录音频之前建立会话,并通过以接近实时的速率发送音频来维护它。您的应用程序也应该从关闭的连接中正常恢复。

您可以在official Documentation内查看此错误。

答案 1 :(得分:2)

您的描述中的@mateuszb我知道您间歇性地遇到此问题。几周前,Watson STT服务已经更新,现在为了连接不要超时(我说的是session timeout)你需要以“大致实时”的速率提供音频。所以在30秒内,你需要发送至少15秒的音频。您能否检查一下您的日志和代码,以确保满足此要求?这些失败的会话可能是因为STT服务正在挨饿。