wave模块仅解析WAV文件获取PCM数据,无播放功能;需配合pyaudio等库输出到声卡,且pyaudio参数必须与WAV头信息严格一致:format由getsampwidth()决定,channels和rate分别用getnchannels()、getframerate()动态获取,output=True不可省略。

为什么直接用 wave 读不了音频?
wave 模块只是个 WAV 文件解析器,它不带播放能力。你调用 wave.open() 只能得到一个文件对象,里面是原始 PCM 数据(比如 int16 样本),但没接口把数据喂给声卡。常见错误是以为 readframes() 返回就能直接“发声”,结果静音——因为压根没走音频输出通路。
必须搭配能驱动音频设备的库,pyaudio 是最轻量、跨平台、无需额外服务的选项。它的核心逻辑是:开一个输出流 → 把 wave 读出的二进制帧,按格式写入流 → 声卡自动播放。
用 pyaudio 播放前必须对齐哪些参数?
WAV 文件头里存着采样率、声道数、位深度等信息,pyaudio 的 open() 必须和这些值严格一致,否则会爆错或失真。不能硬写死 rate=44100,得从 WAV 对象里动态读出来。
-
format:根据wav_file.getsampwidth()选,1字节 →pyaudio.paInt8,2字节 →pyaudio.paInt16(最常见),4字节 →pyaudio.paInt32 -
channels:直接用wav_file.getnchannels() -
rate:直接用wav_file.getframerate() -
output=True必须显式指定,否则是输入流
漏掉任一参数匹配,可能报 PortAudioError: Invalid number of channels 或声音变调/加速。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
立即学习“Python免费学习笔记(深入)”;
完整播放代码里最容易漏的三件事
下面这段是真正能跑通的最小闭环,不是示例,是实操模板:
import wave import pyaudio <p>wav_path = "sound.wav" wav_file = wave.open(wav_path, 'rb')</p><p>p = pyaudio.PyAudio() stream = p.open( format=p.get_format_from_width(wav_file.getsampwidth()), channels=wav_file.getnchannels(), rate=wav_file.getframerate(), output=True )</p><h1>一次读 1024 帧,避免内存暴涨(尤其大文件)</h1><p>chunk = 1024 data = wav_file.readframes(chunk) while data: stream.write(data) data = wav_file.readframes(chunk)</p><h1>必须显式关闭!否则下次运行可能报设备忙</h1><p>stream.stop_stream() stream.close() p.terminate() wav_file.close()</p>
- 没调
stream.stop_stream()和stream.close():下次运行可能卡在PortAudioError: Device unavailable - 用
wav_file.readframes(-1)一次性读全:超大 WAV(如 100MB)会吃光内存,直接 OOM - 忘记
wav_file.close():Windows 下可能锁住文件,删不掉或改不了名
遇到 ImportError: No module named 'pyaudio' 怎么办?
pyaudio 依赖系统级 C 库(PortAudio),pip install pyaudio 在 Windows/macOS 上常失败。别硬试源码编译。
- Windows:优先用
pip install pipwin && pipwin install pyaudio - macOS(M1/M2):先
brew install portaudio,再pip install pyaudio - Linux(Ubuntu/Debian):先
sudo apt-get install python3-pyaudio,或sudo apt-get install portaudio19-dev python3-dev再 pip
如果仍不行,说明环境里混了多个 Python 版本,pip 装的包没落到当前解释器路径下——查 which python 和 which pip 是否一致,或者直接用 python -m pip install pyaudio。

















