音频数据集的加载

知识整理

这几天在做一个课程设计,涉及到了需要读取指定文件夹下的音频文件进行相关的训练,一开始在数据集的读取和标签的加载这里花了一些时间,所以这里记录整理一下,只要能有一个人得到一点帮助就很很有用了。

数据集描述

首先我是需要读取一部分指定的音频文件进行训练,比如我只想训练一部分我重新整合好的数据集,而不是把原始数据集直接拿来使用,因为这个数据集的数据分布不是特别的均匀,就比较容易导致训练出来的效果不是很好。

加载音频文件
这里只说一下几个我用过的库:ffmpeg,opencv,librosa库。其中ffmpeg实际上是一个软件,拼接音频、剪切、音频和视频结合等等都可以。三个都可以通过pip install直接安装,opencv是很常用的音频和图像处理的库了,比较方便能够对视频进行各种处理。librosa是这次实验才使用的库,主要是利用它来进行特征的提取。其他的音频库还有pydub,pyaudio等等。

  • ffmepg:文档阅读

  • librosa:文档阅读
    上面是英文文档,这里有一个小伙伴进行了一下翻译,如果懒得去读英文的可以去这里

  • opencv:文档阅读

  • pydub:文档阅读
    pydub需要依赖 libav或者ffmpeg。[安装]

  • pyaudio:文档阅读

数据集获取

使用的是asvspoof挑战赛2019的语音数据集

  • 这里给出ASVspoof2017数据集的网盘链接,因为通常很多下载数据集的网址都有限速,挂梯也增加不了速度那种。
    提取码:fzya[数据集获取]

  • ASVspoof2019的数据集因为当时是直接下的没保存网盘,太大了有二十多g,如果实在找不到的需要可以私我。这里给出下载网址,特别慢。

  • 超神经是可以下载很多语音数据集、图像数据集,文本数据集等等,免费的。之前找数据集时看到的。包括目标检测、目标识别、跟踪等等超级多。

打开asv的标签文件可以看到它是分为了bonfied和spoof两种,还有不同的欺骗类型。这里首先给出数据集的标签文件格式:

LA_0098 LA_T_9987202 - - bonafide
LA_0079 LA_T_1004644 - A01 spoof

总共有5列数据,第一列是编号,第二列是文件名,第三列是分隔符,第四列是合成的方法,第五列是该语音是否是伪造的标签。这次实验使用的就是第五列标签。当然如果你做的分类问题不是判断是欺骗语音还是真实语音,也可以读取不同的列。

def loadlabel(labelpath):
    fp = open(labelpath, "r")
    sample = fp.readlines()
    label = {}  # 创建一个空列表
    #y_true=[]
        with open(labelpath, 'r') as f:
        for line in sample:
            line=line.replace('\n', '')
            try:
                sample_ = line.split(' ')#按照空格进行文件中每一行的切割,获得每一列数据
                #print(sample)
                label[sample_[1]+'.flac'] = sample_[4]#sample[4]就是第五列以此类推
                #y_true.append(y_c[sample_[4]])
            except IndexError as s:
                pass
    #print(y_true)
    return y_true,label

在测试的时候需要将指定类型的文件提取出来进行不同类别的测试,这里记录一下采取的两种办法:

利用批处理文件批量复制/移动指定文件:

利用excel和txt还有批处理文件进行指定文件名的批量文件复制,将每个类别分离出来,但这种方法会导致占用大量的空间,如果是空间不是很富余的话并不是很适合,但是这种批量复制指定文件的方法也很有用。

  1. 创建一个txt文件把你需要复制或者移动的文件名放进去。注意这里文件名要包括后缀名噢,比如video.mp3文件,你的txt里就是video.mp3,如果是video则会找不到文件。
  2. 创建一个批处理文件:新建txt——>改后缀名为.bat。如果是需要复制就是copy指令,如果需要移动就是move指令,可以自己根据需要变哈。修改E:\kechen\wav\train1为你的目的位置。
  3. 将这两个文件放在你所要复制或者移动的文件所在目录,双击执行bat文件。
//批处理文件move.bat
@echo off
for /f "delims=" %%i in (st.txt) do (
copy "%%i" E:\kechen\wav\train1
)
pause
//st.txt文件,就是放入想要批量复制/粘贴的列表
LA_T_1000406.flac
LA_T_1007571.flac
LA_T_1007663.flac
LA_T_1011221.flac
LA_T_1013597.flac
LA_T_1021790.flac
LA_T_1023546.flac
LA_T_1029184.flac
LA_T_1031233.flac
LA_T_1034923.flac
LA_T_1041717.flac
LA_T_1045294.flac
LA_T_1049021.flac
LA_T_1050008.flac

另一种将数据集根据它的一些分类进行读取使用的方法是通过编程直接实现,因为整个数据集标签已经存储到了一个txt文件夹当中,通过直接读取标签文件的类别那一列,判断是否是指定的类别,是就读入即可,这个方法就不存在数据重复存储,就是需要进行编程,可能有些小伙伴会觉得有些麻烦。这里就不放了哈,相信大家都不会有啥问题,和前面读入标签一个道理,只是多了一个判断。

你可能感兴趣的:(机器学习,python)