快速结论:当输入音频波形里出现哪怕一个非有限值(NaN/Inf),部分音频特征提取器会因对整个波形统计量做归一化,把全矩阵变成 NaN,而 ASR pipeline 仍会静默输出形如 '0' 的转写结果,不报错也不警告。优先排查数据管线里是否混入了损坏样本,并确认所用 checkpoint 的特征提取配置是否启用了归一化。
适用环境:Issue 中已确认:transformers 5.7.0、torch 2.11.0、numpy 1.26.4、Python 3.12、macOS、CPU。涉及模型:openai/whisper-tiny、facebook/wav2vec2-base-960h、facebook/hubert-large-ls960-ft、microsoft/wavlm-base。
最快修复方案:暂无确认的一步修复方案。Issue 中提出的候选修复(在特征提取器内对非有限波形抛 ValueError、改用 np.nanmax 做动态范围下限、或增加警告)均未合并或验证;维护者建议先自行确认该 bug 真实且重要,再提交 PR 评审。
注意事项:该 Issue 已被标记 stale 并关闭,无已合并修复;microsoft/wavlm-base 不受影响是因为其配置 do_normalize=False,并非代码路径差异,所以同一 AutoFeatureExtractor 调用下不同 checkpoint 行为会不一致。修复方向若改为直接抛错,属于行为变更,会影响依赖“垃圾进垃圾出”的现有调用方。
问题场景
在使用 Transformers 的音频特征提取器处理波形,并接到自动语音识别(ASR)pipeline 时触发。典型案例是批量处理生产音频(丢包、重采样失败、对零能量归一化窗口做除法、解码被截断等都可能产生非有限样本)。报告者的复现方式是:构造一段 16000 采样、仅在下标 8000 处放一个 np.nan 的波形,先调用 WhisperFeatureExtractor 提取 input_features,再调用 pipeline("automatic-speech-recognition", model="openai/whisper-tiny", device="cpu")。
后续讨论确认这并非 Whisper 独有:任何对整段波形统计量做归一化的音频特征提取器都可能有同样的放大效应,是否发生取决于 checkpoint 的配置而非提取器类本身。
报错原文
WhisperFeatureExtractor: one non-finite input sample makes the entire feature matrix NaN, and the pipeline transcribes it silently
input non-finite samples : 1 / 16000
output NaN fraction : 1.0
transcription : '0'
讨论中给出的不同 checkpoint 对照结果(同样的输入,16000 个采样中 1 个 NaN,transformers 5.7.0):
model extractor NaN fraction out
openai/whisper-tiny WhisperFeatureExtractor 1.000
facebook/wav2vec2-base-960h Wav2Vec2FeatureExtractor 1.000
facebook/hubert-large-ls960-ft Wav2Vec2FeatureExtractor 1.000
microsoft/wavlm-base Wav2Vec2FeatureExtractor 0.000
原因分析
根因是动态范围下限与归一化统计量对非有限值的放大效应,存在两种机制、表现相同:
- Whisper 路径
_np_extract_fbank_features中的np.maximum(log_spec, log_spec.max() - 8.0):只要有一个 NaN,log_spec.max()即为 NaN,而np.maximum(x, nan)按元素返回 NaN,于是 80 × 3000 的每个 bin 都被污染。torch 路径同一行同样如此。 - Wav2Vec2 / HuBERT 路径的
zero_mean_unit_var_norm:(x - x.mean()) / np.sqrt(x.var() + 1e-7),其中mean()与var()都为 NaN,整段被破坏。
受影响的 checkpoint 会把 0.006% 的坏点放大成 100% 的输出损坏;而 microsoft/wavlm-base 用的是同一个 Wav2Vec2FeatureExtractor 类却不受影响,原因是其配置为 do_normalize=False,而 wav2vec2-base-960h 与 hubert-large-ls960-ft 为 do_normalize=True。因此“是否触发”取决于 checkpoint 配置,API 层面没有任何提示。
真正值得关注的是静默性:generate() 在全 NaN 特征上仍会输出 '0',下游无法与真实转写区分。相同行为对全 NaN、全 inf 以及 float("inf") 输入也成立。
环境排查
- transformers 版本(Issue 中为 5.7.0)。
- torch 版本(Issue 中为 2.11.0)与 numpy 版本(Issue 中为 1.26.4)。
- Python 版本(Issue 中为 3.12)、操作系统与运行设备(macOS、CPU)。
- 具体 checkpoint 及其特征提取器配置,重点确认
do_normalize的值。 - 输入音频的有限性:统计 NaN/Inf 样本数量与占比。
- 提取结果
input_features的 NaN 比例。 - 是否使用
AutoFeatureExtractor统一加载不同 checkpoint(同一调用下行为可能不一致)。
解决步骤
- 在数据进入特征提取器前做一次有限性校验,统计非有限样本数量,确认是否属于本问题(报告者用
np.isfinite统计输入非有限样本数)。 - 提取特征后立即检查
input_features的 NaN 比例。若输入非有限占比极小而输出 NaN 比例为 1.0,即命中该放大效应。 - 确认所用 checkpoint 的
do_normalize配置。讨论显示相同类在不同配置下结果完全不同。 - 在调用链上对非有限输入统一拦截或替换,避免把损坏波形送进特征提取器与 ASR pipeline。
- 若希望从库层面解决,可优先尝试 Issue 中提出的方向:在特征提取器内做有限性校验(抛
ValueError)、用np.nanmax计算动态范围下限使损坏局限在受影响帧,或比照现有采样率不匹配警告增加警告。三者均未合并,需自行评估行为变更风险。 - 注意不要把全 NaN 转写结果当作有效输出使用,批量场景应对转写结果附加质量标记。
验证方法
构造与复现相同的输入:16000 个采样、仅一处非有限值。分别打印输入非有限样本数与输出 NaN 比例,确认是否由 1 个坏点放大为 NaN 比例 1.0;再对 ASR pipeline 的输出做同样检查,确认其是否仍返回不带错误与警告的转写文本。若已加入输入校验或替换逻辑,应验证此时不再出现全 NaN 特征,且转写结果不再来自损坏输入。
讨论中还提到一个相关但独立的现象:零长度数组会被填充到 30 秒并转写为 ' you',而不是被拒绝,不在本 Issue 的修复范围内,验证时不要混为一谈。
参考来源
huggingface/transformers #47885
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Bug]: assistant_tokens_mask misaligned after multimodal placeholder expansion](https://www.chat-gpts.plus/wp-content/uploads/2026/09/57223-39345890-768x403.jpg)

