RuntimeError: The shape of the mask [1, 9476] at index 1 does not match the shape of the indexed tensor [1, 9477, 3584] at index 1

这个报错通常出现在用 VibeVoice-ASR 转写较长音频(24 kHz 采样下超过约 11.65 分钟、即样本数超过 2**24)时,processor 与 model 对音频占位 token 数量的浮点计算精度不一致,导致 mask 与特征张量形状对不上;优先排查输入音频长度是否是 hop(

快速结论:这个报错通常出现在用 VibeVoice-ASR 转写较长音频(24 kHz 采样下超过约 11.65 分钟、即样本数超过 2**24)时,processor 与 model 对音频占位 token 数量的浮点计算精度不一致,导致 mask 与特征张量形状对不上;优先排查输入音频长度是否是 hop(3200 样本)的整数倍。

适用环境:Issue 已确认环境为 transformers 5.6.2、Linux(WSL2)、Python 3.11.15、PyTorch 2.11.0+cu130、CUDA 13.0、GPU 可用;模型为 microsoft/VibeVoice-ASR-HF,也在同架构的 NF4 量化副本上复现。该问题在 2026-09-15 的 main 分支上仍存在。

最快修复方案:暂无确认的一步修复方案。Issue 中已验证可行的客户端规避方法:给输入音频末尾补少量静音,使 24 kHz 下的样本数正好是 3200 的整数倍;若源音频是 16 kHz,则补齐到 6400 样本的整数倍(最多 0.4 秒静音)。官方修复由 PR #48864 合并处理。

注意事项:补静音只是绕过触发条件,不改变 processor/model 计算逻辑;只要样本数仍落在会引发 float32 与 float64 ceil 分歧的区间,问题仍可能出现。升级到包含 #48864 的版本后应重新验证。

问题场景

用户使用 Transformers 的 VibeVoiceAsrForConditionalGeneration.generate() 转写单条较长音频(约 21 分钟),在处理器准备输入、模型构建音频特征与 padding mask 的交界处触发崩溃。该问题与量化无关,原始权重和 NF4 量化副本均可复现。

报错原文

RuntimeError: The shape of the mask [1, 9476] at index 1 does not match the shape of the indexed tensor [1, 9477, 3584] at index 1

原因分析

processor 与 model 用不同浮点精度计算音频占位 token 数量,长音频下两者结果不一致:

  • VibeVoiceAsrProcessor.__call__np.ceil(float64)计算:num_audio_tokens = np.ceil(audio_lengths / audio_kwargs["pad_to_multiple_of"]).astype(int)
  • VibeVoiceAsrModel.get_audio_featurestorch.ceil 计算 float32 商:num_audio_tokens = torch.ceil(padding_mask.sum(dim=-1) / self.config.acoustic_tokenizer_encoder_config.hop_length).to(torch.int64)。由于 padding_mask.sum(dim=-1) 是 int64,真除法会被提升到默认 float32。

float32 只有 24 位有效数字,当样本数超过 2**24(24 kHz 下约 11.65 分钟)时并非每个样本数都能精确表示。若样本数刚好略高于 3200 样本 hop 的整数倍,float32 商可能向下舍入到 hop 边界,导致 torch.ceilnp.ceil 少 1。processor 因此生成 N+1 个占位 token 和 padding 特征,而模型只为 N 个 token 构建 mask,最终在 combined_features[padding_mask] 处抛出形状不匹配。

环境排查

  • 确认 transformers 版本(Issue 中为 5.6.2,main 分支同样受影响)。
  • 确认 Python 版本(Issue 中为 3.11.15)。
  • 确认 PyTorch、CUDA 与 GPU 环境(Issue 中为 PyTorch 2.11.0+cu130、CUDA 13.0)。
  • 确认模型是否为 microsoft/VibeVoice-ASR-HF 或同架构的量化副本。
  • 检查输入音频在 24 kHz 下的样本数是否超过 2**24,以及是否为 3200 的整数倍。

解决步骤

  1. 先确认触发条件:计算音频在 24 kHz 下的样本数,观察是否满足 k * 3200 + 1 且该值大于 2**24。可用 Issue 中的最小验证代码,不加载模型权重即可看到 processor 与 model 计数分歧:
    import numpy as np
    import torch
    
    hop = 3200
    samples = 9476 * hop + 1  # 30_323_201 samples at 24 kHz ~= 21.06 min
    processor_count = int(np.ceil(samples / hop))                                    # 9477
    model_count = int(torch.ceil(torch.tensor([samples], dtype=torch.int64) / hop))  # 9476
    print(processor_count, model_count)  # 9477 9476 -> mismatch
  2. 临时规避:给音频末尾补静音,使 24 kHz 下的样本数正好是 3200 的整数倍。Issue 中已验证 30,323,201 样本会崩溃(processor 计 9477,model 的 float32 ceil 计 9476),而补齐到 30,326,400 样本后两边计数一致并能正常转写,最多增加约 0.4 秒静音。
  3. 如果源音频为 16 kHz,则补齐到 6400 样本的整数倍,对应效果相同。
  4. 升级到包含 PR #48864 的 Transformers 版本(该 PR 由 @de-tre 确认修复了本 Issue,随后被合并)。

验证方法

用同一段长音频分别走修复前与修复后的路径,确认不再抛出 RuntimeError: The shape of the mask ... does not match ...,并且 generate() 能正常输出转写结果。也可先用上面的最小示例检查 processor 计数与 model 侧的 torch.ceil 计数是否一致。Issue 中已确认补静音后计数一致且转写正常,并确认 #48864 修复有效。

参考来源

huggingface/transformers #48835

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 24311

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注