楔子
我们有些时候可能会对音频格式进行一些转换,而python也提供了这样的库,叫pydub。下面我们来看看用法。
安装
安装这个库很简单,直接pip install pydub
即可,但是这个库非常简单,显然它不是处理音频的"幕后主使"。没错,真正处理音频的是ffmpeg,pydub只是封装了一些api。因此,我们要想处理音频,还需要ffmpeg。
ffmpeg下载地址可以网上搜索,下载完了将bin目录配置到环境变量中即可。
读取音频文件
下面来读取一个音频
import pydub
song = pydub.AudioSegment.from_mp3("幽閉サテライト - 加速する恋は谁にも止められない.mp3")
以上我们就读取了一个mp3格式的音频,当然支持的音频格式不止mp3,不同格式的音频对应不同的读取方法。
pydub.AudioSegment.from_mp3("song.mp3")
pydub.AudioSegment.from_flv("song.flv")
pydub.AudioSegment.from_ogg("song.ogg")
pydub.AudioSegment.from_raw("song.raw")
pydub.AudioSegment.from_wav("song.wav")
根据音频格式选择合适的方法即可,或者还有一种通用的方法。
pydub.AudioSegment.from_file("song.mp4", "mp3")
pydub.AudioSegment.from_file("song.mp4", "mp4")
pydub.AudioSegment.from_file("song.flv", "flv")
pydub.AudioSegment.from_file("song.wma", "wma")
pydub.AudioSegment.from_file("song.aiff", "aac")
通过from_file,显式的指定音频格式也是可以的,并且from_file还可以读取很多其它格式的音频,只要是ffmpeg支持的格式都行。但是说实话,最常用的还是mp3、ogg、wav
支持的操作
通过from_mp3将音频读取进来之后,可以做什么操作呢?
import pydub
# 变量song便保存了该音频流
song = pydub.AudioSegment.from_mp3("幽閉サテライト - 加速する恋は谁にも止められない.mp3")
"""
可以查看音频的各种属性,但是说实话,很多属性如果不是专门搞音频的,几乎用不到
其实很多本人也不是很了解,下面只介绍几个常用的
"""
# 获取channels
# 如果channels为1,那么表示音频是单声道(mono), 如果为2表示音频是立体声(stereo)
print(song.channels) # 2
# 使用的转化器,这里是ffmpeg
print(song.converter) # ffmpeg
# 查看该音频总共有多少秒,这首歌总共是3分58秒
print(song.duration_seconds) # 238.603514739229
# 打印音频的字节流,太长了,这里就不打印了
# print(song.raw_data)
# 我们可以对音频进行切片,切片之后还是一个音频。
# 所以这里的first_5_seconds、last_5_seconds和song都是一个类型
first_5_seconds = song[: 5 * 1000] # 默认以毫秒作为单位,这里截取前5秒
last_5_seconds = song[-5 * 1000:] # 截取后五秒
# 增加音量和减小音量,注意:这里不会影响原来的song
first_5_seconds += 6 # 增加6分贝
last_5_seconds -= 6 # 减小6分贝
# 我们可以直接将两个音频进行合并,合并之后还是一个音频
just_first_5_last_5 = first_5_seconds + last_5_seconds
# 那么它是可以导出的,至于怎么导出后面说
# 如果此时将just_first_5_last_5导出,那么该音频就只有开头5秒和结尾5秒,并且开头的音量增加了6分贝,结尾减少了6分贝
# 还可以实现交叉淡入淡出的效果,这里将两端音频拼接在了一起,并加上了交叉淡入淡出效果
with_style_first_5_last_5 = first_5_seconds.append(last_5_seconds, crossfade=1500)
# 并且还可以手动实现淡入淡出
_ = (first_5_seconds * 2).fade_in(2000).fade_out(3000)
# 我们将前五秒的音频变成两份拼接在一起,那么总共就是10秒钟。会在开始的两秒淡入、最后的3秒淡出
# 这里的每一步操作都会返回一个新的音频,因此可以直接进行链式操作
# 总之对音频操作,结果还是一个音频。所以它们都是可以导出的。
# 比如我们将两首歌合在一起,那么直接将两首歌读取进来,得到song1和song2
# 直接song1 + song2然后导出即可,是不是非常简单呢?当然音频的切片、淡入淡出什么的,得到的还是音频,也是可以直接导出的
导出音频
我们对音频做了操作之后,下面就是导出音频了。导出比较简单,直接一个export即可,指定文件名和格式。比如:
song.export("xxx.wav", format="wav")
import pydub
song = pydub.AudioSegment.from_mp3("幽閉サテライト - 加速する恋は谁にも止められない.mp3")
# 前5秒进行淡入,后10秒淡出,中间部分则是自动保持不变
# 然后保存为wav格式
song.fade_in(5000).fade_out(10000).export("幽閉サテライト - 加速する恋は谁にも止められない.wav")
此时我们就将音频导出了,这里文件名太长,因此后面没有显示,但我们生成的文件的确是wav的。
但还是有些不完美的地方,上面是原始音频,下面是我们导出的音频。有没有看到什么区别呢?对,一些歌曲的附加信息没了,那么可不可以在导出的时候加上呢,显然是可以的
import pydub
song = pydub.AudioSegment.from_mp3("幽閉サテライト - 加速する恋は谁にも止められない.mp3")
# 我们可以通过tags来指定,但是注意:如果想看到信息那么就不能指定为wav了,这里也指定mp3格式吧
song.fade_in(5000).fade_out(10000).export("幽閉サテライト - 加速する恋は谁にも止められない123.mp3",
tags={"artist": "古明地觉",
"title": "好听的歌",
"album": "东方地灵殿专辑",
"comments": "妈耶,小五好可爱呀(*╹▽╹*)"})
总体来说,还是很方便、并且很容易操作的。如果你只是想改变格式,比如mp3转ogg,那么直接:pydub.AudioSegment.from_mp3("xxx.mp3").export("xxx.ogg", format="ogg")
即可。当然你也可以用变量将音频保存起来,加入一些淡入淡出的效果,以及通过切片将音频分为多个部分,对每一部分单独做处理,然后再直接通过+
将处理之后的每一部分组合起来、再导出也是可以的。