对纯净语音加噪主要为了测试去噪算法的效果,本小程序根据信噪比的定义,批量得到不同信噪比的带噪语音(仅供参考)
注:使用soundfile要下载PySoundFile这个包
import soundfile as sf
import numpy as np
import sys
import os
import re
def add_noise(noisedir,cleandir,snr):
# noisy
splitdir=re.split(r"\\",noisedir)
wavdir="" # 所有wav文件所在路径
for i in range(len(splitdir) - 1):
wavdir += splitdir[i] + '/'
noisydir=wavdir+"noisy/" # 带噪语音存储路径
os.mkdir(noisydir)
# noise
for noisewav in os.listdir(noisedir):
noise, fs = sf.read(noisedir+'/'+noisewav)
noisy_splitdir=noisydir+"add_"+noisewav[:-4]+"/"
os.mkdir(noisy_splitdir)
# clean
for cleanwav in os.listdir(cleandir):
clean, Fs = sf.read(cleandir+"/"+cleanwav)
# add noise
if fs == Fs and len(clean) <= len(noise):
# 纯净语音能量
cleanenergy = np.sum(np.power(clean,2))
# 随机索引与clean长度相同的noise信号
ind = np.random.randint(1, len(noise) - len(clean) + 1)
noiselen=noise[ind:len(clean) + ind]
# 噪声语音能量
noiseenergy = np.sum(np.power(noiselen,2))
# 噪声等级系数
noiseratio = np.sqrt((cleanenergy / noiseenergy) / (np.power(10, snr * 0.1)))
# 随机索引与clean长度相同的noise信号
noisyAudio = clean + noise[ind:len(clean)+ind] * noiseratio
# write wav
noisywavname=noisy_splitdir+cleanwav[:-4]+"_"+noisewav[:-4]+"_snr"+str(snr)+".wav"
sf.write(noisywavname, noisyAudio, 16000)
else:
print("fs of clean and noise is unequal or the length of clean is longer than noise's\n")
sys.exit(-1)
noisedir="C:\\Users\\benla\\Desktop\\新建文件夹\\noise"
cleandir="C:\\Users\\benla\\Desktop\\新建文件夹\\clean"
snr=5
add_noise(noisedir,cleandir,snr)
**
结果:
**
生成的带噪语音:
加噪前:
加噪后: