快速结论:这个报错通常发生在使用 Transformers 的 Whisper 模型进行批处理推理时,输入音频小于 30 秒但未按 Whisper 的固定输入长度要求进行填充或截断。优先排查特征提取器(Feature Extractor)是否在短音频场景下正确设置了 padding 和 truncation 参数。
适用环境:Transformers 4.36.2,Python 3.11.5,PyTorch 2.1.1+cu121(GPU),Linux 系统;使用了微调后的 WhisperForConditionalGeneration 模型。
最快修复方案:这是官方维护者明确验证过的方案——在调用 processor 时,不要显式设置 truncation=False 和 padding="longest",让特征提取器使用默认的 30 秒填充/截断逻辑;或者先检查 input_features 的长度,若小于 3000 则重新用默认参数处理。
注意事项:该方案只覆盖短音频(短于 30 秒)场景。若音频长于 30 秒(长音频场景),仍需使用 chunked 或 sequential 的长音频生成策略,并正确传递 condition_on_prev_tokens 等长音频专用参数。
问题场景
用户有一个微调过的 WhisperForConditionalGeneration 模型,在 GPU 上做批量语音转写。为了提升效率,参考了社区推荐的批处理方案(如 PR #27658),在 generate() 中传入了 condition_on_prev_tokens、logprob_threshold、compression_ratio_threshold 等长音频参数,或直接用 padding="longest" 处理一批短音频,结果触发报错。
报错原文
ValueError: The following `model_kwargs` are not used by the model: ['condition_on_prev_tokens', 'logprob_threshold', 'compression_ratio_threshold'] (note: typos in the generate arguments will also show up in this list)
ValueError: Whisper expects the mel input features to be of length 3000, but found 2382. Make sure to pad the input mel features to 3000.
原因分析
Whisper 模型架构要求输入 mel 特征的长度固定为 3000(对应 30 秒音频)。官方维护者在 Issue 中确认了三种生成范式:短音频生成、分块长音频生成、顺序长音频生成。本案例的根因是:用户处理的音频实际时长不足 30 秒,属于“短音频生成”场景,但代码中显式指定了 truncation=False 和 padding="longest",这导致特征提取器拒绝将短音频填充到 3000 长度,从而抛出长度不匹配错误。至于第一个 model_kwargs 报错,是因为 condition_on_prev_tokens 等参数仅在长音频的 sequential 生成模式下才被模型使用,短音频生成时这些参数不在 generate() 的合法参数列表内。
环境排查
- 确认
transformers版本(Issue 中为 4.36.2,建议先升级到最新版确认是否已修复)。 - 确认输入音频的实际时长,判断属于短音频(30 秒)。
- 若使用 GPU,确认 PyTorch 版本与 CUDA 版本匹配(本案例为 PyTorch 2.1.1+cu121)。
- 检查
processor(WhisperProcessor / WhisperFeatureExtractor)中的padding、truncation参数设置。
解决步骤
- 处理短音频(首选,官方已验证):在调用
processor时,移除truncation=False和padding="longest"两个参数,使用默认的填充/截断逻辑:processed_inputs = self.processor( inputs, return_tensors="pt", return_attention_mask=True, sampling_rate=self.asr_params.sampling_rate, )这样特征提取器会自动将音频填充或截断到 30 秒(mel 长度 3000)。
- 混合长短音频的通用处理(官方建议):先按长音频参数处理,然后检查
processed_inputs.input_features.shape[-1]是否小于 3000。若小于 3000,说明实际是短音频,用默认参数重新调用 processor:processed_inputs = self.processor( inputs, return_tensors="pt", truncation=False, padding="longest", return_attention_mask=True, sampling_rate=self.asr_params.sampling_rate, ) if processed_inputs.input_features.shape[-1] < 3000: processed_inputs = self.processor( inputs, return_tensors="pt", sampling_rate=self.asr_params.sampling_rate, ) - 长音频场景(可选):如果确认音频超过 30 秒,请参考官方模型卡(Distil-Whisper)中的 chunked 或 sequential 生成策略代码。此时才需要传递
condition_on_prev_tokens、logprob_threshold等参数。 - 标记输出(用户补充):若需要拿到文本而非 token,请用
processor.batch_decode(result_tokens, skip_special_tokens=True)进行解码。
验证方法
修改后再运行同样的批处理代码,应不再抛出长度不匹配或 model_kwargs 相关错误。确认输出的文本长度与音频转写内容一致,且若使用 GPU 应能观察到明显的批处理加速效果。
参考来源
huggingface/transformers #30740
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


