分享一个 Python 处理音频的库

以前我们介绍过 moviepy,它是一个处理视频的第三方库,基于 ffmpeg。那么本次来分享一个处理音频的库 pydub,它同样是对 ffmpeg 进行的一个封装。

既然是封装,那就说明实际处理音频的还是 ffmpeg,所以 pip install pydub 之后,我们还要安装 ffmpeg,直接去官网下载即可。

然后将这些可执行文件所在的目录配置到环境变量中就可以了。

打开音频文件

音频有很多种格式,比如 wav、mp3、ogg 等等,只要是 ffmpeg 支持的文件格式都可以打开,而 ffmpeg 基本支持所有主流的音频格式。

from pydub import AudioSegment

1. 打开 mp3 文件
AudioSegment.from_mp3("1.mp3")
1. 打开 wav 文件
AudioSegment.from_wav("1.wav")
1. 打开 ogg 文件
AudioSegment.from_ogg("1.ogg")

1. 以上所有方法都调用了 from_file,等价于
AudioSegment.from_file("1.mp3", "mp3")
AudioSegment.from_file("1.wav", "wav")
AudioSegment.from_file("1.ogg", "ogg")
1. 由于 mp3、wav、ogg 文件很常见,所以有单独的方法
1. 但还有不常见的音频格式,比如苹果手机自带的录音软件导出的就是 m4a 格式
1. 此时就只能使用 from_file 打开了
AudioSegment.from_file("1.m4a", "m4a")

注意:在读取文件的时候,格式一定要匹配,否则报错。举个例子:

from pydub import AudioSegment

try:
    AudioSegment.from_wav("高梨康治 - 百鬼夜行.mp3")
except Exception as e:
    print(e)
"""
Decoding failed. ffmpeg returned error code: 1

Output from ffmpeg/avlib:

b'...Invalid data found when processing inputrn
"""

我们的音频是 mp3 格式的,但是却调用了 from_wav,所以会报错。当然也不要觉得将文件扩展名改成 wav 就万事大吉了,因为文件的类型取决于它存储的字节流,而不是扩展名。

from pydub import AudioSegment

song = AudioSegment.from_mp3("高梨康治 - 百鬼夜行.mp3")
print(song) 
"""

"""

返回的是一个 AudioSegment 对象,它就是音频读取之后的结果,通过该对象我们可以对音频进行各种操作,比如增加音量、淡入淡出等等。

并且这些操作都是链式的,每一个操作都会返回一个新的对象,不会修改原来的对象。所以我们在操作的时候,可以一直写下去,比如 song.xxx.xxx,不用每一次操作都重新赋值一个变量。

注意:pydub 做的任何操作,只要和时间相关,那么单位都是毫秒。

下面我们来看看它都支持哪些操作。

截取某一个片段