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()}]")
运行方式
- 将上述代码保存为
plot_waveform.py。 - 准备一个WAV格式的音频文件(如录制一段语音),将其路径替换到代码中的
wav_path变量。 - 在终端执行:
python plot_waveform.py
验证方法
- 程序正常结束且无报错,控制台输出的采样率与音频文件属性一致(可用文件管理器或
ffprobe工具核对)。 - 弹出窗口中显示连续的时域波形,横轴为时间(秒),纵轴为振幅;波形整体包络与语音的响度变化相符,静音段振幅接近0。
- 图形右上角标注的采样率、采样点数、时长与控制台输出一致,且时长 ≈ 采样点数 ÷ 采样率。
常见问题
- 文件读取错误:确认WAV文件路径正确且文件未损坏;若为其他格式(如MP3),需先用工具转换为WAV。
- 波形显示为一条直线:检查音频振幅是否过小,可尝试打印
audio_data.min()与audio_data.max()确认数据范围;若全为0,说明文件为静音。 - 立体声文件:代码已自动取左声道,如需分析右声道或双声道叠加,可修改第2步的索引。