GitHub - yeyupiaoling/AudioClassification-Pytorch: 基于Pytorch实现的声音分类
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
- 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()

生成数据列表,用于下一步的读取需要,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')
python3 train.py
可能会报错,将下面的代码修改一下,线程数量改为0
add_arg('num_workers', int, 0, '读取数据的线程数量')