Python报错ValueError: object too deep for desired array的修复及音频变调需求
解决音频变调代码的ValueError问题并实现D3转C4需求
问题原因
报错ValueError: object too deep for desired array是因为你的音频文件为立体声(双声道),wavfile.read()返回的data是二维数组(形状为(采样数, 2)),而np.interp仅支持一维数组输入,无法直接处理二维数据。
解决方案
需要对每个声道单独进行音高调整,之后再合并为多通道数据。同时保持音频数据的原始类型,避免写入WAV文件时出现格式错误。
另外确认半音偏移量:D3到C4的音高差为**+10个半音**,你设置的semitones_to_change = 10完全正确——2^(10/12)≈1.78,正好对应D3(146.83Hz)到C4(261.63Hz)的频率比例。
修改后的完整代码
from scipy.io import wavfile import numpy as np def change_pitch(input_file, output_file, semitones, nsemitones): # 读取WAV文件 sample_rate, data = wavfile.read(input_file) # 计算音高变换因子 pitch_factor = 2 ** (semitones / nsemitones) # 处理单声道/多声道情况 if len(data.shape) == 1: # 单声道直接处理 shifted_data = np.interp( np.arange(0, len(data), pitch_factor), np.arange(0, len(data)), data ).astype(data.dtype) else: # 多声道:逐个处理每个声道 shifted_channels = [] for channel in data.T: shifted_channel = np.interp( np.arange(0, len(channel), pitch_factor), np.arange(0, len(channel)), channel ).astype(channel.dtype) shifted_channels.append(shifted_channel) # 合并声道 shifted_data = np.column_stack(shifted_channels) # 写入输出文件 wavfile.write(output_file, sample_rate, shifted_data) # 测试:D3转C4 input_file = "rhodes.wav" output_file = "output.wav" semitones_to_change = 10 # D3到C4的半音差 nsemitones = 12 change_pitch(input_file, output_file, semitones_to_change, nsemitones)
关键修改点
- 增加多声道判断逻辑:通过
len(data.shape)区分单声道/立体声,对每个声道单独执行np.interp - 使用
data.T转置数组,方便遍历每个声道 - 处理完成后用
np.column_stack合并声道,恢复原始多通道结构 - 保留
astype(data.dtype)确保输出数据类型与输入一致,避免音频失真或写入错误
注意事项
- 若音频为其他多声道格式(如5.1环绕声),代码可自动适配处理每个声道
np.interp实现的是简单线性插值变调,存在轻微音质损失;若追求更高质量,可考虑使用librosa库的pitch_shift函数(当前方案已满足基础变调需求)
内容的提问来源于stack exchange,提问作者user24715855
相关产品推荐
相关产品推荐

