1. 读取WAV音频并绘制波形
任务目标
读取一段语音文件(WAV格式),绘制其时域波形图,并输出时长、采样率、幅度范围等基本统计信息,建立后续MFCC特征提取与降噪处理的基础数据认知。
环境依赖
- Python 3.8+
- numpy
- matplotlib
- scipy(或标准库wave,本案例使用scipy.io.wavfile)
安装命令:pip install numpy matplotlib scipy
完整代码
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
def load_wav(filepath):
"""读取WAV文件,返回采样率和音频数据"""
sample_rate, data = wavfile.read(filepath)
# 若为立体声,取单声道
if data.ndim > 1:
data = data.mean(axis=1)
return sample_rate, data
def analyze_audio(filepath):
"""读取音频并计算基本统计信息"""
sample_rate, data = load_wav(filepath)
duration = len(data) / sample_rate
amp_min = np.min(data)
amp_max = np.max(data)
amp_range = amp_max - amp_min
print(f"采样率: {sample_rate} Hz")
print(f"时长: {duration:.3f} 秒")
print(f"样本点数: {len(data)}")
print(f"幅度范围: [{amp_min}, {amp_max}]")
print(f"幅度跨度: {amp_range}")
return sample_rate, data, duration
def plot_waveform(sample_rate, data, duration):
"""绘制语音波形图"""
time = np.linspace(0, duration, len(data))
plt.figure(figsize=(12, 4))
plt.plot(time, data, linewidth=0.5, color='#2E86AB')
plt.xlabel('时间 (秒)')
plt.ylabel('幅度')
plt.title('语音波形图')
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('waveform.png', dpi=150)
plt.show()
if __name__ == "__main__":
# 使用示例:请将audio.wav替换为实际文件路径
wav_path = "audio.wav"
# 若没有现成语音文件,可生成一段测试音频
import os
if not os.path.exists(wav_path):
print("未找到audio.wav,生成测试音频...")
sr = 16000
t = np.linspace(0, 2, sr*2, endpoint=False)
# 模拟语音信号:基频+谐波+噪声
test_signal = (0.5*np.sin(2*np.pi*220*t) +
0.3*np.sin(2*np.pi*440*t) +
0.1*np.random.randn(len(t)))
test_signal = (test_signal / np.max(np.abs(test_signal)) * 32767).astype(np.int16)
wavfile.write(wav_path, sr, test_signal)
print(f"已生成测试音频: {wav_path}")
sr, data, dur = analyze_audio(wav_path)
plot_waveform(sr, data, dur)
运行方式
- 将上述代码保存为
waveform_analysis.py。 - 准备一个WAV格式语音文件并命名为
audio.wav,放在同一目录下;若无现成文件,程序会自动生成2秒的测试音频。 - 执行
python waveform_analysis.py。
验证方法
- 程序输出包含采样率、时长、样本点数、幅度范围与跨度,数值应与实际文件一致(测试音频为16000Hz、2秒、幅度范围约[-32767, 32767])。
- 弹出波形图窗口并保存为
waveform.png,横轴为时间(秒),纵轴为幅度,图形应呈现语音的时域包络特征。 - 若使用自己的语音文件,可用
ffprobe或系统属性核对采样率与时长,与程序输出比对。
常见问题
- 立体声文件:代码自动取左右声道均值转为单声道,避免波形重叠。
- 文件不存在:程序自动生成测试音频,便于无样本时快速验证流程。
- 幅度单位:WAV文件通常为16位PCM编码,幅度范围为[-32768, 32767],归一化处理在后续MFCC步骤中进行。