首页 > 解决方案 > 如何正确使用 pitch_shift (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)

它工作正常 - 几乎。

我在我的新声音中听到一些噪音(在 pitch_shifting 之后)

有什么我需要使用的吗?

无班次:

https://vocaroo.com/i/s1qEEDvzcUHN

随着班次(n_steps = 4):

https://vocaroo.com/i/s0cOiC0cFJSB

标签: pythonaudiolibrosapitch-shifting

解决方案


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

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

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


推荐阅读