3

这个旧线程似乎表明 pydubAudioSegment._data可以用来以某种方式计算声音的音高;不幸的是,这似乎是使用分配给未公开Mpm类的方法完成的。也就是说,但是,如果可以从 中提取音高数据AudioSegment._data,那么有没有办法使用 pydub 来AudioSegment向上或向下移动 的音高?如果没有,是否有另一个 Python 2.7 库可以?

4

2 回答 2

4

是的。今天花了大约 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)
于 2017-06-23T22:13:49.143 回答
0

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

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")

于 2021-12-30T07:24:43.200 回答