如何使用 Pydub 改变音频播放速度?

8
我是音频编辑库Pydub的新学习者。我想使用Pydub(比如.wav/mp3格式文件)改变一些音频文件的播放速度,但是我不知道该怎么做。我看到唯一可能解决这个问题的模块是effect.py中的speedup模块,但是没有关于如何调用它的说明。
请问有人能够详细解释如何在Pydub中完成此任务吗?非常感谢!
(一个相关问题:Pydub - 如何在不改变播放速度的情况下更改帧率,但是我想要做的是在不改变音频质量的情况下改变播放速度。)

具体来说,我不理解 speedup(seg, playback_speed=1.5, chunk_size=150, crossfade=25) 中的参数,特别是 chunk_sizecrossfade。有没有人能够友好地解释一下?谢谢! - itsMe
3
块大小和交叉淡入淡出是可选的 - 你可以直接忽略它们 :) - 播放速度为1.5将比原始声音快1.5倍。它的工作方式是将声音分成块(默认为150毫秒长),然后重叠它们以缩短总播放时间(默认情况下交叉淡入淡出为25毫秒)。 - Jiaaro
4个回答

6
from pydub import AudioSegment
from pydub import effects

root = r'audio.wav'
velocidad_X = 1.5 # No puede estar por debajo de 1.0

sound = AudioSegment.from_file(root)
so = sound.speedup(velocidad_X, 150, 25)
so.export(root[:-4] + '_Out.mp3', format = 'mp3')

1
这比我找到的其他解决方案要好得多!谢谢。 - Jesse Vincent
2
这似乎确实可以工作,但质量太差了。 - etayluz

5

可以使用 pyrubberband 包来实现这一点,它需要 rubberband 库,该库可以在保持音调和高质量的同时拉伸音频。我能够在 MacOS 上使用 brew 安装该库,并且在 Ubuntu 上使用 apt install 进行安装。要进行极端拉伸,请查看 PaulStretch。

brew install rubberband

使用librosa包可以很简单地完成这项任务。

import librosa
import pyrubberband
import soundfile as sf

y, sr = librosa.load(filepath, sr=None)
y_stretched = pyrubberband.time_stretch(y, sr, 1.5)
sf.write(analyzed_filepath, y_stretched, sr, format='wav')

为了让pyrubberband直接与pydub的AudioSegment配合使用而不需要librosa,我修改了这个函数:
def change_audioseg_tempo(audiosegment, tempo, new_tempo):
    y = np.array(audiosegment.get_array_of_samples())
    if audiosegment.channels == 2:
        y = y.reshape((-1, 2))

    sample_rate = audiosegment.frame_rate

    tempo_ratio = new_tempo / tempo
    print(tempo_ratio)
    y_fast = pyrb.time_stretch(y, sample_rate, tempo_ratio)

    channels = 2 if (y_fast.ndim == 2 and y_fast.shape[1] == 2) else 1
    y = np.int16(y_fast * 2 ** 15)

    new_seg = pydub.AudioSegment(y.tobytes(), frame_rate=sample_rate, sample_width=2, channels=channels)

    return new_seg

谢谢 - 你有关于 pyrubberband/librosapydub 之间的互操作性的任何想法吗? - lefft
1
@lefft 抱歉我不知道。自从发布这个答案以来,我没有使用过其中的任何一个。 - tatarkin

1
我知道现在已经很晚了,但我写了一个程序可以将mp3转换成不同的播放速度。
首先需要将.MP3文件转换成.Wav格式,因为PYRubberBand仅支持.wav格式。然后同时拉长时间和音高以避免花栗鼠效应。
import wave
import sys
from pydub import AudioSegment
#sound = AudioSegment.from_file("deviprasadgharpehai.mp3")
sound = AudioSegment.from_mp3(sys.argv[1])
sound.export("file.wav", format="wav")

print(sys.argv[1])

import soundfile as sf
import pyrubberband as pyrb
y, sr = sf.read("file.wav")
# Play back at extra low speed
y_stretch = pyrb.time_stretch(y, sr, 0.5)
# Play back extra low tones
y_shift = pyrb.pitch_shift(y, sr, 0.5)
sf.write("analyzed_filepathX5.wav", y_stretch, sr, format='wav')

sound = AudioSegment.from_wav("analyzed_filepathX5.wav")
sound.export("analyzed_filepathX5.mp3", format="mp3")

# Play back at low speed
y_stretch = pyrb.time_stretch(y, sr, 0.75)
# Play back at low tones
y_shift = pyrb.pitch_shift(y, sr, 0.75)
sf.write("analyzed_filepathX75.wav", y_stretch, sr, format='wav')

sound = AudioSegment.from_wav("analyzed_filepathX75.wav")
sound.export("analyzed_filepathX75.mp3", format="mp3")

# Play back at 1.5X speed
y_stretch = pyrb.time_stretch(y, sr, 1.5)
# Play back two 1.5x tones
y_shift = pyrb.pitch_shift(y, sr, 1.5)
sf.write("analyzed_filepathX105.wav", y_stretch, sr, format='wav')

sound = AudioSegment.from_wav("analyzed_filepathX105.wav")
sound.export("analyzed_filepathX105.mp3", format="mp3")

# Play back at same speed
y_stretch = pyrb.time_stretch(y, sr, 1)
# Play back two smae-tones
y_shift = pyrb.pitch_shift(y, sr, 1)
sf.write("analyzed_filepathXnormal.wav", y_stretch, sr, format='wav')

sound = AudioSegment.from_wav("analyzed_filepathXnormal.wav")
sound.export("analyzed_filepathXnormal.mp3", format="mp3")

请确保安装以下内容:

Wave、AudioSegment、FFmpeg、PYRubberBand、Soundfile

使用此运行程序时,请输入以下命令:

python3 文件名.py mp3文件名.mp3


你好,为什么 y_stretch 没有传递到 pitch_shift 函数中?当你写出结果时,似乎只使用了 y_stretch。能否请您解释一下它是如何工作的? - Jun

0

如果要改变音频的速度而不改变音调(或制造松鼠效果),可以使用以下代码。

from pydub import AudioSegment
from pydub.effects import speedup

audio = AudioSegment.from_mp3(song.mp3)
new_file = speedup(audio,1.5,150)
new_file.export("file.mp3", format="mp3")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接