Python音频处理库PyAudio安装与使用详解

沈知远
沈知远
发布时间:2026-10-13 | 3人浏览过
原创

本文详细介绍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的上手教程,希望对大家有所帮助。如果大家有任何疑问,请留言,小编会及时回复。在此非常感谢大家对本站网站的支持! 如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表