wave 是 Python 标准库中用于读写 WAV(Waveform Audio File Format)音频文件的模块。它提供了对 PCM 编码的无压缩音频文件的访问接口,可以读取音频帧、获取音频参数,也可以创建和写入 WAV 文件。由于 WAV 是常用的音频格式之一,wave 模块在音频处理、信号分析、语音识别等场景中非常实用。
常见应用场景:
(1)音频文件读取
从 WAV 文件中提取音频帧和参数,用于分析或播放。
(2)音频文件生成
将 PCM 数据写入 WAV 文件,生成音频。
(3)音频处理与信号分析
与 numpy、scipy 等结合,实现音频特征提取或数字信号处理。
(4)语音处理
对语音数据进行采样、帧切分、特征分析等。
(5)自动化音频生成工具
生成提示音、告警音或其他简单音效。
◆ ◆ ◆
核心概念
1、Wave_read 对象
通过 wave.open(file, "rb") 创建,用于读取 WAV 文件的参数和帧数据。
2、Wave_write 对象
通过 wave.open(file, "wb") 创建,用于写入 WAV 文件。
3、音频参数
nchannels:声道数(1=单声道,2=立体声)
sampwidth:每个采样字节数(如 2 表示 16 位)
framerate:采样率(Hz)
nframes:音频帧总数
comptype / compname:压缩类型,WAV 通常为 "NONE"
4、帧操作
readframes(n):读取 n 帧数据
writeframes(data):写入帧数据
音频帧是二进制数据,可与 struct 或 numpy 结合处理。
◆ ◆ ◆
应用举例
例 1:读取 WAV 文件基本信息
python
import wave
with wave.open("example.wav", "rb") as wf: print("声道数:", wf.getnchannels()) print("采样宽度:", wf.getsampwidth()) print("采样率:", wf.getframerate()) print("总帧数:", wf.getnframes())
例 2:读取音频帧
python
import wave
with wave.open("example.wav", "rb") as wf: frames = wf.readframes(wf.getnframes()) print("帧数据长度:", len(frames))
例 3:写入 WAV 文件
python
import wave
with wave.open("output.wav", "wb") as wf: wf.setnchannels(1) # 单声道 wf.setsampwidth(2) # 16 位 wf.setframerate(44100) # 采样率 wf.writeframes(b"\x00\x00" * 44100) # 1 秒静音
例 4:复制 WAV 文件
css
import wave
with wave.open("example.wav", "rb") as src: with wave.open("copy.wav", "wb") as dst: dst.setnchannels(src.getnchannels()) dst.setsampwidth(src.getsampwidth()) dst.setframerate(src.getframerate()) dst.writeframes(src.readframes(src.getnframes()))
例 5:使用 numpy 处理 WAV 数据
python
import waveimport numpy as np
with wave.open("example.wav", "rb") as wf: frames = wf.readframes(wf.getnframes()) data = np.frombuffer(frames, dtype=np.int16) print("前 10 个采样值:", data[:10])
◆ ◆ ◆
常用 API 与方法
wave.open(filename, mode)
打开 WAV 文件,返回 Wave_read 或 Wave_write 对象。
参数:
filename:文件路径。
mode:模式 "rb"(读取)或 "wb"(写入)。
返回:Wave_read / Wave_write 实例。
Wave_read.getnchannels()
获取声道数。
返回:整数(声道数)。
Wave_read.getsampwidth()
获取每个采样字节数。
返回:整数(字节数)。
Wave_read.getframerate()
获取采样率(Hz)。
返回:整数。
Wave_read.getnframes()
获取音频帧总数。
返回:整数。
Wave_read.readframes(n)
读取 n 帧音频数据。
参数:
n:读取帧数。
返回:字节对象(frames)。
Wave_write.setnchannels(n)
设置声道数。
参数:整数。
返回:无。
Wave_write.setsampwidth(n)
设置采样宽度(字节数)。
参数:整数。
返回:无。
Wave_write.setframerate(rate)
设置采样率。
参数:整数。
返回:无。
Wave_write.writeframes(data)
写入音频帧。
参数:字节对象。
返回:无。
📘 小结
wave 模块提供了对 WAV 音频文件的读取与写入能力,适用于音频分析、信号处理、语音处理和自动化音效生成。通过 Wave_read 和 Wave_write 对象,可以方便地获取音频参数、操作帧数据,并结合 numpy 或 scipy 进行深度处理,实现数据分析和音频生成。

"点赞有美意,赞赏是鼓励"