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

IBM Watson Speech to Text设置inactivity_timeout后长音频仍会话超时

解决IBM Watson Speech to Text WebSocket长音频超时问题

问题诊断

你遇到的长音频(>15秒)WebSocket连接超时问题,即使设置inactivity_timeout=-1也无效,大概率和以下几个因素有关:

  • low_latency=True参数不适用于本地文件:该参数是为实时麦克风流优化的,会强制服务端以低延迟模式处理,对于本地批量文件的传输,容易因数据发送的微小间隙被误判为会话 inactive。
  • 音频文件传输速率不匹配:本地文件读取过快,服务端可能无法及时处理,或者发送过程中出现停顿,触发服务端的连接超时(区别于inactivity_timeout的会话超时)。
  • 模型与音频格式不兼容:如果你的WAV文件采样率、编码不符合en-US_Multimedia模型的要求(该模型默认支持16kHz、PCM编码的WAV),会导致服务端处理速度变慢,进而触发超时。

解决方案

1. 移除low_latency参数

将low_latency=True从调用中移除,该参数仅适用于实时流式输入,本地文件不需要低延迟优化:

speech_to_text.recognize_using_websocket(
    audio=audio_source,
    content_type='audio/wav',
    recognize_callback=myRecognizeCallback,
    model='en-US_Multimedia',
    inactivity_timeout=-1
)

2. 验证音频文件格式

确保你的WAV文件符合模型要求:

  • 采样率:16kHz(en-US_Multimedia的最优采样率)
  • 编码:PCM(无压缩)
  • 声道:单声道(推荐,多声道也支持但可能增加处理时间)

可以用ffmpeg转换格式:

ffmpeg -i input.wav -ar 16000 -ac 1 -c:a pcm_s16le output_16k_mono.wav

3. 模拟实时速率发送音频

如果直接读取文件发送还是超时,可以手动控制发送速率,模拟实时流的节奏:

import time

# 计算音频的帧速率(假设是16kHz单声道PCM,每帧2字节)
sample_rate = 16000
bytes_per_second = sample_rate * 2  # 16位单声道,每秒2字节*16000帧

with open(join(dirname(__file__), './.', 'output1.wav'), 'rb') as audio_file:
    # 跳过WAV文件头(前44字节)
    audio_file.seek(44)
    audio_source = AudioSource(audio_file)
    
    # 自定义发送逻辑,按实时速率分块发送
    chunk_size = 1024
    while True:
        chunk = audio_file.read(chunk_size)
        if not chunk:
            break
        audio_source.stream.send(chunk)
        # 计算发送该块需要的时间,模拟实时速率
        time.sleep(len(chunk) / bytes_per_second)
    
    # 结束流
    audio_source.stream.send(b'')

4. 改用REST API处理长音频

对于本地长音频文件,WebSocket并非最优选择,推荐使用Speech to Text的REST API批量识别,稳定性更高:

import json
from os.path import join, dirname
from ibm_watson import SpeechToTextV1
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator
import os

authenticator = IAMAuthenticator(os.environ.get("IBM_API_KEY"))
speech_to_text = SpeechToTextV1(authenticator=authenticator)
speech_to_text.set_service_url('https://api.eu-de.speech-to-text.watson.cloud.ibm.com/instances/2d58dac4-197c-4d7b-9a7e-215d80339ab0')

with open(join(dirname(__file__), './.', 'output1.wav'), 'rb') as audio_file:
    response = speech_to_text.recognize(
        audio=audio_file,
        content_type='audio/wav',
        model='en-US_Multimedia'
    ).get_result()

print(json.dumps(response, indent=2))

额外提示

  • 检查IBM Cloud实例的区域:部分区域的服务可能有会话时长限制,若问题持续,可以尝试切换到其他区域的实例。
  • 查看服务端日志:在IBM Cloud控制台的Speech to Text实例中查看详细日志,确认超时的具体原因(是连接超时还是处理超时)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 13:30:33