python-sounddevice:用 Python 录音和放音,就这么简单

python-sounddevice 在 GitHub 上拿到了 1252 Star。

这个库是 PortAudio 的 Python 绑定,附带几个便捷函数,让你直接用 NumPy 数组处理音频。Linux、macOS、Windows 都能跑,装一个库就省去了直接调 PortAudio C 接口的麻烦。

正文顶部截图

1、 这玩意儿是干嘛的

就一件事:用几行 Python 代码录音和放音,数据直接存在 NumPy 数组里。

Python 里处理音频的库不少。PyAudio 也是 PortAudio 绑定,但安装依赖多,Windows 上经常报错。wave 是标准库,功能太基础,只支持 WAV 格式。simpleaudio 适合简单播放,但不支持录音。sounddevice 把 PortAudio 的能力完整封装成 Python 函数,录音、播放、流式处理都覆盖了。

import sounddevice as sd
import numpy as np

fs = 44100
duration = 5.5
myrecording = sd.rec(int(duration * fs), samplerate=fs, channels=2)
sd.wait()
sd.play(myrecording, fs)

核心设计很直接:输入输出都是 NumPy 数组,跟科学计算、机器学习的工具链无缝对接。不需要额外的编解码器,不需要手动管理缓冲区。

2、 为什么要用它

做过音频处理的人都懂那种尴尬:想快速验证一个想法,结果花半小时装驱动、配环境、查回调函数怎么写。

PortAudio 本身是跨平台音频 I/O 库,能力很强。但直接调 C API 代码量大,还要自己处理线程和缓冲区。sounddevice 的解法是不过度封装,不搞复杂的类继承。你写一个 callback 函数传进去,它按帧调用;你给一个 NumPy 数组,它负责播放。中间没有任何黑箱。

import sounddevice as sd
import numpy as np

def callback(indata, outdata, frames, time, status):
    outdata[:] = indata * 0.5  # 回声降低一半音量

with sd.Stream(channels=2, callback=callback):
    sd.sleep(10000)

支持的功能:

  • 录音和播放(同步和异步都支持)
  • 流式 callback 处理,适合低延迟场景
  • 设备枚举和默认设备选择
  • 输入输出电平实时查询
  • 暂停、继续、中止控制

README区域截图

3、 怎么用

安装就一行:

pip install sounddevice

参数说明:

import sounddevice as sd

# 查看系统有哪些音频设备
print(sd.query_devices())

# 播放一个 NumPy 数组
sd.play(data, samplerate)

# 录音,返回 NumPy 数组
recording = sd.rec(frames, samplerate=44100, channels=1)
sd.wait()

几个要点:

  • sd.query_devices() 返回所有音频设备列表,可以指定输入输出设备
  • sd.rec 默认使用 blocking 模式,调用后可以用 sd.wait() 等录音结束
  • 回调函数里的 indataoutdata 是二维 NumPy 数组,形状是 (frames, channels)
  • 安装 virtual audio cable 之类的虚拟声卡后,可以抓取系统音频输出

需要低延迟场景可以用 sd.Streamsd.RawStream,自己控制缓冲区大小。大部分场景下 blocking 模式已经够用。

4、 适合哪些人用

  • 做音频分析和语音处理的研究者,需要快速采集音频数据
  • 做实时音频效果验证的产品开发者,想快速出原型
  • 在教育场景中演示数字信号处理概念,代码简洁学生容易理解
  • 想在 Python 项目里集成音频功能的开发者,不想被底层细节拖住

这个库不追求功能最全,追求的是够用、直接、不出错。如果你的需求在它的覆盖范围内,它是 Python 里处理音频最省心的选择之一。

hon 项目里集成音频功能的开发者,不想被底层细节拖住

这个库不追求功能最全,追求的是够用、直接、不出错。如果你的需求在它的覆盖范围内,它是 Python 里处理音频最省心的选择之一。

更多推荐