1. 读取WAV音频并绘制波形

读取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)

运行方式

  1. 将上述代码保存为 waveform_analysis.py。
  2. 准备一个WAV格式语音文件并命名为 audio.wav,放在同一目录下;若无现成文件,程序会自动生成2秒的测试音频。
  3. 执行 python waveform_analysis.py。

验证方法

  • 程序输出包含采样率、时长、样本点数、幅度范围与跨度,数值应与实际文件一致(测试音频为16000Hz、2秒、幅度范围约[-32767, 32767])。
  • 弹出波形图窗口并保存为 waveform.png,横轴为时间(秒),纵轴为幅度,图形应呈现语音的时域包络特征。
  • 若使用自己的语音文件,可用 ffprobe 或系统属性核对采样率与时长,与程序输出比对。
语音波形读取与可视化流程 WAV文件 wavfile.read() 单声道转换 数据+采样率 统计信息计算 时长 / 采样率 / 幅度范围 波形图绘制 plt.plot() → waveform.png

常见问题

  • 立体声文件:代码自动取左右声道均值转为单声道,避免波形重叠。
  • 文件不存在:程序自动生成测试音频,便于无样本时快速验证流程。
  • 幅度单位:WAV文件通常为16位PCM编码,幅度范围为[-32768, 32767],归一化处理在后续MFCC步骤中进行。