wavefile和librosa使用常用到的问题(音频处理)

      最近做一些基于深度学习音频上的算法,在对数据处理时,需要做数据的重采样、滤波。常常会用到librosa和wavfile,其中会遇到很多隐形的问题,会导致工作量加大。最近把遇到的问题进行
 
总结了一下,希望对大家有帮助。
 
 
一、librosa的读取、重采样、保存需要注意的点
        
        1、读取方式:data, sr = librosa.load("*.wav", sr=16000), 注意读取出来的数据,是做了32767的归一化。
 
        2、重采样方式:data = librosa.resample(data.astype(np.float32), fs, 16000),注意一定要对数据做astype(np.float32),否则会出现下采样无效。
 
        3、保存音频:
 
                1)librosa.output.write_wav("./p225_004_2_L_2.wav", up_sample_data, 16000,norm=False),注意一定要确认norm的定义,会随着librosa版本的不同,norm的默认值不一致,norm为Ture表示做标准化,最大值变为1,否则是保存做了32767后的(-1,1)的归一化。
 
                2)注意librosa保存的wav文件,当用wavefile读取的时候还是归一化后的值。所以尽量不要用librosa保存音频。
 
二、wavefile的读取、保存需要注意的点
 
        1、读取方式:fs, data = wavfile.read(path)
            
                1)注意读出的数据是一个整型,没有做32767的归一化。
                
                2)如果为了防止原始音频的采样率不统一影响模型训练和预测,需要对重采样进行采样率的标准化。需要添加data = librosa.resample(data.astype(np.float32), fs, 16000), 注意一定要对数据做astype(np.float32,否则会出现 下采样无效
 
                3)做完重采样后会出现最大值远大于32767的情况,因此需要注意,需要对其进行动态标准化,避免早保存时候出现溢出(np.int16的最大值是32767,多了会削波)。可以添加判断,np.max(abs(x_filted)) / np.max(abs(up_sample_data))
 
        2、数据的保存:wavfile.write("./p225_004_2_L_2.wav", 16000, data.astype(np.int16))
                
                1) 注意要对数据进行int16的数据格式转换
 
                2) 在保存之前做:x_filted = np.clip(x_filted, -32767, 32767), 从而限制最大值最小值的溢出,但是,当x_filted远大于32767时候是无效的,因此需要进行动态标准化(二/1/3所示)
 
三、librosa 与 wavfile 的混合使用
 
        1、librosa读取,然后wavfile 保存:librosa自动做了归一化,然后wavfile是一个32767的int类型,因此当wavfile做数据保存的时候,需要对librosa读取到的数据data*32767.
 
        2、wavfile读取librosa保存的结果,得到的仍然是一个(-1,1)的值
 
        3、librosa读取wavfile保存的文件正常,自动会做归一化。
 
四、录波器
 
        1、方案:sos = signal.butter(8, 100, 'highpass', output='sos', fs=16000) ,data_filted = signal.sosfilt(sos, data)。需要注意,越是低频阶数越不能设置太大。另外,做完录波后可能会出现溢出,
    
    因此,需要对其做动态标准化和clip。、
 
 
如果转发请附带博客链接,谢谢!

猜你喜欢

转载自blog.csdn.net/qq_37100442/article/details/110092393