基于libsndfile、CFFI和NumPy的音频库
项目描述
PySoundFile 是一个基于 libsndfile、CFFI 和 NumPy 的音频库。完整的文档可在 http://pysoundfile.readthedocs.org/ 上找到。
PySoundFile 可以读写声音文件。通过 libsndfile 支持文件读写,它是一个免费、跨平台、开源(LGPL)库,用于读取和写入许多不同的采样声音文件格式,运行在包括Windows、OS X 和 Unix 在内的许多平台上。它通过 CFFI 访问,CFFI 是 Python 调用 C 代码的外部函数接口。CFFI 支持 CPython 2.6+、3.x 和 PyPy 2.0+。PySoundFile 将音频数据表示为 NumPy 数组。
重大更改
PySoundFile 在过去几个版本中发展迅速。最值得注意的是,我们在 0.7 版本中将导入名称从 import pysoundfile 更改为 import soundfile。在 0.6 版本中,我们清理了许多小的不一致性,特别是在函数参数的排序和命名以及删除索引接口方面。
在0.8.0版本中,我们将always_2d的默认值从True更改为False。此外,write函数的参数顺序也发生了变化,从write(data, file, ...)变为write(file, data, ...)。
在0.9.0版本中,我们将buffer_*方法的ctype参数更改为dtype,使用Numpy的dtype表示法。旧的ctype参数仍然可以使用,但现在已正式弃用。
安装
PySoundFile依赖于Python包CFFI和NumPy,以及系统库libsndfile。
为了安装Python依赖项,我建议使用Python 3的Anaconda发行版。这将包含所有预安装的依赖项。要手动安装依赖项,可以使用conda包管理器,它将使用conda install cffi numpy安装所有依赖项(conda也可以独立于Anaconda使用pip install conda; conda init)。
安装CFFI和NumPy后,您可以使用pip install pysoundfile下载并安装PySoundFile的最新版本。在Windows和OS X上,这还将安装库libsndfile。在Linux上,您需要使用您的发行版的包管理器安装libsndfile,例如sudo apt-get install libsndfile1。
读写函数
可以使用soundfile.write()将数据写入文件,或使用soundfile.read()从文件中读取数据。PySoundFile可以打开libsndfile支持的所有文件格式,例如WAV、FLAC、OGG和MAT文件。
以下是一个示例程序,它读取WAV文件并将其复制到OGG-Vorbis文件中
import soundfile as sf
data, samplerate = sf.read('existing_file.wav')
sf.write('new_file.ogg', data, samplerate)
块处理
可以使用soundfile.blocks()以短块的形式读取声音文件,这些块可以可选地重叠。例如,这计算了长文件中每个块的信号水平
import numpy as np
import soundfile as sf
rms = [np.sqrt(np.mean(block**2)) for block in
sf.blocks('myfile.wav', blocksize=1024, overlap=512)]
SoundFile对象
声音文件也可以以soundfile.SoundFile对象的形式打开。每个SoundFile都有特定的采样率、数据格式和固定数量的通道。
如果一个文件被打开,它将在SoundFile对象存在期间保持打开状态。当对象被垃圾回收时,文件将关闭,但您应使用soundfile.SoundFile.close()方法或上下文管理器显式关闭文件
import soundfile as sf
with sf.SoundFile('myfile.wav', 'r+') as f:
while f.tell() < len(f):
pos = f.tell()
data = f.read(1024)
f.seek(pos)
f.write(data*2)
所有数据访问都使用帧作为索引。帧是声音文件中的一个离散时间步骤。每个帧包含与文件中通道数量一样多的样本。
RAW文件
Pysoundfile通常可以自动检测声音文件的类型。但对于RAW文件来说,这是不可能的。
import soundfile as sf
data, samplerate = sf.read('myfile.raw', channels=1, samplerate=44100,
subtype='FLOAT')
请注意,在x86上,这默认为endian='LITTLE'。如果您正在读取大端数据(主要是旧的PowerPC/6800-based文件),则必须相应地设置endian='BIG'。
您可以使用类似的方式写入RAW文件,但请注意,在大多数情况下,使用更具表达力的格式更好,应该使用它而不是RAW格式。
虚拟IO
如果您有一个打开的文件-like对象,Pysoundfile可以像常规文件一样打开它
import soundfile as sf
with open('filename.flac', 'rb') as f:
data, samplerate = sf.read(f)
以下是一个使用HTTP请求的示例
import io
import soundfile as sf
from urllib.request import urlopen
url = "http://tinyurl.com/shepard-risset"
data, samplerate = sf.read(io.BytesIO(urlopen(url).read()))
请注意,上面的示例仅适用于Python 3.x。对于Python 2.x支持,将第三行替换为
from urllib2 import urlopen
新闻
- 2013-08-27 V0.1.0 Bastian Bechtold
初始原型。Python中的libsndfile简单包装器
- 2013-08-30 V0.2.0 Bastian Bechtold
错误修复并与PySoundCard更一致
- 2013-08-30 V0.2.1 Bastian Bechtold
错误修复
- 2013-09-27 V0.3.0 Bastian Bechtold
添加Windows的二进制安装程序和上下文管理器
- 2013-11-06 V0.3.1 Bastian Bechtold
已从distutils切换到setuptools以简化安装
- 2013-11-29 V0.4.0 Bastian Bechtold
感谢David Blewett,现在支持虚拟IO!
- 2013-12-08 V0.4.1 Bastian Bechtold
感谢Xidorn Quan,FLAC文件不再是float32了。
- 2014-02-26 V0.5.0 Bastian Bechtold
感谢Matthias Geier,改进了查找和flush()方法。
- 2015-01-19 V0.6.0 Bastian Bechtold
衷心感谢Matthias Geier,他做了大部分的工作!
将默认数据类型切换到float64。
为了一致性更改了函数参数。
添加了单元测试。
添加了全局的read()、write()、blocks()便捷函数。
重新编写文档并在readthedocs上托管。
添加了'x'打开模式。
添加了tell()方法。
添加了__repr__()方法。
- 2015-04-12 V0.7.0 Bastian Bechtold
再次感谢Matthias Geier的辛勤工作,同时也要感谢Nils Werner和Whistler7提供的许多建议和帮助。
将import pysoundfile重命名为import soundfile。
通过包含必要库的pip wheels进行安装。
从write()中移除了exclusive_creation参数。
添加了truncate()方法。
- 2015-10-20 V0.8.0 Bastian Bechtold
Matthias Geier再次为此版本做出了大量贡献。
将always_2d的默认值从True更改为False。
Numpy现在是可选的,并且仅在read和write时加载。
添加了SoundFile.buffer_read、SoundFile.buffer_read_into和SoundFile.buffer_write,它们可以不涉及Numpy读取和写入原始数据。
添加了info函数,它可以返回音频文件的元数据。
将write函数的参数顺序从write(data, file, ...)更改为write(file, data, ...)
以及许多其他小的错误修复。
- 2017-02-02 V0.9.0 Bastian Bechtold
感谢Matthias Geier、Tomas Garcia和Todd为此次发布做出的贡献。
增加了对ALAC文件的支持。
添加了新成员__libsndfile_version__。
将帧数添加到info类中。
将dtype参数添加到buffer_*方法中。
废弃了buffer_*方法的ctype参数。
增加了对Python 3.6的官方支持。
以及一些小的错误修复。
项目详情
PySoundFile-0.9.0.post1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 43dd46a2afc0484c26930a7e59eef9365cee81bce7a4aadc5699f788f60d32c3 |
|
MD5 | 99c64d39b5aaaa13c3a6c4a5fd0e3a74 |
|
BLAKE2b-256 | 07fabbe4d1c4328eaa83c0656c729eabbf811377fc1e8416d42bf7f7af63ef8c |
PySoundFile-0.9.0.post1-py2.py3.cp26.cp27.cp32.cp33.cp34.cp35.cp36.pp27.pp32.pp33-none-win_amd64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d92afd505d395523200d5b7f217e409bae4639c90cc61e90832a57a5a0fb484a |
|
MD5 | 21248257b79817ebe02d1eda239ece65 |
|
BLAKE2b-256 | 9d8e30d9f80802e8ea2c5b96db2f320fdb147e25a84fd74caa251b57bedeeb33 |
PySoundFile-0.9.0.post1-py2.py3.cp26.cp27.cp32.cp33.cp34.cp35.cp36.pp27.pp32.pp33-none-win32.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c5c5cc8e5f3793a4b9f405c0c77e116e859ac16e065bb6b7f78f2a59484fd7a8 |
|
MD5 | 06b1d7a654356d94f717bcf0b7773f50 |
|
BLAKE2b-256 | b8d44c02ba1cee60e5c5c546de4761bcb7e42cba577216561067ffe40cf8fb0a |
哈希值 对于 PySoundFile-0.9.0.post1-py2.py3.cp26.cp27.cp32.cp33.cp34.cp35.cp36.pp27.pp32.pp33-none-macosx_10_5_x86_64.macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 5889138553f4e675158054f8f41c212ca76ac0e2d949e38d1dd8ded4ca3f0ce0 |
|
MD5 | 19bac6d7d8a57ffecd2ec5742330d46c |
|
BLAKE2b-256 | f762bddd31ba4f575eca81c6642d809fe01ed5ee5f55ebb4e9b14d0a033cc6bf |