PyTorch torchaudio教程
一、简介
torchaudio 是 PyTorch 的一个扩展库,主要用于处理音频数据。它提供了丰富的工具来简化音频数据的加载、预处理和转换等操作。torchaudio 的设计充分利用了 PyTorch 的 GPU 加速能力,能够高效地处理大规模音频数据集。本教程教你如何加载、处理和分析音频数据。
二、加载音频文件
torchaudio 支持加载多种格式的音频文件,如 WAV 和 MP3。加载音频文件后,得到的是波形数据和采样率。
import torch
import torchaudio
import matplotlib.pyplot as plt
filename = "example.wav" # 音频文件路径
waveform, sample_rate = torchaudio.load(filename)
print("波形形状:", waveform.size())
print("采样率:", sample_rate)
plt.figure()
plt.plot(waveform.t().numpy())
plt.title("音频波形")
plt.show()
三、音频数据的可视化
torchaudio 提供了将波形转换为频谱图等功能,方便我们对音频数据进行可视化分析。
## 计算频谱图
specgram = torchaudio.transforms.Spectrogram()(waveform)
print("频谱图形状:", specgram.size())
plt.figure()
plt.imshow(specgram.log2()[0,:,:].numpy(), cmap='gray')
plt.title("频谱图")
plt.show()
四、音频数据的转换
torchaudio 提供了多种转换操作,用于对音频数据进行预处理和特征提取。
1. 重采样
将音频信号重采样为不同的采样率。
new_sample_rate = sample_rate // 10
resampler = torchaudio.transforms.Resample(sample_rate, new_sample_rate)
resampled_waveform = resampler(waveform)
print("重采样后波形形状:", resampled_waveform.size())
plt.figure()
plt.plot(resampled_waveform[0,:].numpy())
plt.title("重采样后的音频波形")
plt.show()
2. 计算 Mel 频谱图
Mel 频谱图是一种常用的音频特征表示方法,能够更好地捕捉人类听觉感知的特性。
mel_specgram = torchaudio.transforms.MelSpectrogram()(waveform)
print("Mel 频谱图形状:", mel_specgram.size())
plt.figure()
p = plt.imshow(mel_specgram.log2()[0,:,:].detach().numpy(), cmap='gray')
plt.title("Mel 频谱图")
plt.show()
3. Mu-Law 编码和解码
Mu-Law 编码是一种用于压缩音频数据的非线性方法,可以减少数据量并提高处理效率。
## Mu-Law 编码
mu_law_waveform = torchaudio.transforms.MuLawEncoding()(waveform)
print("Mu-Law 编码后波形形状:", mu_law_waveform.size())
plt.figure()
plt.plot(mu_law_waveform[0,:].numpy())
plt.title("Mu-Law 编码后的音频波形")
plt.show()
## Mu-Law 解码
decoded_waveform = torchaudio.transforms.MuLawDecoding()(mu_law_waveform)
print("Mu-Law 解码后波形形状:", decoded_waveform.size())
plt.figure()
plt.plot(decoded_waveform[0,:].numpy())
plt.title("Mu-Law 解码后的音频波形")
plt.show()
五、音频数据的功能性操作
torchaudio 还提供了一些低级的功能函数,用于对音频数据进行更细粒度的操作。
## 计算频谱图的增量
deltas = torchaudio.functional.compute_deltas(specgram, win_length=3)
print("增量形状:", deltas.shape)
plt.figure()
plt.imshow(deltas.log2()[0,:,:].detach().numpy(), cmap='gray')
plt.title("频谱图增量")
plt.show()
六、与 Kaldi 的兼容性
torchaudio 提供了与 Kaldi 兼容的接口,方便用户从 Kaldi 迁移到 torchaudio。
## 使用 Kaldi 兼容的频谱图计算
params = {
"channel": 0,
"dither": 0.0,
"window_type": "hanning",
"frame_length": 25.0,
"frame_shift": 10.0,
"remove_dc_offset": False,
"round_to_power_of_two": False,
"sample_frequency": sample_rate,
}
kaldi_specgram = torchaudio.compliance.kaldi.spectrogram(waveform, **params)
print("Kaldi 频谱图形状:", kaldi_specgram.size())
plt.figure()
plt.imshow(kaldi_specgram.t().numpy(), cmap='gray')
plt.title("Kaldi 频谱图")
plt.show()
七、可用数据集
torchaudio 提供了多个内置的音频数据集,方便用户快速上手和实验。
## 加载 YESNO 数据集
yesno_dataset = torchaudio.datasets.YESNO("./", download=True)
## 获取一个数据点
waveform, sample_rate, labels = yesno_dataset[3]
print("波形:", waveform)
print("采样率:", sample_rate)
print("标签:", labels)
plt.figure()
plt.plot(waveform.t().numpy())
plt.title("YESNO 数据集中的音频波形")
plt.show()
八、总结
通过本教程,你学习了如何使用 torchaudio 进行音频数据的加载、预处理、转换和可视化。torchaudio 提供了丰富的功能和接口,能够满足大多数音频处理任务的需求。
更多建议: