1. 读取并可视化语音波形

读取并可视化语音波形 学习卡片

任务目标

使用Python读取一段WAV音频文件,绘制其时域波形图,并在图上标注采样率、采样点数与音频时长等基本信息,形成可复现的语音波形可视化流程。

环境与依赖

需要Python 3.8+环境,并安装以下库:

pip install numpy matplotlib scipy

完整实现代码

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile

# 1. 读取WAV文件(请将路径替换为实际文件)
wav_path = "speech_sample.wav"  # 替换为你的WAV文件路径
sample_rate, audio_data = wavfile.read(wav_path)

# 2. 处理多声道:若为立体声,仅取左声道进行分析
if audio_data.ndim > 1:
    audio_data = audio_data[:, 0]

# 3. 计算音频时长与采样点数
num_samples = len(audio_data)
duration = num_samples / sample_rate

# 4. 生成时间轴(单位:秒)
time_axis = np.linspace(0, duration, num=num_samples, endpoint=False)

# 5. 绘制时域波形
plt.figure(figsize=(12, 4))
plt.plot(time_axis, audio_data, linewidth=0.5, color="#1f77b4")
plt.xlabel("时间 (s)")
plt.ylabel("振幅")
plt.title("语音波形图")
plt.grid(True, alpha=0.3)

# 6. 在图上标注基本信息
info_text = f"采样率: {sample_rate} Hz\n采样点数: {num_samples}\n时长: {duration:.3f} s"
plt.text(0.98, 0.95, info_text, transform=plt.gca().transAxes,
         fontsize=10, verticalalignment="top", horizontalalignment="right",
         bbox=dict(boxstyle="round", facecolor="white", alpha=0.8))

plt.tight_layout()
plt.show()

# 7. 控制台输出基本信息
print(f"采样率: {sample_rate} Hz")
print(f"采样点数: {num_samples}")
print(f"时长: {duration:.3f} 秒")
print(f"数据类型: {audio_data.dtype}")
print(f"振幅范围: [{audio_data.min()}, {audio_data.max()}]")

运行方式

  1. 将上述代码保存为 plot_waveform.py。
  2. 准备一个WAV格式的音频文件(如录制一段语音),将其路径替换到代码中的 wav_path 变量。
  3. 在终端执行:python plot_waveform.py

验证方法

  • 程序正常结束且无报错,控制台输出的采样率与音频文件属性一致(可用文件管理器或 ffprobe 工具核对)。
  • 弹出窗口中显示连续的时域波形,横轴为时间(秒),纵轴为振幅;波形整体包络与语音的响度变化相符,静音段振幅接近0。
  • 图形右上角标注的采样率、采样点数、时长与控制台输出一致,且时长 ≈ 采样点数 ÷ 采样率。
语音波形读取与可视化流程 WAV文件 speech_sample.wav wavfile.read() 采样率 + 音频数据 信息提取 时长 / 采样点数 输出 波形图 波形图关键信息标注 0s 时长 T 采样率: 16000 Hz 采样点数: 32000 时长: 2.000 s 振幅

常见问题

  • 文件读取错误:确认WAV文件路径正确且文件未损坏;若为其他格式(如MP3),需先用工具转换为WAV。
  • 波形显示为一条直线:检查音频振幅是否过小,可尝试打印 audio_data.min() 与 audio_data.max() 确认数据范围;若全为0,说明文件为静音。
  • 立体声文件:代码已自动取左声道,如需分析右声道或双声道叠加,可修改第2步的索引。