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。、
 
 
如果转发请附带博客链接,谢谢!
  • 30
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
要去除音频中的人声,可以通过以下步骤实现: 1. 将音频文件加载到Python中。可以使用Python的内置`wave`模块或第三方库`pydub`。 2. 将音频数据转换为数字信号。可以使用`wave.readframes()`或`pydub.AudioSegment.get_array_of_samples()`函数。 3. 对数字信号进行预处理,例如通过傅里叶变换将其转换为频域信号。 4. 通过对频域信号进行滤波来去除人声。可以使用高通滤波器或带阻滤波器。 5. 将滤波后的信号转换回时域信号。 6. 将处理后的音频保存到新文件中。 下面是一个示例代码,演示了如何使用Python和NumPy库进行音频处理,去除音频中的人声: ```python import numpy as np import wave # 打开音频文件 audio_file = wave.open("input.wav", "r") # 读取音频数据 frame_rate = audio_file.getframerate() num_frames = audio_file.getnframes() audio_data = np.frombuffer(audio_file.readframes(num_frames), dtype=np.int16) # 进行傅里叶变换,将时域信号转换为频域信号 freq_data = np.fft.rfft(audio_data) # 设计一个高通滤波器,去除低频音频信号 cutoff_freq = 300 # 我们只保留高于此频率的信号 nyquist_freq = 0.5 * frame_rate # 奈奎斯特频率是采样频率的一半 cutoff_bin = int(cutoff_freq / nyquist_freq * len(freq_data)) freq_data[:cutoff_bin] = 0 # 将低于截止频率的所有频率置为0 # 将频域信号转换回时域信号 audio_data_filtered = np.fft.irfft(freq_data) # 将过滤后的音频保存到新文件中 audio_file_filtered = wave.open("output.wav", "w") audio_file_filtered.setparams(audio_file.getparams()) audio_file_filtered.writeframes(audio_data_filtered.astype(np.int16).tobytes()) audio_file_filtered.close() ``` 注意,这只是一个简单的示例代码,实际情况可能会更复杂。例如,你可能需要调整滤波器的参数来获得更好的效果。另外,使用`wave`模块进行音频处理可能会比较低级,你可能需要使用更高级的库,例如`pydub`或`librosa`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值