PyTorch torchaudio教程

2025-06-18 17:15 更新

一、简介

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 提供了丰富的功能和接口,能够满足大多数音频处理任务的需求。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号