树莓派上用 Python 玩转音频播放:从入门到实战的完整指南
在嵌入式项目中,声音是最直接的人机交互方式之一。无论是智能门铃的'叮咚'声、语音助手的回应,还是环境监测系统的报警提示,都离不开稳定可靠的音频播放能力。而树莓派 + Python 的组合,恰好提供了既强大又灵活的实现路径。
面对 PyAudio、pygame.mixer、sounddevice 等多个选择,到底该用哪个?它们各自适合什么场景?怎么避免常见的'无声坑'?本文将带你一步步打通树莓派音频开发的关键环节,不讲空话,只给能落地的方案。
为什么树莓派上的音频这么'难搞'?
先泼一盆冷水:树莓派本身没有内置功放,3.5mm 耳机口输出功率有限,接普通小喇叭可能音量微弱甚至无声。更别说系统默认音频输出可能指向 HDMI,而不是你插着的扬声器。
再加上 Linux 的音频架构(ALSA/PulseAudio)本就复杂,Python 又是高层语言,中间还隔着 PortAudio 这样的桥梁库……稍有不慎,就会出现:
- 播放失败
- 音频卡顿
- 格式不支持
- 多进程抢占设备
所以,搞清楚'谁控制谁'特别重要。
简单来说,在树莓派上,你的 Python 程序 → 调用音频库 → 通过 ALSA 访问声卡 → 输出到物理设备。整个链条任何一个环节出问题,都会导致'静音'。
✅ 小贴士:运行
sudo raspi-config,进入 System Options > Audio,手动选择'Force 3.5mm ('headphone') jack'可以强制音频走模拟口。
方案一:精细控制之选 —— PyAudio
如果你需要对采样率、缓冲区、声道等参数精确掌控,比如做实时音频处理或者低延迟应用,PyAudio 是首选。
它底层基于 C 编写的 PortAudio,可以直接与 ALSA 打交道,绕过 PulseAudio 的调度开销,延迟更低。
安装有点坑,得提前铺路
# 先装依赖
sudo apt-get install portaudio19-dev python3-pyaudio
# 或者用 pip(推荐使用虚拟环境)
pip install pyaudio
注意:直接 pip install pyaudio 经常报错,因为缺少 PortAudio 开发库。上面那条 apt 命令就是补这个'地基'的。
实战代码:播放一个 WAV 文件
import pyaudio
import wave
def play_wav(file_path):
wf = wave.open(file_path, 'rb')
p = pyaudio.PyAudio()
stream = p.open(
format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True
)
chunk = 1024
data = wf.readframes(chunk)
while data:
stream.write(data)
data = wf.readframes(chunk)
stream.stop_stream()
stream.close()
p.terminate()
wf.close()

