python音频处理库:pydub

0×00 前言
好久没更新了,写点东西吧。
最近在自学日语,果然是动漫什么的看多了就被会文化所吸引。所以就在背单词啊什么的,听一些mp3啊什么的,在这个过程中也发现了一些需求,比如说一些mp3的处理,最简单的比如音频的时间剪辑,还有一些复杂一些的功能,比如能把单词进行分割处理,利用中间的静音来分割不同单词,乱序之后用来听写。
所以就发现了一个python库:pydub,用来处理音频,比如说MP3啊、wav之类的东西是很方便的。
我们还知道有另一个有名的软件,Adobe Audition。Au功能自然是很多,不过我们用python啊之类的,是可以达到更加批量化的效果,而且没有那么高的学习成本,如果之前有python的一些基础,直接就能方便的操纵音频了。当然了,功能是肯定要比Au少的就是了。

0×01 安装
pydub主页是这个pydub
安装的说明:
安装
需要有python2的环境。
安装这个库的方法,和其他也差不多的。pip或者是直接下zip包回来解压。

pip install pydub

安装完pydub之后,就可以处理一些wav格式的音频文件,但是这个并不是我们最常用的,我们可能比较常用的还是mp3啊、MP4等等格式的。
这个时候,还需要安装ffmpeg,这个是一个命令行工具,可以用于一些音频格式的转换,比如mp3转wav啊之类的,然后就可以处理其他类型的多媒体文件了。
下载可以到这里ffmpeg
windows下的安装可以到这里下载静态文件,然后用解压、添加环境变量的方法,来使用他。可以在cmd里执行ffmpeg -version就可以了。

安装ffmpeg windows版本的方法可以参考一下这个链接
我在使用的播放器是使用的foobar2000,这个很好用也有一些插件什么的,可以用来扩展功能。

0×02 音频剪切
我们常常有一段音频的剪切这种需求,希望把他剪短只取一部分来用。这就可以用下面这个python来完成。
split.py:

from pydub import AudioSegment

file_name = "lesson01.mp3"
sound = AudioSegment.from_mp3(file_name)

start_time = "0:00"
stop_time = "0:42"
print "time:",start_time,"~",stop_time

start_time = (int(start_time.split(':')[0])*60+int(start_time.split(':')[1]))*1000
stop_time = (int(stop_time.split(':')[0])*60+int(stop_time.split(':')[1]))*1000

print "ms:",start_time,"~",stop_time

word = sound[start_time:stop_time]
save_name = "word"+file_name[6:]
print save_name

word.export(save_name, format="mp3",tags={'artist': 'AppLeU0', 'album': save_name[:-4]})

这里是先读取了mp3文件,使用AudioSegment.from_mp3函数,如果是其他的一些特殊格式,可以使用

AudioSegment.from_file("sound.mp4", format="mp4")

具体可以参考API手册:API

剪切时间:是按ms 毫秒来的,所以时间格式的转换就要到毫秒级的。sound[start_time:stop_time] 使用了python里的list分割来选择时间的长短。最后export函数输出,指定保存为mp3格式的。

0×03 分词
背单词的时候 还有一个需求就是要把每个单词给分割出来,然后做个乱序的效果。
可以使用下面这个python来处理。

from pydub import AudioSegment
from pydub.silence import split_on_silence
import random
import sys

name = sys.argv[1]

file_name = name+".mp3"
sound = AudioSegment.from_mp3(file_name)

chunks = split_on_silence(sound,min_silence_len=700,silence_thresh=-70)#silence time:700ms and silence_dBFS<-70dBFS

words = chunks[2:] #first and second are not words.

len1 = len(words)

new = AudioSegment.empty()
silence = AudioSegment.silent(duration=1000)#1000ms silence


order = range(len1)
random.shuffle(order)
print order
comments = ""

for i in order:
    new += words[i]+silence
    comments += str(i)+","

save_name = file_name.split(".")[0]+"-random{0}.".format(random.randrange(0,9))+file_name.split(".")[1]
new.export(save_name, format="mp3",tags={'artist': 'AppLeU0', 'album': file_name, 'comments': comments[:-1]})

最关键的是这个,需要确定好min_silence_len和silence_thresh:

split_on_silence(sound,min_silence_len=700,silence_thresh=-70)

这里silence_thresh是认定小于-70dBFS以下的为silence,然后需要保持小于-70dBFS超过 700毫秒。这样子分割成一段一段的。
最关键的就是这两个值的确定,这里需要我们用到foobar的一个功能:视图——可视化———音量计
可以观察一段音频的dBFS大小,正常的音量差不多都是在-25dBFS到-10dBFS。这个单位是从-96dBFS到0dBFS的,越靠近0,音量越大。
我们这里取-70dBFS以下的,认为是静音。然后可以用foobar估算每个单词中间的间隙时间,大概是在900ms也就是0.9s。我们还是取小一些 0.7s分割。

再来就是生成一个乱序的序列,然后把单词对应进去,然后中间插入空白静音1s。

silence = AudioSegment.silent(duration=1000)

0x04 慢速播放
之前去实习的时候,会遇到一种要求,比如需要写复述的逐字稿,我们就可以用慢速的方法来播放文件,再来写逐字稿就很简单了。在学日语的时候,听一些读得比较快的文章的时候,慢速播放这个功能也很nice。
这里是实现是在播放器上的,如果写成脚本不太灵活。
这里是使用了foobar2000的一个插件,DSP的SoundTouch插件。
需要下载一个dll:foo_dsp_soundtouch.dll
把foo_dsp_soundtouch.dll放入Foobar2000根目录下的components文件夹
然后就可以使用了,这个比较简单,减小tempo adjust就可以达到慢速播放的效果了。

0x05 总结
最后就是他的功能还是有很多的,多查查看API什么的就可以找到很多不同的玩法。看自己的需求找函数想办法,stackoverflow上也有一些相关的提问。
但是,有一些还是需要有相关的音频知识才能玩得转的。
API手册

3 条评论

  1. f1rstb100d 五月 23, 2016 12:08 上午  回复

    您好,问一下伪春菜设置公告(就是打开网页说的第一句话)我在源码里改了,但是网页上并没有变,是不是我哪里设置错了,求大神指点,可以在我的博客里评论一下就好http://www.f1rstb100d.cn/,非常感谢

  2. 东吃 六月 5, 2016 4:56 下午  回复

    python还能这样用学习了

    • AppLeU0 六月 7, 2016 4:59 下午  回复

      233

AppLeU0 进行回复 取消回复

*