GitHub - yeyupiaoling/AudioClassification-Pytorch: 基于Pytorch实现的声音分类
1.环境安装
1.先安装conda
Ubuntu 使用conda安装python虚拟环境并进行yolo-fast训练_Y_Hungry的博客-CSDN博客
2. 创建虚拟环境
conda create -n v38 python=3.8
3.切换到conda环境
conda activate v38
4.安装libsora
conda install pytest-runner
conda install librosa==0.9.1
5.安装pydub
pip install pydub
2.测试环境
import librosa
import librosa.display
import matplotlib.pyplot as plt
data_path = "/root/AudioClassification-Pytorch/mos.mp3"
wav, sr = librosa.load(data_path, sr=16000)
melspec = librosa.feature.melspectrogram(y=wav, sr=sr, n_fft=400, n_mels=80, hop_length=160, win_length=400)
logmelspec = librosa.power_to_db(melspec, ref=1.0, amin=1e-10, top_db=None)
plt.figure()
# plot a wavform
plt.subplot(2, 1, 1)
librosa.display.waveshow(wav, sr)
plt.title('mos Beat wavform')
# plot mel spectrogram
plt.subplot(2, 1, 2)
librosa.display.specshow(logmelspec, sr=sr, x_axis='time', y_axis='mel')
plt.title('mos Mel spectrogram')
plt.tight_layout() #保证图不重叠
plt.show()
3.生成数据列表
生成数据列表,用于下一步的读取需要,audio_path
为音频文件路径,用户需要提前把音频数据集存放在dataset/audio
目录下,每个文件夹存放一个类别的音频数据,每条音频数据长度在3秒以上,如 dataset/audio/鸟叫声/······
。audio
是数据列表存放的位置,生成的数据类别的格式为 音频路径\t音频对应的类别标签
,音频路径和标签用制表符 \t
分开。读者也可以根据自己存放数据的方式修改以下函数。
Urbansound8K 是目前应用较为广泛的用于自动城市环境声分类研究的公共数据集,包含10个分类:空调声、汽车鸣笛声、儿童玩耍声、狗叫声、钻孔声、引擎空转声、枪声、手提钻、警笛声和街道音乐声。数据集下载地址:https://zenodo.org/record/1203745/files/UrbanSound8K.tar.gz。以下是针对Urbansound8K生成数据列表的函数。如果读者想使用该数据集,请下载并解压到 dataset
目录下,把生成数据列表代码改为以下代码。
# 生成数据列表
def get_data_list(audio_path, list_path):
sound_sum = 0
audios = os.listdir(audio_path)
f_train = open(os.path.join(list_path, 'train_list.txt'), 'w')
f_test = open(os.path.join(list_path, 'test_list.txt'), 'w')
for i in range(len(audios)):
sounds = os.listdir(os.path.join(audio_path, audios[i]))
for sound in sounds:
if '.wav' not in sound:continue
sound_path = os.path.join(audio_path, audios[i], sound)
t = librosa.get_duration(filename=sound_path)
# 过滤小于2.1秒的音频
if t >= 2.1:
if sound_sum % 100 == 0:
f_test.write('%s\t%d\n' % (sound_path, i))
else:
f_train.write('%s\t%d\n' % (sound_path, i))
sound_sum += 1
print("Audio:%d/%d" % (i + 1, len(audios)))
f_test.close()
f_train.close()
if __name__ == '__main__':
get_data_list('dataset/UrbanSound8K/audio', 'dataset')
4.训练模型
python3 train.py
可能会报错,将下面的代码修改一下,线程数量改为0
add_arg('num_workers', int, 0, '读取数据的线程数量')