如何正确使用pitch_shift(librosa)?

tom*_*omm 1 python audio pitch-shifting librosa

我尝试使用librosa 中的librosa 和pitch_shift。我录制了一些声音并使用了以下代码:

sampling_rate= 44100
y, sr = librosa.load(directory, sr=sampling_rate) # y is a numpy array of the wav file, sr = sample rate

y_shifted = librosa.effects.pitch_shift(y, sr, n_steps=4, bins_per_octave=24)  # shifted by 4 half steps
librosa.output.write_wav(directory, y_shifted, sr=sampling_rate, norm=False)
Run Code Online (Sandbox Code Playgroud)

它工作得很好 - 几乎。

我在新声音中听到一些噪音(在变调之后)

有什么我需要使用的东西吗?

不带平移:

https://vocaroo.com/i/s1qEEDvzcUHN

使用平移(n_steps = 4):

https://vocaroo.com/i/s0cOiC0cFJSB

hen*_*rik 5

音高移动通常涉及STFT,即沿频率轴的幅度谱的移动\xe2\x80\x94,然后通过Griffin-Lim算法(Quora-关于 Griffin-Lim 工作原理的解释)进行信号重建。

\n\n

问题是,当我们移动幅度谱时,我们只是这样做\xe2\x80\x94并忽略相位!Griffin-Lim 试图找到一种合理的解决方案,以在重建时域信号时找到正确的相位,但通常只是这样:一种合理的解决方案,而不是完美的解决方案。这就是为什么你会听到金属声。这就是信号的相位不太正确(也称为“相位”)。

\n\n

我相信你的函数调用librosa是完全没问题的。它可能不是地球上最伟大的实施。尝试一下PyRubberband。它基于Rubberband(一个C++库)并享有良好的声誉

\n