如何正确设置帧与步长?(PyAudioAnalysis数组重塑错误问题)
问题:PyAudioAnalysis特征提取时帧与步长设置导致的数组重塑错误
问题场景
研究生毕设中使用PyAudioAnalysis分析音频文件,设置帧(frame)与步长(hop)时触发数组重塑错误,代码及运行输出如下:
运行代码
import numpy as np from pyAudioAnalysis import audioBasicIO from pyAudioAnalysis import ShortTermFeatures [Fs, x] = audioBasicIO.read_audio_file("/content/drive/MyDrive/audio.wav") print("Sample rate (Fs):", Fs) print("Total samples (x):", len(x)) frame_size = 0.1 * Fs hop_size = 0.05 * Fs print("Frame size:", frame_size) print("Hop size:", hop_size) try: [F, F_names] = ShortTermFeatures.feature_extraction(x, Fs, frame_size, hop_size) print("Feature extraction successful") except ValueError as e: print("Error in feature extraction:", e)
运行输出
Sample rate (Fs): 48000 Total samples (x): 478080 Frame size: 4800.0 Hop size: 2400.0 Error in feature extraction: cannot reshape array of size 9600 into shape (480,10)
解决方案
错误原因
- 音频声道问题:报错中的
9600 = 4800 * 2,说明目标音频是双声道立体声,而feature_extraction函数默认处理单声道音频,多声道数据会导致内部数组尺寸不匹配。 - 参数类型问题:帧长和步长代表采样点数量,必须为整数,当前计算得到的是浮点数(如
4800.0),会触发内部重塑逻辑错误。
修正后的代码
import numpy as np from pyAudioAnalysis import audioBasicIO from pyAudioAnalysis import ShortTermFeatures [Fs, x] = audioBasicIO.read_audio_file("/content/drive/MyDrive/audio.wav") # 将立体声转为单声道(取双声道均值) if len(x.shape) > 1: x = np.mean(x, axis=1) print("Sample rate (Fs):", Fs) print("Total samples (x):", len(x)) # 强制转换为整数,确保采样点数量为整数 frame_size = int(0.1 * Fs) hop_size = int(0.05 * Fs) print("Frame size:", frame_size) print("Hop size:", hop_size) try: [F, F_names] = ShortTermFeatures.feature_extraction(x, Fs, frame_size, hop_size) print("Feature extraction successful") print(f"Extracted features shape: {F.shape}") except ValueError as e: print("Error in feature extraction:", e)
验证说明
修正后代码完成两个关键处理:将双声道音频合并为单声道,同时将帧长、步长转为整数类型,可解决数组重塑错误,顺利完成特征提取。
内容的提问来源于stack exchange,提问作者박일영
相关产品推荐
相关产品推荐

