python-sounddevice:用 Python 录音和放音,就这么简单
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 处理,适合低延迟场景
- 设备枚举和默认设备选择
- 输入输出电平实时查询
- 暂停、继续、中止控制

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()等录音结束- 回调函数里的
indata和outdata是二维 NumPy 数组,形状是 (frames, channels) - 安装 virtual audio cable 之类的虚拟声卡后,可以抓取系统音频输出
需要低延迟场景可以用 sd.Stream 或 sd.RawStream,自己控制缓冲区大小。大部分场景下 blocking 模式已经够用。
4、 适合哪些人用
- 做音频分析和语音处理的研究者,需要快速采集音频数据
- 做实时音频效果验证的产品开发者,想快速出原型
- 在教育场景中演示数字信号处理概念,代码简洁学生容易理解
- 想在 Python 项目里集成音频功能的开发者,不想被底层细节拖住
这个库不追求功能最全,追求的是够用、直接、不出错。如果你的需求在它的覆盖范围内,它是 Python 里处理音频最省心的选择之一。
hon 项目里集成音频功能的开发者,不想被底层细节拖住
这个库不追求功能最全,追求的是够用、直接、不出错。如果你的需求在它的覆盖范围内,它是 Python 里处理音频最省心的选择之一。
更多推荐
所有评论(0)