语音增强:基于SEGAN模型的噪声语音降噪处理/n/n本代码使用SEGAN模型对测试集中的噪声语音进行增强,并保存增强后的语音和相应的频谱图。/n/npython/nimport torch/nimport torch.nn as nn/nimport numpy as np/nfrom model import Generator/nfrom hparams import hparams/nfrom dataset import emphasis/nimport glob/nimport soundfile as sf/nimport os/nimport librosa/nimport matplotlib.pyplot as plt/nfrom numpy.linalg import norm/n/n/ndef enh_segan(model, noisy, para):/n # 对输入的noisy 按照 win_len 进行分段,没有重叠/n/n win_len = para.win_len/n # 不足的部分 重复填充/n N_slice = len(noisy) // win_len/n if not len(noisy) % win_len == 0:/n short = win_len - len(noisy) % win_len/n temp_noisy = np.pad(noisy, (0, short), 'wrap')/n N_slice = N_slice + 1/n/n slices = temp_noisy.reshape(N_slice, win_len)/n/n enh_slice = np.zeros(slices.shape)/n # # # 一次处理/n # slices = np.expand_dims(slices,axis=1)/n # slices = torch.from_numpy(slices)/n # z = nn.init.normal_(torch.Tensor(N_slice, para.size_z[0], para.size_z[1]))/n # model.eval()/n # with torch.no_grad():/n # generated_slices = model(slices, z)/n/n # generated_slices = generated_slices.numpy()/n # for n in range(N_slice):/n # generated_slice = emphasis(generated_slices[n,0,:],pre=False)/n # enh_slice[n] = generated_slice/n/n # 逐帧进行处理/n for n in range(N_slice):/n m_slice = slices[n]/n/n # 进行预加重/n m_slice = emphasis(m_slice)/n # 增加 2个维度/n m_slice = np.expand_dims(m_slice, axis=(0, 1))/n # 转换为torch格式/n/n m_slice = torch.from_numpy(m_slice)/n/n # 生成 z/n z = nn.init.normal_(torch.Tensor(1, para.size_z[0], para.size_z[1]))/n/n # 进行增强/n model.eval()/n with torch.no_grad():/n generated_slice = model(m_slice, z)/n generated_slice = generated_slice.numpy()/n # 反预加重/n generated_slice = emphasis(generated_slice[0, 0, :], pre=False)/n enh_slice[n] = generated_slice/n/n # 信号展开/n enh_speech = enh_slice.reshape(N_slice * win_len)/n return enh_speech[:len(noisy)]/n/n/ndef get_snr(clean, nosiy):/n noise = nosiy - clean/n/n snr = 20 * np.log(norm(clean) / (norm(noise) + 1e-7))/n return snr/n/n/nif __name__ == '__main__':/n/n para = hparams()/n/n path_eval = 'eval47'/n os.makedirs(path_eval, exist_ok=True)/n/n # 加载模型/n n_epoch = 47/n model_file = 'save/G_88_0.2559.pkl'/n/n generator = Generator()/n generator.load_state_dict(torch.load(model_file, map_location='cpu'))/n/n path_test_clean = 'D:/graduation_design/data/clean_testset_wav/clean_testset_wav'/n path_test_noisy = 'D:/graduation_design/data/noisy_testset_wav/noisy_testset_wav'/n test_clean_wavs = glob.glob(path_test_clean + '/*wav')/n # test_clean_wavs = test_clean_wavs[:15]/n fs = para.fs/n for clean_file in test_clean_wavs:/n name = os.path.split(clean_file)[-1]/n noisy_file = os.path.join(path_test_noisy, name)/n if not os.path.isfile(noisy_file):/n continue/n/n # 读取干净语音/n clean, _ = librosa.load(clean_file, sr=fs, mono=True)/n noisy, _ = librosa.load(noisy_file, sr=fs, mono=True)/n/n snr = get_snr(clean, noisy)/n print('%s snr=%.2f' % (noisy_file, snr))/n if snr < 3.0:/n print('processing %s with snr %.2f' % (noisy_file, snr))/n/n # 获取增强语音/n enh = enh_segan(generator, noisy, para)/n/n # 语音保存/n sf.write(os.path.join(path_eval, 'noisy-' + name), noisy, fs)/n sf.write(os.path.join(path_eval, 'clean-' + name), clean, fs)/n sf.write(os.path.join(path_eval, 'enh-' + name), enh, fs)/n/n # 画频谱图/n # 绘图/n fig_name = os.path.join(path_eval, name[:-4] + '-' + str(n_epoch) + '.jpg')/n/n plt.subplot(3, 1, 1)/n plt.specgram(clean, NFFT=512, Fs=fs)/n plt.xlabel('clean specgram')/n plt.subplot(3, 1, 2)/n plt.specgram(noisy, NFFT=512, Fs=fs)/n plt.xlabel('noisy specgram')/n plt.subplot(3, 1, 3)/n plt.specgram(enh, NFFT=512, Fs=fs)/n plt.xlabel('enhece specgram')/n plt.savefig(fig_name)/n/n/n### 代码详细解释内容:/n/n本代码主要实现了对测试集中的噪声语音进行增强,并保存增强后的语音和相应的频谱图。/n/n其中,enh_segan函数实现了对输入的噪声语音进行分帧处理,并逐帧进行增强,最终将增强后的语音拼接成完整的信号。该函数内部首先对输入的语音进行预加重,然后将其分帧,并将每一帧转换为PyTorch格式。接着,生成随机噪声$z$,并将随机噪声和输入的语音帧输入到模型中进行增强。最后,将生成的语音进行反预加重,并拼接成完整的信号。/n/nget_snr函数实现了计算干净语音和噪声语音的信噪比(SNR)的功能。其中,SNR的计算公式为$SNR=20/log_{10}(/frac{/|clean/|}{/|noise/|})$。/n/n在主函数中,首先加载训练好的模型,并读取测试集中的干净语音和噪声语音。如果两者的SNR小于3dB,则进行增强,并将增强后的语音和相应的频谱图保存到指定目录下。在绘制频谱图时,使用matplotlib库的specgram函数进行绘制,其中NFFT参数指定FFT窗口长度,Fs参数指定采样率。最终,将三个频谱图绘制在一起,保存为一张图片。/n

语音增强:基于SEGAN模型的噪声语音降噪处理

原文地址: https://www.cveoy.top/t/topic/nwOC 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录