Python:ValueError:对象对于所需数组来说太深。我该如何解决这个问题?

问题描述 投票:0回答:1

VScode 在第 12 和 22 行显示错误。这是代码。

from scipy.io import wavfile
import numpy as np

def change_pitch(input_file, output_file, semitones, nsemitones):
    # Read the .wav file
    sample_rate, data = wavfile.read(input_file)
    
    # Define the pitch shift factor
    pitch_factor = 2 ** (semitones / nsemitones)
    
    # Apply pitch shift
    shifted_data = np.interp( np.arange(0, len(data), pitch_factor),np.arange(0, len(data)),data).astype(data.dtype)
    
    # Write the modified data to a new .wav file
    wavfile.write(output_file, sample_rate, shifted_data)

#Test usage
input_file = "rhodes.wav"
output_file = "output.wav"
semitones_to_change = 10  # Change this value according to your requirement
nsemitones = 12
change_pitch(input_file, output_file, semitones_to_change, nsemitones)

以下是错误:

 File "C:\Users\hp\OneDrive\Bureau\useless fucking MIDi\python.py", line 12, in change_pitch
    shifted_data = np.interp( np.arange(0, len(data), pitch_factor),np.arange(0, len(data)),data).astype(data.dtype)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
line 22, in <module>
    change_pitch(input_file, output_file, semitones_to_change, nsemitones)
ValueError: object too deep for desired array

我想将“rhodes.wav”的频率更改为 c4 而不是 d3

python numpy scipy
1个回答
0
投票

作者在这里。 wav 文件的频道过多。您需要从立体声转换为单声道,或者为每个通道制作一个。要从立体声转换为单声道,您需要在第 6 行之后添加此代码。

if len(data.shape) > 1:
    data = data.mean(axis=1)

但是,如果你想对每个通道进行移动,则需要创建一个 for i in range[1,len(data)] 循环,然后使用

合并它们

导入波 def组合_wav_文件(输出文件,输入文件): 使用wave.open(input_files[0],'rb')作为wave_file: params = wave_file.getparams() 将wave.open(output_file[0],'wb') 作为wave_file: 参数 = 输出.setparams(参数) 对于 input_files 中的文件: 将wave.open(file, 'rb') 作为wave_file: 数据 = wave_file.readframes(wave_file.getnframes) 输出.writeframes(数据) 我希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.