Python音频编码类 - 用于dsp和声音合成
项目描述
pya
分支 | master |
develop |
---|---|---|
CI-Linux/MacOS | ||
CI-Windows | ||
变更 | ||
Binder |
什么是pya?
pya是一个用于支持使用Python创建和操作音频信号的软件包。它使用numpy数组来存储和计算音频信号。
- 文档:请参阅examples/pya-examples.ipynb以获取快速教程和文档
- 源代码:https://github.com/interactive-sonification/pya
它提供:
- Asig - 一个通用的音频信号类
- Ugen - Asig的子类,提供诸如正弦波、方波、锯齿波、噪声等单元发生器
- Aserver - 用于排队和播放Asigs的音频服务器类
- Arecorder - 音频录制类
- Aspec - 音频频谱类,使用rfft,因为实值信号总是隐含的
- Astft - 音频短时傅里叶变换(STFT)类
- 一些辅助函数,例如device_info()
pya可以用作
- 多通道音频处理
- 听觉显示和声音合成
- 声音合成实验
- 一般音频应用,如游戏或GUI增强
- 信号分析和绘图
目前,pya更适合离线渲染而不是实时。
作者和贡献者
安装
使用以下命令安装
pip install pya
但是,要播放和录制音频,您需要一个后端。
pip install pya[remote]
用于基于Web的Jupyter后端pip install pya[pyaudio]
用于portaudio
及其Python包装器PyAudio
使用Conda
Pyaudio可以通过conda安装
conda install pyaudio
免责声明:Python 3.10+ 需要 PyAudio 0.2.12,截至2022年12月,Conda上不可用。 Conda-forge 目前只提供Linux版本。Python 3.10的用户目前应使用其他安装选项。
使用Homebrew和PIP(仅限MacOS)
brew install portaudio
然后
pip install pya
对于苹果ARM芯片,如果您安装PyAudio依赖项失败,可以按照以下指南操作: ARM芯片安装
-
选项1:在您的家目录中创建.pydistutils.cfg,
~/.pydistutils.cfg
,添加echo "[build_ext] include_dirs=$(brew --prefix portaudio)/include/ library_dirs=$(brew --prefix portaudio)/lib/" > ~/.pydistutils.cfg
使用pip
pip install pya
安装后,您可以删除
.pydistutils.cfg
文件。 -
选项2:使用
CFLAGS
CFLAGS="-I/opt/homebrew/include -L/opt/homebrew/lib" pip install pya
使用PIP(Linux)
尝试sudo apt-get install portaudio19-dev
或您发行版的等效命令,然后
pip install pya
使用PIP(Windows)
PyPI 为Windows提供包括portaudio在内的PyAudio wheels
pip install pyaudio
应该足够了。
简单示例
启动
import pya
s = pya.Aserver(bs=1024)
pya.Aserver.default = s # to set as default server
s.boot()
创建一个Asig信号
采样率为44100 Hz的1秒/440 Hz正弦波,通道名为'left'
import numpy as np
signal_array = np.sin(2 * np.pi * 440 * np.linspace(0, 1, 44100))
atone = pya.Asig(signal_array, sr=44100, label='1s sine tone', cn=['left'])
创建Asig对象的其它方式
asig_int = pya.Asig(44100, sr=44100) # zero array with 44100 samples
asig_float = pya.Asig(2., sr=44100) # float argument, 2 seconds of zero array
asig_str = pya.Asig('./song.wav') # load audio file
asig_ugen = pya.Ugen().square(freq=440, sr=44100, dur=2., amp=0.5) # using Ugen class to create common waveforms
也可以使用文件路径来创建音频文件。 WAV
应该没有问题。 MP3
支持但可能会因为 FFmpeg 而引发错误。
如果您使用Anaconda,安装相当简单
conda install -c conda-forge ffmpeg
否则
- Mac或Linux使用brew
brew install ffmpeg
- 在Linux上
- 通过apt-get安装FFmpeg:
sudo apt install ffmpeg
- 通过apt-get安装FFmpeg:
- 在Windows上
- 从https://ffmpeg.zeranoe.com/builds/ 下载最新版本
- 解压文件夹,最好解压到
C:\
- 将FFmpeg二进制文件夹(例如
C:\ffmpeg\bin
)追加到系统变量PATH中(如何设置或更改PATH系统变量?)
关键属性
atone.sig
--> 包含信号的numpy数组atone.sr
--> 采样率atone.cn
--> 自定义定义的通道名称列表atone.label
--> 自定义集合标识符字符串
播放信号
atone.play(server=s)
如果未指定服务器,则play()使用Aserver.default
您也可以使用Aserver
作为上下文,而不是指定一个长期存在的服务器。
with pya.Aserver(sr=48000, bs=256, channels=2) as aserver:
atone.play(server=aserver) # Or do: aserver.play(atone)
这项技术的优点是它将为您处理服务器的启动和关闭。但请注意,服务器的开关引入了额外的延迟。
在特定设备上播放信号
from pya import find_device
from pya import Aserver
devices = find_device() # This will return a dictionary of all devices, with their index, name, channels.
s = Aserver(sr=48000, bs=256, device=devices['name_of_your_device']['index'])
绘制信号
绘制前1000个样本
atone[:1000].plot()
绘制幅度和相位频谱
atone.plot_spectrum()
通过Aspec类绘制频谱
atone.to_spec().plot()
通过Astft类绘制频谱图
atone.to_stft().plot(ampdb)
子集选择
- Asigs支持多通道音频(作为信号数组的列)
a1[:100, :3]
将选择前100个样本和前3个通道a1[{1.2:2}, ['left']]
将使用从1开始的时间片选择名为'left'的通道
从设备录制
Arecorder
允许从输入设备录制
import time
from pya import find_device
from pya import Arecorder
devices = find_device() # Find the index of the input device
arecorder = Arecorder(device=some_index, sr=48000, bs=512) # Or not set device to let pya find the default device
arecorder.boot()
arecorder.record()
time.sleep(2) # Recording is non-blocking
arecorder.stop()
last_recording = arecorder.recordings[-1] # Each time a recorder stop, a new recording is appended to recordings
方法链式调用
Asig方法通常返回一个Asig,因此方法可以链式调用,例如
atone[{0:1.5}].fade_in(0.1).fade_out(0.8).gain(db=-6).plot(lw=0.1).play(rate=0.4, onset=1)
学习更多
- 请查阅examples/pya-examples.ipynb以获取更多示例和详细信息。
贡献
- 如果您想贡献,请与我们联系。我们很高兴参与新功能的讨论并接收pull请求。
项目详情
下载文件
下载适合您平台的应用程序。如果您不确定选择哪个,请了解更多关于安装包的信息。