如何正确使用pitch_shift(librosa)?

How to properly use pitch_shift (librosa)?

我尝试使用 librosa 和 pitch_shift 来自 librosa。 我录了一些我的声音并使用了这个代码:

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)

它工作正常 - 差不多。

我听到我的新声音有些杂音(pitch_shifting 后)

有什么需要用的吗?

没有班次:

https://vocaroo.com/i/s1qEEDvzcUHN

带班次(n_steps = 4):

https://vocaroo.com/i/s0cOiC0cFJSB

变调通常涉及 STFT, the shift—usually of a magnitude spectrum along the frequency axis, and then signal reconstruction via the Griffin-Lim-algorithm (Quora-explanation Griffin-Lim 的工作原理)。

问题在于,当我们移动幅度谱时,我们就是这么做的——而忽略了相位! Griffin-Lim 在重建时域信号时试图找到一个合理的解决方案来找到正确的相位,但往往只是:一个合理的解决方案,而不是完美一个。这就是为什么您会听到这种金属的声音。那是你的信号相位不太正确(也称为 "phasiness")。

我相信您对 librosa 的函数调用是完全正确的。它可能不是地球上最伟大的实现。给PyRubberband a try. It's based on Rubberband (a C++ library) and has a good reputation.