代码之家  ›  专栏  ›  技术社区  ›  tomm

如何正确使用音高变换(librosa)?

  •  0
  • tomm  · 技术社区  · 5 年前

    我试着用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)
    

    它工作得很好——差不多。

    我听到我的新声音有点嘈杂(在音高变换后)

    有什么我需要用的吗?

    https://vocaroo.com/i/s1qEEDvzcUHN

    使用移位(n_步数=4):

    https://vocaroo.com/i/s0cOiC0cFJSB

    0 回复  |  直到 5 年前
        1
  •  0
  •   Hendrik    5 年前

    变桨通常包括 STFT ,通常是沿着频率轴的幅度谱,然后通过 Griffin-Lim -算法( Quora-explanation 关于格里芬·林的工作原理)。

    问题是,当我们改变幅度谱时,我们就这样做,忽略相位!格里芬林试图找到一个合理的解决方案,找到正确的相位时,重建的时域信号,但它往往只是:一个 合理的 解决方案,而不是 很完美 一个。这就是为什么你会听到金属的鼻音。这就是你的信号不太正确的相位(也称为“相位”)。

    我相信你的函数调用 librosa 完全没问题。这可能不是地球上最伟大的实现。给予 PyRubberband 一次尝试。它基于 Rubberband (C++库)并具有 good reputation .

    推荐文章