如何修复音频分帧代码ValueError:无法将shape(2048,2050)数组广播到shape(2048)
错误原因
你触发该报错的核心原因是输入的audio是多声道音频(比如常见的双声道音频shape为(采样点数, 2)),而非单声道一维数组。你在切片取音频帧时保留了声道维度,导致切出来的片段shape为(2048, 声道数),自然无法塞入你预先定义的、仅适配单声道的frames[n](shape为(2048,))的位置。
修复方案
方案1:仅需处理单声道音频(最常用)
在调用分帧函数前先将多声道音频转为单声道即可,修改调用代码如下:
hop_size = 15 #ms FFT_size = 2048 # 新增:多声道转单声道,按声道维度取平均,也可以用audio[:, 0]取左声道、audio[:,1]取右声道 if len(audio.shape) > 1: audio = np.mean(audio, axis=1) audio_framed = frame_audio(audio, FFT_size=FFT_size, hop_size=hop_size, sample_rate=sample_rate) print("Framed audio shape: {0}".format(audio_framed.shape))
方案2:需要保留多声道处理
修改分帧函数,适配多声道的输入维度,修改后的函数代码如下:
def frame_audio(audio, FFT_size=2048, hop_size=10, sample_rate=44100): # hop_size in ms # 获取声道数,单声道时channel=1 channel = audio.shape[1] if len(audio.shape) > 1 else 1 # 仅对采样点维度做填充,声道维度不填充 pad_width = ((int(FFT_size / 2), int(FFT_size / 2)), (0, 0)) if channel>1 else int(FFT_size / 2) audio = np.pad(audio, pad_width=pad_width, mode='reflect') frame_len = np.round(sample_rate * hop_size / 1000).astype(int) frame_num = int((len(audio) - FFT_size) / frame_len) + 1 # 调整输出维度,适配多声道 frames = np.zeros((frame_num, FFT_size, channel)) if channel>1 else np.zeros((frame_num, FFT_size)) for n in range(frame_num): frames[n] = audio[n*frame_len:n*frame_len+FFT_size] return frames
调用后输出的audio_framed shape为(帧数, 2048, 声道数),可以保留所有声道的信息。
内容的提问来源于stack exchange,提问作者Mheey
相关产品推荐
相关产品推荐

