You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复音频分帧代码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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 21:06:10