目前我接触到的处理音频的python库有:
wave-标准库
scipy.io.wavfile
librosa
wavio
thikdsp-github
soundfile
需要注意不同库读取音频得到的data类型是不同的,有的是array有的是list,元素也不同有的是整数,有的是浮点数,也即是归一化了的。
norm:boolean [scalar]
enable amplitude normalization. For floating point y, scale the data to the range [-1, +1].
本此实验还是采用librosa
为啥呢?
1.以array形式读取和存入的数值——用numpy处理数据
2.读取和存入都会自动归一化处理——保证音量一致了
3.其它的一些读出竖排的数据或者list我试了试没这个方便
src_root = 'D:\workspace\Jupyter\speech\wavfiles'
classes = os.listdir(src_root)
for _cls in sorted(classes):
for fn in sorted(os.listdir(os.path.join(src_root, _cls))):
f = wave.open(os.path.join(src_root, _cls, fn))
SampleRate = f.getframerate()
frames = f.getnframes()
# Duration 也就是音频时长 = 采样点数/采样率
Duration = wav_time = frames / float(SampleRate) # 单位为s
wav,sr = librosa.load(os.path.join(src_root, _cls, fn),sr=16000) #所有都需要librosa处理归一
if Duration<=2.0:
n = 32000-wav.shape[0]#需要补齐的0
ndarray=np.pad(wav,(0,n),'constant', constant_values=(0,0.0000000e+00))
librosa.output.write_wav(os.path.join('D:\workspace\Jupyter\speech\clean', _cls, fn), ndarray, 16000)
elif Duration>2.0:
ndarray=wav[:32000]#从尾部截掉
print(os.path.join(src_root, _cls, fn))
librosa.output.write_wav(os.path.join('D:\workspace\Jupyter\speech\clean', _cls, fn), ndarray, 16000)
else:
continue