Python譜減法語音降噪實例
更新時間:2019年12月18日 09:50:52 作者:zipaiyou
今天小編就為大家分享一篇Python譜減法語音降噪實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
代碼中用到了nextpow2,其中n = nextpow2(x) 表示最接近x的2的n次冪。
#!/usr/bin/env python
import numpy as np
import wave
import nextpow2
import math
# 打開WAV文檔
f = wave.open("filename.wav")
# 讀取格式信息
# (nchannels, sampwidth, framerate, nframes, comptype, compname)
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
fs = framerate
# 讀取波形數(shù)據(jù)
str_data = f.readframes(nframes)
f.close()
# 將波形數(shù)據(jù)轉(zhuǎn)換為數(shù)組
x = np.fromstring(str_data, dtype=np.short)
# 計算參數(shù)
len_ = 20 * fs // 1000
PERC = 50
len1 = len_ * PERC // 100
len2 = len_ - len1
# 設(shè)置默認參數(shù)
Thres = 3
Expnt = 2.0
beta = 0.002
G = 0.9
# 初始化漢明窗
win = np.hamming(len_)
# normalization gain for overlap+add with 50% overlap
winGain = len2 / sum(win)
# Noise magnitude calculations - assuming that the first 5 frames is noise/silence
nFFT = 2 * 2 ** (nextpow2.nextpow2(len_))
noise_mean = np.zeros(nFFT)
j = 0
for 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 variables
k = 1
img = 1j
x_old = np.zeros(len1)
Nframes = len(x) // len2 - 1
xfinal = 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函數(shù)實現(xiàn)矩陣的上下翻轉(zhuǎn),是以矩陣的“水平中線”為對稱軸
# 交換上下對稱元素
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')
# 設(shè)置參數(shù)
wf.setparams(params)
# 設(shè)置波形文件 .tostring()將array轉(zhuǎn)換為data
wave_data = (winGain * xfinal).astype(np.short)
wf.writeframes(wave_data.tostring())
wf.close()
以上這篇Python譜減法語音降噪實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
pytorch:實現(xiàn)簡單的GAN示例(MNIST數(shù)據(jù)集)
今天小編就為大家分享一篇pytorch:實現(xiàn)簡單的GAN示例(MNIST數(shù)據(jù)集),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
Python列表list常用內(nèi)建函數(shù)實例小結(jié)
這篇文章主要介紹了Python列表list常用內(nèi)建函數(shù),結(jié)合實例形式總結(jié)分析了Python列表list常見內(nèi)建函數(shù)的功能、使用方法及相關(guān)操作注意事項,需要的朋友可以參考下2019-10-10
Python中numpy模塊常見用法demo實例小結(jié)
這篇文章主要介紹了Python中numpy模塊常見用法,結(jié)合實例形式總結(jié)分析了numpy常見的運算操作技巧與注意事項,需要的朋友可以參考下2019-03-03
windowns使用PySpark環(huán)境配置和基本操作
pyspark是Spark對Python的api接口,可以在Python環(huán)境中通過調(diào)用pyspark模塊來操作spark,這篇文章主要介紹了windowns使用PySpark環(huán)境配置和基本操作,感興趣的可以了解一下2021-05-05
高質(zhì)量Python代碼編寫的5個優(yōu)化技巧
這篇文章主要為大家詳細介紹了編寫高質(zhì)量Python代碼的5個優(yōu)化技巧,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11

