原帖在树莓派 4、Python 3.9.2 的 torch.from_numpy(spect) 失败,同时受 librosa/numba 的旧 NumPy 约束:
RuntimeError: Numpy is not available
从三个层次定位 NumPy 桥接失败
先看 NumPy 自己能否 import,再看 torch.from_numpy 的最小输入,最后才看真实频谱。原题是 ARM 平台并有 numba 版本约束;若最小数组也失败,重写音频特征提取通常不能修复二进制接口。原题没有足够版本信息,不能可靠给出固定降级命令。
不能只建议“升级到最新 NumPy”。先检查同一个解释器中的导入结果和最小桥接,区分 NumPy 本身不可导入、ABI 不匹配,还是仅音频数据有问题。
import sys
import platform
print("josh050608")
print("python/arch:", sys.executable, platform.machine())
import numpy as np
print("numpy:", np.__version__, np.__file__)
import torch
print("torch:", torch.__version__, torch.__file__)
print(torch.from_numpy(np.zeros(2, dtype=np.float32)))
保留 import 阶段的完整警告。若 NumPy 自己导入失败,先修复它;若 NumPy 正常但最后一行失败,说明 torch 与 NumPy 的桥接环境有问题,不是 spect.double() 的问题。
在同一虚拟环境执行 python -m pip show torch numpy numba librosa 和 python -m pip check,结合各包该版本的约束找交集。原题没有给出全部包版本和 torch 构建来源,无法可靠指定一个万能版本号。
对于现在遇到 NumPy 2 ABI 报错的读者,NumPy 官方建议升级兼容的依赖构建,或在确实受旧依赖约束时退回兼容的 NumPy 1.x;这不能反推 2022 年原帖就是 NumPy 2 问题。在 ARM 平台还要核对 wheel 架构与 Python 标签。
先在独立环境验证版本组合,再迁移项目。最后验证上述最小桥接成功,并检查真实 spect.shape、spect.dtype,再执行音频流程。不要为了绕过报错直接换掉所有依赖或把数组转列表当长期解决办法。
把依赖交集变成可核对的记录
在当前音频工程终端执行以下命令,保存完整输出;它们不会安装或卸载包:
python -m pip show torch numpy numba librosa
python -m pip check
python -m pip debug --verbose
最后一个命令能列出解释器支持的 wheel 标签,ARMv7、aarch64 和 x86_64 不可混为一谈。若 torch 来自第三方 ARM 构建,还应保留构建来源及其 NumPy ABI 要求;pip check 只检查声明的依赖关系,不执行桥接代码。
最小桥接通过后,再用下面的合成频谱测试 float32 与 double 两步。这里没有加载 librosa,是为了单独验证张量转换:
import numpy as np
import torch
spect = np.arange(24, dtype=np.float32).reshape(4, 6)
shared = torch.from_numpy(spect)
assert shared.dtype == torch.float32
spect_tensor = shared.double()
assert spect_tensor.dtype == torch.float64
assert spect_tensor.shape == (4, 6)
assert np.allclose(spect_tensor.numpy(), spect)
print("bridge shape/dtypes:", spect_tensor.shape, shared.dtype, spect_tensor.dtype)
若 import 时已有“编译时 NumPy 版本不匹配”警告,优先解决构建兼容性;若只有真实 spect 失败,则打印它的 dtype、布局、形状,检查是否为 object 数组或非支持类型。两类现象不能共用同一个升级建议。
选择版本时先求 torch、NumPy、numba、librosa 与当前 Python/架构的共同支持范围,在独立环境验证这个小例子和一次真实特征提取,再固定版本。原帖旧 numba 的上限要按该版本核对,不能当作 numba 永久只支持 NumPy<=1.20 的规则。
参考:原始求助帖;技术依据:torch.from_numpy(2.5)、NumPy 导入与 ABI 排错、pip 官方用法。