librubberband 的简单包装器
项目描述
介绍
Rubberband 是一个简单的Python3包装器,围绕着著名的librubberband声音拉伸/音高转换库。与现有的 Python 包装器(例如pyrubberband)不同,这是一个真正的原生扩展。
初始版本提供了一个函数,该函数将通过将单声道音频流的持续时间乘以提供的因子来拉伸单声道音频流。未来的版本可能包括音高转换,以及基于数据图的更复杂的处理。
安装
该模块仅适用于 MacOS 和 Linux。该代码可以在 Windows 上编译,但尚未经过测试。依赖项是:
Python 3(最好是 3.6 或更高版本)
librubberband (> 1.8)
libsndfile (> 1.0)
假设满足这些依赖关系,那么安装本身就是简单的:
pip3 install rubberband
安装脚本会检查所需的库,如果找不到它们会大声抱怨。有关获取它们的信息可从上面的链接获得。
API
音频流格式
该模块公开了一个函数Rubberband.stretch,它将 librubberband算法应用于单声道音频流,以以下格式之一编码,每种格式都有一个相应的常量,如第三列所示:
格式 |
描述 |
持续的 |
|---|---|---|
PCM_U8 |
无符号 8 位 |
橡皮筋.uint8 |
PCM_S8 |
有符号的 8 位 |
橡皮筋.int8 |
PCM_16 |
带符号的 16 位 |
橡皮筋.int16 |
PCM_32 |
带符号的 32 位 |
橡皮筋.int32 |
漂浮 |
标准化32 位浮点数 |
橡皮筋.float32 |
请注意,假设浮点数据已标准化,因此所有样本都位于 [-1,1) 范围内。
音频数据可以通过以下三种方式之一传递给Rubberband.stretch :
- 类型化数组
一维NUMPY类型的数组对象,其dtype是numpy.uint8、 numpy.int8、numpy.int16、numpy.int32或numpy.float32 之一。音频数据的类型由此推断,使用一个奇怪的方便事实,如果T是uint8、 int8、int16、int32、float32之一,那么
numpy.dtype(numpy.T).num == rubberband.T- 列表
一个简单的 Python列表,其所有元素都是可隐式转换为float的类型。在这种情况下,无法推断出音频格式,因此必须使用Rubberband.stretch的格式参数指定(见下文)。
- 原始字节流
一个 Python字节对象,其内容是原始 PCM 字节流(注意:音频文件元数据,例如 WAV 文件头,必须被剥离,因此只保留 PCM 数据)。同样,在这种情况下,无法推断出音频格式,因此必须使用Rubberband.stretch的格式参数指定它(见下文)。
在所有情况下,rubberband.stretch的输出都具有相同的 PCM 格式,并且存储在与输入相同的对象中。因此,例如,给定一个表示PCM_16 音频通道的字节对象, rubberband.stretch返回表示PCM_16 拉伸音频通道的字节对象。
方法签名
Rubberband.stretch(输入,格式= Rubberband.float32,速率= 48000,比率= 1,脆度= 5,共振峰= False,精确= True)
论据
- 输入
假设输入表示使用上面列出的方案之一编码的 PCM 音频数据的单个通道。它可以是上面列出的任何类型。
- 格式
数据的 PCM 格式,使用上述常量之一指定。如果输入是 NUMPY 类型的数组,则忽略此值,在这种情况下,格式是从其 dtype 推导出来的。
- 速度
输入音频流的帧速率(即比特率除以样本大小)。
- 比率
输出长度与输入长度的比率(以秒/样本数为单位)。
- 脆度
整数 0 - 6,默认 5:性能度量 - 有关详细信息,请参阅Rubberband-cli 文档。
- 共振峰
布尔值,默认False:是否保留共振峰 - 有关详细信息,请参阅Rubberband-cli 文档。
- 精确的
布尔值,默认True:是否使用精确的拉伸算法 -有关详细信息,请参阅Rubberband-cli 文档。
- 返回值
包含拉伸音频数据的对象,使用与输入相同的 PCM 编码表示 。样本被标准化以位于格式的预期范围内。
例子
import rubberband import soundfile data,rate=soundfile.read('infile.wav',dtype='int16') bitrate=rate*16 nFrames=len(data) print(f'Raw input type is : {type(data)}') oldDuration=nFrames/rate newDuration=6 ratio=newDuration/oldDuration out=rubberband.stretch(data,rate=rate,ratio=ratio,crispness=5,formants=False,precise=True) soundfile.write('outfile.wav',out,rate,'PCM_16')