Python谱减法语音降噪实例
Python / 管理员 发布于 7年前 222
代码中用到了nextpow2,其中n = nextpow2(x) 表示最接近x的2的n次幂。
#!/usr/bin/env pythonimport numpy as npimport waveimport nextpow2import math # 打开WAV文档f = wave.open("filename.wav")# 读取格式信息# (nchannels, sampwidth, framerate, nframes, comptype, compname)params = f.getparams()nchannels, sampwidth, framerate, nframes = params[:4]fs = framerate# 读取波形数据str_data = f.readframes(nframes)f.close()# 将波形数据转换为数组x = np.fromstring(str_data, dtype=np.short)# 计算参数len_ = 20 * fs // 1000PERC = 50len1 = len_ * PERC // 100len2 = len_ - len1# 设置默认参数Thres = 3Expnt = 2.0beta = 0.002G = 0.9# 初始化汉明窗win = np.hamming(len_)# normalization gain for overlap+add with 50% overlapwinGain = len2 / sum(win) # Noise magnitude calculations - assuming that the first 5 frames is noise/silencenFFT = 2 * 2 ** (nextpow2.nextpow2(len_))noise_mean = np.zeros(nFFT) j = 0for k in range(1, 6): noise_mean = noise_mean + abs(np.fft.fft(win * x[j:j + len_], nFFT)) j = j + len_noise_mu = noise_mean / 5 # --- allocate memory and initialize various variablesk = 1img = 1jx_old = np.zeros(len1)Nframes = len(x) // len2 - 1xfinal = np.zeros(Nframes * len2) # ========================= Start Processing ===============================for n in range(0, Nframes): # Windowing insign = win * x[k-1:k + len_ - 1] # compute fourier transform of a frame spec = np.fft.fft(insign, nFFT) # compute the magnitude sig = abs(spec) # save the noisy phase information theta = np.angle(spec) SNRseg = 10 * np.log10(np.linalg.norm(sig, 2) ** 2 / np.linalg.norm(noise_mu, 2) ** 2) def berouti(SNR): if -5.0 <= SNR <= 20.0: a = 4 - SNR * 3 / 20 else: if SNR < -5.0: a = 5 if SNR > 20: a = 1 return a def berouti1(SNR): if -5.0 <= SNR <= 20.0: a = 3 - SNR * 2 / 20 else: if SNR < -5.0: a = 4 if SNR > 20: a = 1 return a if Expnt == 1.0: # 幅度谱 alpha = berouti1(SNRseg) else: # 功率谱 alpha = berouti(SNRseg) ############# sub_speech = sig ** Expnt - alpha * noise_mu ** Expnt; # 当纯净信号小于噪声信号的功率时 diffw = sub_speech - beta * noise_mu ** Expnt # beta negative components def find_index(x_list): index_list = [] for i in range(len(x_list)): if x_list[i] < 0: index_list.append(i) return index_list z = find_index(diffw) if len(z) > 0: # 用估计出来的噪声信号表示下限值 sub_speech[z] = beta * noise_mu[z] ** Expnt # --- implement a simple VAD detector -------------- if SNRseg < Thres: # Update noise spectrum noise_temp = G * noise_mu ** Expnt + (1 - G) * sig ** Expnt # 平滑处理噪声功率谱 noise_mu = noise_temp ** (1 / Expnt) # 新的噪声幅度谱 # flipud函数实现矩阵的上下翻转,是以矩阵的“水平中线”为对称轴 # 交换上下对称元素 sub_speech[nFFT // 2 + 1:nFFT] = np.flipud(sub_speech[1:nFFT // 2]) x_phase = (sub_speech ** (1 / Expnt)) * (np.array([math.cos(x) for x in theta]) + img * (np.array([math.sin(x) for x in theta]))) # take the IFFT xi = np.fft.ifft(x_phase).real # --- Overlap and add --------------- xfinal[k-1:k + len2 - 1] = x_old + xi[0:len1] x_old = xi[0 + len1:len_] k = k + len2# 保存文件wf = wave.open('outfile.wav', 'wb')# 设置参数wf.setparams(params)# 设置波形文件 .tostring()将array转换为datawave_data = (winGain * xfinal).astype(np.short)wf.writeframes(wave_data.tostring())wf.close()
以上这篇Python谱减法语音降噪实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号