跳转到主要内容

基于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 采用 BSD 许可协议(BSD 3-Clause License)。
(c) 2013, Bastian Bechtold

重大更改

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 (1.8 MB 查看哈希值)

上传时间 源代码

构建版本

PySoundFile-0.9.0.post1-py2.py3.cp26.cp27.cp32.cp33.cp34.cp35.cp36.pp27.pp32.pp33-none-win_amd64.whl (671.8 kB 查看哈希值)

上传时间 CPython 2.6 CPython 2.7 CPython 3.2 CPython 3.3 CPython 3.4 CPython 3.5 CPython 3.6 PyPy Python 2 Python 3 Windows x86-64

PySoundFile-0.9.0.post1-py2.py3.cp26.cp27.cp32.cp33.cp34.cp35.cp36.pp27.pp32.pp33-none-win32.whl (639.2 kB 查看哈希值)

上传时间 CPython 2.6 CPython 2.7 CPython 3.2 CPython 3.3 CPython 3.4 CPython 3.5 CPython 3.6 PyPy Python 2 Python 3 Windows x86

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 (573.2 kB 查看哈希值)

上传时间 CPython 2.6 CPython 2.7 CPython 3.2 CPython 3.3 CPython 3.4 CPython 3.5 CPython 3.6 PyPy Python 2 Python 3 macOS 10.5+ x86-64 macOS 10.6+ intel macOS 10.9+ intel macOS 10.9+ x86-64

PySoundFile-0.9.0.post1-py2.py3-none-any.whl (24.2 kB 查看哈希值)

上传时间 Python 2 Python 3

支持