librosa缘由
librosa是一个音频和音乐处理的Python包,我用它来做音频的特征提取。但是在使用时,发现librosa.load将音乐文件转化为时间序列的过程中,速度实在难以忍受,cpu跑的非常高,程序好像假死的状态。
查阅官方文档发现,默认情况下,librosa会使用scipy.signal进行音频信号的重采样,这在实际使用时是很慢的。如果要获得很高的性能,官方建议安装libsamplerate和其相应的python模块scikits.samplerate。
这就是说,在Windows下进行安装的话,要先编译libsamplerate得到相应的lib和dll文件,再安装python的接口模块。
我试着在linux下进行安装,过程是很流畅的,因为使用apt-get可以方面安装libsamplerate,pip进行scikits.samplerate安装的时候,系统可以直接找到libsamplerate编译好的lib文件。
虽然这个软件比较小众,但如果有读者遇到相同的问题,希望能对你有所帮助。
Windows下编译libsamplerate
编译步骤:
- 解压libsamplerate压缩包到C:\libsamplerate-0.1.8目录
- 下载libsndfile的二进制安装包进行安装
- 复制libsndfile中的libsndfile-1.dll, libsndfile-1.lib 和 libsndfile-1.def文件到C:\libsamplerate-0.1.8目录中
- 复制libsndfile中的include/sndfile.h到C:\libsamplerate-0.1.8目录中
- 确保将vc编译器的bin目录加入到系统环境变量中
- 打开Win32\Makefile.msvc文件,修改
- MSVCDir=(你的安装目录)\Microsoft Visual Studio 11.0\VC
- CFLAGS变量加入Microsoft SDKs的Include文件夹,比如我的是CFLAGS=/nologo /MD /W1 /GX /O2 /Zm200 /I “$(MSVCDir)\Include” /I “C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include” /I . /I “Win32” /I “src” /D “WIN32” /D “_USRDLL” /YX /FD /Zm1000
- PROG_LINK_FLAGS变量加入Microsoft SDKs的Lib文件夹,我的是PROG_LINK_FLAGS=/nologo /incremental:no /libpath:”$(MSVCDir)\Lib” /libpath:”C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib” /pdb:”libsamplerate-0.pdb” /machine:I386 /exetype:dynamic
- DLL_LINK_FLAGS变量加入Microsoft SDKs的Lib文件夹,我的是DLL_LINK_FLAGS=/nologo /dll /incremental:no /libpath:”$(MSVCDir)\Lib” /libpath:”C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib” /pdb:”libsamplerate-0.pdb” /implib:”.\libsamplerate-0.lib” /machine:I386 /out:”libsamplerate-0.dll”
- 命令行模式下进入C:\libsamplerate-0.1.8目录,输入Make.bat进行编译,使用make check进行程序测试
- 最终得到了libsamplerate-0.dll,libsamplerate-0.lib,结合src目录下面的samplerate.h
源码安装scikits.samplerate
如果要使用pip进行安装的话,系统可能找不到libsamplerate的lib文件,导致安装失败。
下载了scikits.samplerate的源码包之后,需要对site.cfg文件进行配置,制定samplerate库的lib文件名和所在目录才可以正常的安装,不然也会导致失败。
在scikits.samplerate目录下,打开site.cfg文件,修改内容为:
[samplerate]
library_dirs = c:\libsamplerate-0.1.8
libraries = libsamplerate-0
这样就可以进行python setup.py install
安装了。
这里还要注意,安装成功之后,在python的第三方库文件夹中找到scikits.samplerate,在scikits\samplerate文件夹中将libsamplerate编译好的dll文件放进去,这样就可以使用了。
补充:音频重采样
频率对应于时间轴线,振幅对应于电平轴线。波是无限光滑的,弦线可以看成由无数点组成,由于存储空间是相对有限的,数字编码过程中,必须对弦线的点进行采样。采样的过程就是抽取某点的频率值,很显然,在一秒中内抽取的点越多,获取得频率信息更丰富,为了复原波形,一次振动中,必须有2个点的采样,人耳能够感觉到的最高频率为20kHz,因此要满足人耳的听觉要求,则需要至少每秒进行40k次采样,用40kHz表达,这个40kHz就是采样率。
为了减少计算复杂度和存储复杂度,采样速率转换技术是十分必要的,音频重采样算法可以用来实现音频信号任意采样速率之间的转换。
对于采样率为Fs,长度为M个采样点的音频信号x[n],,通过采样因子P/Q进行重采样后,这个信号的样本数可以增大或者减小。该过程可以分为如下三个步骤[17]:
(1)上采样:在原信号相邻两点内插入P-1个零点,即创建一个有P (M-1)+1个采样点的信号xu[n],当n=1,2,…,M时,xu[P(n-1)+1] = x[n];否则,xu[n]=0。
(2)插值:xu[n]和一个低通插值滤波器h[n]作卷积:xi[n]= xu[n]h[n]。
(3)下采样:每隔Q-1个点抽取一个点,即创建有Q个点的信号xd[n],当n=1,2,…,+1时,xd[n]=xi[1+Q (n-1)],则重采样信号y[n]=xd[n]。(符号表示向下取整数)
不同类型的重采样算法都可以分为上述三个过程,它们的唯一的区别就在于步骤2中所采用的插值滤波器的不同。
注意事项:
1.上采样时,会造成镜像信息,因此需要使用低通滤波器滤除(线性插值本身就是低通滤波器,因此不需要额外处理)。
2.下采样时,可能会造成频谱混淆,因此在下采样之前用低通去混淆滤波器滤除。
3.重采样算法非常消耗时间,使用多相滤波器与一些条件限制,可以大大提高运算速度。
转载请注明作者Jason Ding及其出处
GitCafe博客主页(http://jasonding1354.gitcafe.io/)
Github博客主页(http://jasonding1354.github.io/)
CSDN博客(http://blog.csdn.net/jasonding1354)
简书主页(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)
百度搜索jasonding1354进入我的博客主页