过滤WAV文件出现Value Error,多模块代码集成报错求助
integ(x)调用错误 首先把你遇到的错误信息整理出来:
fltrd() [[ 0 0] [ -1 0] [ 0 0] ..., [-65 -60] [-31 -52] [-45 -53]]
Traceback (most recent call last):
File "", line 1, in
fltrd()
File "C:/Users/vsecadesang/Desktop/5th year/2nd sem/SIGNLAB/PROJECT/etc/project.py", line 57, in fltrd
a2 = integ(x)
从错误里的数组输出[[0 0], [-1 0], ...]来看,这明显是二维的多通道音频数据(大概率是立体声的左右声道),而你的integ积分器函数应该是按照单通道一维数组写的,这就是核心矛盾。下面给你一步步的排查和解决方法:
第一步:先确认输入数据的状态
在调用integ(x)之前加一行调试代码,搞清楚x的真实情况:
print(f"输入x的维度:{x.shape},数据类型:{x.dtype}")
如果输出是类似(1024, 2)这样的结果,就坐实了是多通道数据的问题。
第二步:适配多通道数据的两种方案
方案1:让积分器支持多通道处理
修改你的integ函数,对每个声道单独做积分/低通滤波:
import numpy as np def integ(x, sample_rate): # 建议把采样率作为参数传入,避免全局变量问题 if len(x.shape) == 2: # 对每个声道分别计算积分,再还原成原形状 return np.array([np.cumsum(channel) / sample_rate for channel in x.T]).T else: # 单通道情况保持原有逻辑 return np.cumsum(x) / sample_rate
这样不管输入是单声道还是立体声,函数都能正常工作。
方案2:将多通道转为单声道处理
如果你的场景不需要保留双声道,可以直接把左右声道合并成单声道(比如取平均值):
# 在调用integ之前处理x x_mono = np.mean(x, axis=1) # 假设x的形状是(采样点数, 声道数) a2 = integ(x_mono)
第三步:额外检查数据类型问题
麦克风录制的音频数据通常是int16类型(范围-32768到32767),如果你的积分器逻辑是基于浮点计算的,需要先做类型转换:
# 将int16转为[-1, 1]范围的浮点型 x = x.astype(np.float32) / 32767.0
如果上面的方法还没解决,建议你检查integ函数内部是否有其他问题,比如有没有未定义的变量(比如sample_rate是不是全局可用)、数组索引越界之类的细节。
内容的提问来源于stack exchange,提问作者Markus

