音频分类-数据集:ESC-50【每个音频长度为5 秒,5个大类,50 个小类(每个小类 40 个样本),共 2000个样本】

本文介绍了ESC-50数据集,它包含5秒录音片段,分为50个语义类别。通过示例展示了如何使用Python进行音频文件处理,包括读取、可视化和播放。同时,链接了GitHub下载地址,适合环境声音分类研究者作为基准测试资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该数据集由 5 秒长的记录组成,这些记录被组织成 50 个语义类(每个类 40 个示例),松散地排列成 5 个主要类别,
ESC-50 数据集是 2000 个环境录音的标记集合,适用于环境声音分类的基准测试方法。

GitHub下载地址:(https://github.com/karolpiczak/ESC-50)
esc-50-aug

在这里插入图片描述
对应的cvs文件有声音的描述:
在这里插入图片描述

# 例如我们播放狗叫声
import IPython.display as display
display.Audio('../study/sound/ESC-50/audio/1-100032-A-0.wav')
# 声音可视化代码, 使用pywave模块,读取声音文件,一组将声音文件一波形显示
import wave
import struct
import numpy as np
import matplotlib.pyplot as plt

# 读取wav文件
filename = '../study/sound/ESC-50/audio/1-100032-A-0.wav'
wavefile = wave.open(filename, 'r')  # open for writing

# 读取wav文件的四种信息的函数。期中numframes表示一共读取了几个frames。
nchannels = wavefile.getnchannels()
sample_width = wavefile.getsampwidth()
framerate = wavefile.getframerate()
numframes = wavefile.getnframes()

print("channel", nchannels)
print("sample_width", sample_width)
print("framerate", framerate)
print("numframes", numframes)

# 建一个y的数列,用来保存后面读的每个frame的amplitude。
y = np.zeros(numframes)

# for循环,readframe(1)每次读一个frame,取其前两位,是左声道的信息。右声道就是后两位啦。
# unpack是struct里的一个函数,用法详见http://docs.python.org/library/struct.html。简单说来就是把#packed的string转换成原来的数据,无论是什么样的数据都返回一个tuple。这里返回的是长度为一的一个
# tuple,所以我们取它的第零位。
for i in range(numframes):
    val = wavefile.readframes(1)
    left = val[0:2]
    # right = val[2:4]
    v = struct.unpack('h', left)[0]
    y[i] = v
    
# framerate就是声音的采用率,文件初读取的值。
Fs = framerate
time = np.arange(0, numframes) * (1.0 / framerate)

# 显示时域图(波形图)
plt.subplot(211)
plt.plot(time, y)
# 显示频域图(频谱图)
plt.subplot(212)
plt.specgram(y, NFFT=1024, Fs=Fs, noverlap=900)
plt.show()

在这里插入图片描述




参考资料:
声音之旅 ----- 声音数据集 ESC-50
ESC-50数据集的分析(1)

### 使用 PyTorch 实现环境声音分类 实现环境声音分类涉及多个步骤,包括数据预处理、模型构建、训练和评估。以下是详细的说明: #### 数据集准备 为了进行环境声音分类,通常会使用公开的数据集ESC-50 或 UrbanSound8K。这些数据集包含了不同别的音频片段。 ```python import librosa import numpy as np from sklearn.model_selection import train_test_split def load_audio_files(file_path, sample_rate=22050): input_length = sample_rate * 5 # 假设每段音频长度5 data = [] signal, sr = librosa.load(file_path, sr=sample_rate) if len(signal) >= input_length: max_offset = len(signal) - input_length offset = np.random.randint(max_offset) signal = signal[offset:(input_length + offset)] else: signal = np.pad(signal, (0, max(input_length - len(signal), 0)), "constant") mfccs = librosa.feature.mfcc(y=signal, sr=sr, n_mfcc=40) data.append(np.array(mfccs).mean(axis=1)) return np.array(data)[np.newaxis, :, :] ``` 此函数用于加载并处理单个音频文件,提取其MFCC特征作为输入向量[^1]。 #### 构建神经网络模型 接下来定义一个简单的卷积神经网络(CNN),该CNN能够接收上述得到的二维数组形式的MFCC特征图谱作为输入,并输出别概率分布。 ```python import torch.nn as nn import torch class SoundClassifier(nn.Module): def __init__(self, num_classes=10): super(SoundClassifier, self).__init__() self.conv_block1 = nn.Sequential( nn.Conv2d(in_channels=1, out_channels=16, kernel_size=(3, 3), stride=(1, 1)), nn.ReLU(), nn.MaxPool2d(kernel_size=(2, 2))) self.flatten = nn.Flatten() self.fc_layer = nn.Linear(16*9*40, num_classes) def forward(self, x): batch_size = x.size(0) x = self.conv_block1(x.unsqueeze(dim=1)) x = self.flatten(x) logits = self.fc_layer(x) probs = F.softmax(logits, dim=-1) return probs ``` 这段代码创建了一个名为`SoundClassifier` 的模块化组件,它继承自 `nn.Module` ,在其中实现了前馈传播逻辑[^2]。 #### 训练过程 最后一步是编写脚本来执行实际的学习流程,这涉及到设置优化器、损失函数以及迭代更新权重的过程。 ```python device = 'cuda' if torch.cuda.is_available() else 'cpu' model = SoundClassifier(num_classes=len(classes)).to(device) criterion = nn.CrossEntropyLoss().to(device) optimizer = optim.Adam(model.parameters(), lr=learning_rate) for epoch in range(num_epochs): model.train() running_loss = .0 for i, (inputs, labels) in enumerate(train_loader): inputs, labels = inputs.to(device), labels.to(device) optimizer.zero_grad() outputs = model(inputs.float()) loss = criterion(outputs, labels.long()) loss.backward() optimizer.step() running_loss += loss.item() print(f'Train Loss: {running_loss / len(train_loader)}') ``` 通过以上几部分的工作,便可以在本地环境中运行完整的环境声学分类任务了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值