接着前一篇文章,昨晚做完后发现存在几个问题。
一、wavfile_split分割wav文件后才判断这个wav是否可用,存在不必要的计算,正常逻辑也就是wav不可用就不计算,这在文件夹下大量wav计算时,可能会浪费计算资源。
针对这个问题,笔者将提取wav_time的功能放在remove_silence函数里面,在return返回wav_time,用于在wavfile_split分割前判断即可,修改后功能如下:
二、这个有变量、有很多函数实现一个将文件夹下的wav语音文件分割成固定时长并提取MFCCs,那么为啥不面向对象,使用class呢?
这一改花了很长时间来调试,遇到几个很蠢的错误:
1、在最开始将属性和方法写入class时,直接在所有函数方法中应用属性。如果是最开始直接使用class的话可能没有啥问题,如果是修改添加类的话,修改了就较大。最后实践发现可能保留原函数复制回来,在关键的核心方法里面来应用属性可能会更加方面,代码量修改较少;
2、方法的函数定义,即使不使用属性,函数参数里面也得加上self,不然会报参数不一致错误。比如:“librosa_mfcc_mean_features() takes 2 positional arguments but 3 were given” 。
3、为了增加灵活性,在函数方法里面可用定义自由参数,用于用户自定义的指定,比如get_dir_wavfile_mfccs_csv(self,csv_filename)。在调用get_dir_wavfile_mfccs_csv方法时,可以自自己指定文件名称,而不是直接在class里面来指定。
三、按每个文件3秒来分割文件,文件如果是2.9秒,那么就会舍弃文件,不纳入样本中,这可能会丢失一些wav文件,数据采集成本是很高的,轻易舍弃实在些可惜。笔者想到在文件末尾添零来补足3秒时长,这在最终提取MFCC均值时,这补足的时长对于整体也影响不大。可惜今晚没有时间来搞,带明天再来完善吧。
网友评论