Prhub

#45113 Fix misleading error for audio duration limit rejection

原始 PR 作者 jperezdealgaba 合并时间 2026-06-12 17:58 文件变更 2 提交数 1 评论 1 代码增减 +11 / -6

执行摘要

修复音频时长超限错误提示误导问题

当音频时长超过限制时,用户收到 "Invalid or unsupported audio file" 的错误信息,无法得知真正的限制原因和解决方法。PR body 明确指出:让 load_audio 抛出的描述性 ValueError 直接传播,并更新错误信息以提及 VLLM_MAX_AUDIO_DECODE_DURATION_S 环境变量。

可合并,属于小改进,值得精读以了解错误传播的最佳实践。

讨论亮点

没有 review 评论,只有 approver 的批准和 mergify 的冲突提示。

实现拆解

  1. 修改 vllm/multimodal/media/audio.py 中的错误信息:在 load_audio_pyavload_audio_soundfile 中,将过时限制的 ValueError 信息从 "This limit prevents decompression-bomb attacks." 改为 "Set VLLM_MAX_AUDIO_DECODE_DURATION_S to increase this limit.",让用户知道可以调整环境变量。
  2. 修改 vllm/entrypoints/speech_to_text/base/serving.py 中的异常处理:在 _decode_and_chunk_speech 方法中,在 try 块之后增加一个 except ValueError: raise 子句,确保来自 load_audio 的描述性 ValueError 能直接传播到上层,而不是被后续的通用 except Exception 捕获并转换为模糊的 "Invalid or unsupported audio file"。
文件 模块 状态 重要度
vllm/multimodal/media/audio.py 多模态 modified 5.51
vllm/entrypoints/speech_to_text/base/serving.py 前端入口 modified 5.1

关键符号

load_audio_pyav load_audio_soundfile _decode_and_chunk_speech

关键源码片段

vllm/multimodal/media/audio.py core-logic

核心文件:修改了 `load_audio_pyav` 和 `load_audio_soundfile` 中的错误信息,指引用户通过设置环境变量来解决时长限制问题。

# vllm/multimodal/media/audio.py
# 在 load_audio_pyav 和 load_audio_soundfile 中,
# 将原本的泛泛提示 "This limit prevents decompression-bomb attacks."
# 替换为具体的环境变量指引 "Set VLLM_MAX_AUDIO_DECODE_DURATION_S to increase this limit."
# 让用户明确知道如何调整限制。def load_audio_pyav(...):
    # ... 省略上下文
    if metadata_duration_s is not None and metadata_duration_s > max_duration_s:
        raise ValueError(
            f"Audio exceeds maximum allowed duration of "
            f"{max_duration_s}s (metadata reports "
            f"{metadata_duration_s:.1f}s). Set "
            f"VLLM_MAX_AUDIO_DECODE_DURATION_S to "
            f"increase this limit." # <-- 原先是 "This limit prevents decompression-bomb attacks."
        )
    # ... 省略后续
    if max_samples is not None and total_samples > max_samples:
        raise ValueError(
            f"Audio exceeds maximum allowed duration of "
            f"{max_duration_s}s (decoded {total_samples} "
            f"samples at {sr}Hz). Set "
            f"VLLM_MAX_AUDIO_DECODE_DURATION_S to "
            f"increase this limit." # <-- 同样修改
        )def load_audio_soundfile(...):
    # ... 省略上下文
    if file_duration_s > max_duration_s:
        raise ValueError(
            f"Audio exceeds maximum allowed duration of "
            f"{max_duration_s}s (file contains "
            f"{file_duration_s:.1f}s at {native_sr}Hz). Set "
            f"VLLM_MAX_AUDIO_DECODE_DURATION_S to "
            f"increase this limit." # <-- 同样修改
        )
vllm/entrypoints/speech_to_text/base/serving.py core-logic

关键入口:修改了 `_decode_and_chunk_speech` 方法的异常处理,确保 `load_audio` 抛出的 `ValueError` 不被通用异常捕获,从而保留详细的错误信息。

# vllm/entrypoints/speech_to_text/base/serving.py
# 在 _decode_and_chunk_speech 方法中,
# 添加了 except ValueError: raise 子句,
# 使得 load_audio 抛出的描述性 ValueError 能直接传播到上层,
# 而不是被通用的 except Exception 捕获并替换为模糊的错误信息。def _decode_and_chunk_speech(self, audio_data: bytes):
    try:
        with io.BytesIO(audio_data) as buf:
            y, sr = load_audio(
                buf,
                sr=self.asr_config.sample_rate,
                max_duration_s=self.max_audio_decode_duration_s,
            )
    except ValueError: # <-- 新增:让 load_audio 的 ValueError 直接传播
        raise
    except Exception as exc:
        raise ValueError("Invalid or unsupported audio file.") from exc
    # 后续处理不变 ...

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

低风险。改动范围小(仅两个文件,共 11 行新增、6 行删除),主要是错误消息和异常处理链的调整。不会引入功能性回归。但需注意:若 load_audio 抛出非 ValueError 的其他异常(如 OSError),仍然会被捕获为 "Invalid or unsupported audio file",这部分逻辑未变。

对用户:当音频时长超过限制时,用户将看到明确指导如何增加限制的错误消息,而不是模糊的错误提示。对系统:无性能影响,异常处理逻辑更清晰。对团队:无显著影响。

小范围变更 低风险

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论