Python音频处理库PyAudio安装与使用详解
本文详细介绍Python音频处理库PyAudio的安装与使用方法。涵盖Windows、macOS及Linux系统的安装步骤,演示如何调用PyAudio进行麦克风采样录音并保存为WAV文件,以及通过阻塞模式和回调模式播放音频的完整代码示例。
引言
在Python中进行音频数据处理时,读取和播放声音文件是基础且必要的操作。本文将介绍一个功能强大的音频处理工具包——PyAudio,帮助用户轻松实现相关功能。
PyAudio是一个开源的Python工具包,正如其名,它专注于语音和音频操作。该工具包提供了录音、播放及处理音频等多种功能,在语音处理领域,其地位类似于OpenCV在图像处理领域的地位。
简介
PyAudio是跨平台音频I/O库PortAudio的Python绑定接口。借助PyAudio,开发者可以在GNU/Linux、Microsoft Windows以及Apple Mac OS X/macOS等多种平台上,使用Python轻松实现音频的播放与录制功能。
PyAudio的设计灵感来源于以下项目:
- pyPortAudio/fastaudio:这是PortAudio v18 API的Python绑定实现。
- tkSnack:这是一个跨平台的声音工具包,支持Tcl/Tk和Python。
安装
当前发布的PyAudio版本为v0.2.11。在大多数平台上,推荐通过pip命令直接安装PyAudio。对于v0.2.9之前的旧版本,PyAudio以二进制分发文件的形式提供,这些文件存档于官方指定位置。
微软Windows系统
推荐使用pip进行安装,具体命令如下:
python -m pip install pyaudio
注意事项:
- 如果您的Python安装环境中未包含pip,请前往官方指定位置获取并安装pip。
- 执行pip命令后,系统将自动获取并安装PyAudio的轮文件(即预先打包的二进制文件)。目前,官方发行版提供了兼容Python 2.7、3.4、3.5和3.6版本的轮文件。针对这些Python版本,用户可以选择32位或64位的轮文件进行安装。
- 上述二进制文件是使用MinGW构建的PortAudio v19(版本号为v190600_20161030)。它们仅支持Windows MME API,并不包括对DirectX、ASIO等其他音频API的支持。如果您的需求涉及未包含的API,则需要手动编译PortAudio和PyAudio源码。
Apple Mac OS X系统
brew install portaudio
pip install pyaudio
注意事项:
- 如果您尚未安装Homebrew,请先下载并安装Homebrew。
- 执行pip命令后,系统将下载PyAudio的源代码,并针对您当前的Python版本进行本地编译构建。
- 使用Homebrew安装PyAudio以及编译PyAudio源码,还需要确保已安装Xcode命令行工具(更多信息请查阅官方文档)。
Debian/Ubuntu系统
您可以使用系统包管理器直接安装PyAudio,命令如下:
sudo apt-get install python-pyaudio python3-pyaudio
如果系统仓库中没有最新版本的PyAudio,可以通过pip命令进行安装:
pip install pyaudio
注意事项:
- 执行pip命令后,系统将下载PyAudio的源代码,并针对您的系统进行本地构建。请务必在操作前安装portaudio库的开发包(
portaudio19-dev)以及python的开发包(python-all-dev)。 - 为了获得更好的系统包隔离效果,建议考虑在virtualenv虚拟环境中安装PyAudio。
PyAudio源码获取
您可以从Python Package Index(PyPI)下载PyAudio的源代码:pypi.python.org/pypi/PyAudio。
或者,您可以克隆git代码仓库:
git clone https://people.csail.mit.edu/hubert/git/pyaudio.git
若要从源代码构建PyAudio,您还需要同时构建PortAudio v19。关于为各种平台构建PyAudio的具体说明,请参阅官方提供的编译提示文档。如果您希望使用Microsoft Visual Studio来构建PyAudio,可以查阅Sebastian Audet提供的详细指南。
示例
1). 采集音频
以下代码演示了如何从计算机麦克风采集一段音频数据。设置采集时长为4秒,并将采集到的音频保存为文件output.wav。
代码中使用了tqdm模块,用于方便地显示读取过程的进度条,效果如下:
* recording
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 172/172 [00:03<00:00, 43.40it/s]
* done recording
import pyaudio
import wave
from tqdm import tqdm
def record_audio(wave_out_path,record_second):
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
wf = wave.open(wave_out_path, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
print("* recording")
for i in tqdm(range(0, int(RATE / CHUNK * record_second))):
data = stream.read(CHUNK)
wf.writeframes(data)
print("* done recording")
stream.stop_stream()
stream.close()
p.terminate()
wf.close()
record_audio("output.wav",record_second=4)
要使用PyAudio,首先需要通过pyaudio.PyAudio()初始化PyAudio对象。
(1)实例化PyAudio对象,这一步骤会初始化PortAudio系统。
若要录制或播放音频,请使用pyaudio.PyAudio.open()方法。
(2)在所需的音频设备上,打开具有所需音频参数的流。这一步骤将设置pyaudio.Stream对象,用于播放或录制音频。
可以通过调用pyaudio.Stream.write()方法写入音频数据来播放音频,或者通过调用pyaudio.Stream.read()方法读取音频数据来录制音频。
(3)请注意,在“阻塞模式”下,每次调用pyaudio.Stream.write()或pyaudio.Stream.read()方法时,程序会阻塞直到所有给定的帧被播放或请求的帧被录制完毕。或者,如果需要动态生成音频数据或立即处理录制的音频数据,请使用下文概述的“回调模式”。
使用pyaudio.Stream.stop_stream()方法可以暂停播放或录制,并使用pyaudio.Stream.close()方法终止流。(4)
最后,使用pyaudio.PyAudio.terminate()方法(5)终止PortAudio会话。
2). 播放音频
下面演示如何使用播放功能来播放步骤1)中保存的音频文件output.wav。
通过tqdm模块,可以显示播放进度的进度条,效果如下:
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 172/172 [00:03<00:00, 43.40it/s]
"""PyAudio Example: Play a WAVE file."""
import pyaudio
import wave
from tqdm import tqdm
def play_audio(wave_path):
CHUNK = 1024
wf = wave.open(wave_path, 'rb')
# instantiate PyAudio (1)
p = pyaudio.PyAudio()
# open stream (2)
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
# read data
data = wf.readframes(CHUNK)
# play stream (3)
datas = []
while len(data) > 0:
data = wf.readframes(CHUNK)
datas.append(data)
for d in tqdm(datas):
stream.write(d)
# stop stream (4)
stream.stop_stream()
stream.close()
# close PyAudio (5)
p.terminate()
play_audio("output.wav")
2). 以回调方式播放音频
当需要在执行其他程序的同时播放音频时,可以使用回调方式播放。示例代码如下:
"""PyAudio Example: Play a WAVE file."""
import pyaudio
import wave
from tqdm import tqdm
import time
def play_audio_callback(wave_path):
CHUNK = 1024
wf = wave.open(wave_path, 'rb')
# instantiate PyAudio (1)
p = pyaudio.PyAudio()
def callback(in_data, frame_count, time_info, status):
data = wf.readframes(frame_count)
return (data, pyaudio.paContinue)
# open stream (2)
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True,
stream_callback=callback)
# read data
stream.start_stream()
while stream.is_active():
time.sleep(0.1)
# stop stream (4)
stream.stop_stream()
stream.close()
# close PyAudio (5)
p.terminate()
play_audio_callback("output.wav")
参考资源:
1. http://people.csail.mit.edu/hubert/pyaudio/
总结
以上介绍了Python音频操作工具PyAudio的上手教程,希望对大家有所帮助。如果大家有任何疑问,请留言,小编会及时回复。在此非常感谢大家对本站网站的支持! 如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









