【问题标题】:Does pydub support pitch modulation?pydub 是否支持音调调制?
【发布时间】:2016-08-12 17:24:32
【问题描述】:

This old thread 似乎表明 pydub 的 AudioSegment._data 可以用来以某种方式计算声音的音高;不幸的是,这似乎是使用分配给未公开的Mpm 类的方法完成的。但是,如果可以从AudioSegment._data 中提取音高数据,那么有没有办法使用 pydub 将AudioSegment 的音高向上或向下移动?如果没有,是否有其他适用于 Python 2.7 的库可以?

【问题讨论】:

    标签: python python-2.7 pitch pydub pitch-shifting


    【解决方案1】:

    是的。今天花了大约 6 个小时解决这个问题后,我得到了它的工作。试试这个。请注意,我最初在最后遇到了爆裂声的问题,但这是由于我的特定文件的特殊性,而不是任何其他原因。

    import os
    from pydub import AudioSegment
    from pydub.playback import play
    
    
    cwd = os.getcwd()
    
    wavepath = cwd+"\\Soundfiles\\CritHit.WAV"
    
    sound = AudioSegment.from_file(wavepath, format="wav")
    
    play(sound)
    print(sound.frame_rate)
    
    # shift the pitch down by half an octave (speed will decrease proportionally)
    octaves = -0.5
    
    new_sample_rate = int(sound.frame_rate * (2.0 ** octaves))
    
    lowpitch_sound = sound._spawn(sound.raw_data, overrides={'frame_rate': new_sample_rate})
    
    #Play pitch changed sound
    play(lowpitch_sound)
    

    【讨论】:

    • 使用 Windows 的人,开发者建议使用 simpleaudio 库,播放功能不支持使用奇怪的采样率,因此无法正常工作。您可以尝试从源中删除 if 块然后安装。
    【解决方案2】:

    对于单声道,您可以使用此代码

    from pydub import AudioSegment
    import numpy as np
    import librosa
    
    def pitch_shift(sound, n_steps):
        y = np.frombuffer(sound._data, dtype=np.int16).astype(np.float32)/2**15
        y = librosa.effects.pitch_shift(y, sound.frame_rate, n_steps=n_steps)
        a  = AudioSegment(np.array(y * (1<<15), dtype=np.int16).tobytes(), frame_rate = sound.frame_rate, sample_width=2, channels = 1)
        return a
    
    sound = AudioSegment.from_mp3("ori.mp3")
    sound = pitch_shift(sound, 4)
    sound.export("shift.mp3")
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 2023-04-05
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多