运行Python音频频谱分析代码时遇ValueError: reshape数组失败求助
解决WAV文件读取时的reshape错误
错误原因
报错ValueError: cannot reshape array of size 881999 into shape (2)的核心问题是:scipy识别到你的WAV文件为双声道,但实际读取到的原始音频数据总长度(881999)无法被声道数(2)整除,导致无法转换为(采样数, 声道数)的二维数组。大概率是文件损坏,或是该WAV不符合标准PCM格式。
解决方案
1. 先检查音频文件完整性
用Windows自带录音机或Audacity等工具打开1500.wav,确认:
- 文件能否正常播放
- 查看声道数、采样深度、总采样数是否匹配(总采样数×声道数×采样深度/8 应等于音频数据部分的字节数)
若文件损坏,重新获取或修复该音频文件。
2. 替换更鲁棒的音频读取库(推荐)
scipy的wavfile对非标准WAV支持有限,改用librosa库读取,它能自动处理多数格式兼容问题:
步骤1:安装librosa
pip install librosa
步骤2:修改代码读取逻辑
替换原代码中wavfile.read的部分:
# 替换原scipy.io.wavfile的导入 import librosa # 读取音频:sr=None保留原采样率,mono=True自动转单声道 data, frequency = librosa.load(audio_file, sr=None, mono=True) # 截取前4096个采样点 data = data[0:4096]
3. 修复scipy读取逻辑(坚持用scipy时)
如果不想更换库,可以手动处理读取异常,修正数据长度:
frequency, data = wavfile.read(str(audio_file)) # 处理双声道数据长度不匹配的情况 if len(data.shape) == 1 and (len(data) % 2) != 0: # 截断到能被2整除的长度,再转为双声道格式 data = data[:-1].reshape(-1, 2) # 转单声道(取左声道) data = data[:, 0] elif len(data.shape) > 1: # 正常双声道直接转单声道 data = data[:, 0] data = data[0:4096]
4. 适配单声道的频谱分析逻辑
原代码的db_fft函数仅支持单声道一维数组,所以无论用哪种方式读取,都要确保传入的data是一维数组,否则会出现维度不匹配的后续错误。
内容的提问来源于stack exchange,提问作者ismail
相关产品推荐
相关产品推荐

