pysox
Python 封装 sox。查看文档。
这个库在以下论文中介绍过:
R. M. Bittner、E. J. Humphrey 和 J. P. Bello, "pysox: 在 Python 中利用 SoX 的音频信号处理能力", 发表于 2016 年 8 月在纽约市举行的第 17 届国际音乐信息检索学会会议的最新论文和演示论文集。
安装
需要安装 14.4.2 版本或更高版本的 SoX。
在 Mac 上使用 Homebrew 安装 SoX:
brew install sox
如果需要支持 mp3
、flac
或 ogg
文件,请添加以下标志:
brew install sox --with-lame --with-flac --with-libvorbis
在 Linux 上:
apt-get install sox
或从源码安装。
通过 PyPi 安装最新版本的此模块:
pip install sox
安装主分支:
pip install git+https://github.com/rabitt/pysox.git
或
git clone https://github.com/rabitt/pysox.git
cd pysox
python setup.py install
测试
如果您安装了不同版本的 SoX,建议您本地运行测试,以确保一切按预期运行,只需运行:
pytest
示例
import sox
# 创建转换器
tfm = sox.Transformer()
# 修剪音频在 5 到 10.5 秒之间
tfm.trim(5, 10.5)
# 应用压缩
tfm.compand()
# 应用淡入淡出
tfm.fade(fade_in_len=1.0, fade_out_len=0.5)
# 创建输出文件
tfm.build_file('path/to/input_audio.wav', 'path/to/output/audio.aiff')
# 或者使用传统 API 等效实现
tfm.build('path/to/input_audio.wav', 'path/to/output/audio.aiff')
# 将输出作为 numpy 数组获取
# 默认采样率与输入文件相同
array_out = tfm.build_array(input_filepath='path/to/input_audio.wav')
# 查看应用的效果
tfm.effects_log
> ['trim', 'compand', 'fade']
转换内存中的数组:
import numpy as np
import sox
# 样本率,单位为 Hz
sample_rate = 44100
# 生成 1 秒 440 Hz 正弦波
y = np.sin(2 * np.pi * 440.0 * np.arange(sample_rate * 1.0) / sample_rate)
# 创建转换器
tfm = sox.Transformer()
# 将音高上移 2 个半音
tfm.pitch(2)
# 转换内存中的数组并返回数组
y_out = tfm.build_array(input_array=y, sample_rate_in=sample_rate)
# 相反,保存输出到文件
tfm.build_file(
input_array=y, sample_rate_in=sample_rate,
output_filepath='path/to/output.wav'
)
# 以不同的采样率创建输出文件
tfm.set_output_format(rate=8000)
tfm.build_file(
input_array=y, sample_rate_in=sample_rate,
output_filepath='path/to/output_8k.wav'
)
连接 3 个音频文件:
import sox
# 创建组合器
cbn = sox.Combiner()
# 将组合的音频上移 3 个半音
cbn.pitch(3.0)
# 将输出转换为 8000 Hz 立体声
cbn.convert(samplerate=8000, n_channels=2)
# 创建输出文件
cbn.build(
['input1.wav', 'input2.wav', 'input3.wav'], 'output.wav', 'concatenate'
)
# 组合器当前不支持数组输入/输出
获取文件信息:
import sox
# 获取采样率
sample_rate = sox.file_info.sample_rate('path/to/file.mp3')
# 获取采样数
n_samples = sox.file_info.num_samples('path/to/file.wav')
# 确定文件是否静音
is_silent = sox.file_info.silent('path/to/file.aiff')
# 文件信息当前不支持数组输入