python音频 降噪_谱减法语音降噪的Python实现教程
下面是谱减法语音降噪的Python实现
文件speech_enhanced.py
#!/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
# 读取波形数据
str_data = f.readframes(nframes)
f.close()
# 将波形数据转换为数组
x = np.fromstring(str_data, dtype=np.short)
# 计算参数
len_ = 20 * fs // 1000
PERC = 50
len1 = len_ * PERC // 100
len2 = len_ - len1
# 设置默认参数
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函数实现矩阵的上下翻转,是以矩阵的“水平中线”为对称轴
# 交换上下对称元素
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转换为data
wave_data = (winGain * xfinal).astype(np.short)
wf.writeframes(wave_data.tostring())
wf.close()
以上代码中用到了nextpow2,其中n = nextpow2(x) 表示最接近x的2的n次幂,这里就不在贴出,有需要的朋友直接去Github查看。
python音频 降噪_谱减法语音降噪的Python实现教程相关推荐
- python录音文件降噪_Python谱减法语音降噪实例
代码中用到了nextpow2,其中n = nextpow2(x) 表示最接近x的2的n次幂. #!/usr/bin/env python import numpy as np import wave ...
- 谱减法语音降噪的Python实现
转自:https://github.com/itaa/soja-box/tree/master/enhance_speach 谱减法语音降噪 #!/usr/bin/env python import ...
- [投稿]谱减法语音降噪原理
本文是音频处理的朋友icoolmedia(QQ:314138065)的投稿.各位做视音频技术朋友如果好的原创技术文章并希望通过我的博客分享给大家,也欢迎投稿到我的邮箱:leixiaohua1020@1 ...
- Python灰帽子_黑客与逆向工程师的Python编程之道
收藏自用 链接:Python灰帽子_黑客与逆向工程师的Python编程之道
- python音频频谱_小白音频测试之Python对音频进行频谱分析
初衷 语音识别领域对音频文件进行频谱分析是一项基本的数据处理过程,同时也为后续的特征分析准备数据. 前驱知识 Python需要使用的相关库wave https://docs.python.org/3/ ...
- python 面试问题_值得阅读的30个Python面试问题
python 面试问题 Interview questions are quite tricky to predict. In most cases, even peoples with great ...
- python 路径格式化_吐血整理!140种Python标准库、第三方库和外部工具都有了!...
导读: Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具. 这些库可用于文件读写.网络抓取和解析.数据 ...
- python图像计数_计算机视觉:利用OpenCV和Python进行车辆计数详细步骤
本教程我将分享几个简单步骤解释如何使用OpenCV进行Python对象计数. 需要安装一些软件: Python 3 OpennCV 1.了解Opencv从摄像头获得视频的Python脚本import ...
- python音频处理库_Python中音频处理库pydub的使用教程
前言 pydub是Python中用户处理音频文件的一个库.本文主要介绍了关于Python音频处理库pydub使用的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 安装: 1.安装pip工具: ...
最新文章
- K-Means聚类算法原理
- 阿里云大数据计算服务MaxCompute(下篇)
- 溢出漏洞利用小结(基础)
- php swoole实现定时任务,Swoole实现任务定时自动化调度详解,来学习下
- 2015年第六届蓝桥杯C/C++ A组国赛 —— 第一题:方格填数
- 童话镇计算机乐谱,童话镇简谱(歌词)-陈一发演唱-桃李醉春风记谱
- Fedora 添加用户与删除用户
- php分批处理数据,php分批更新数据
- Android Instant Apps教程
- C#之获取系统cpu
- wo-27s管理员账户和密码_获取电信天翼网关超级密码,修改路由模式为桥接模式...
- 安卓10终于来了,能吃上的果然只有这些手机!
- 客户分享微信个人号私域流量池养号技巧:外部储蓄号、内部储蓄号应该如何分别运营和养号!...
- UEFI 编程(一)
- matplotlib无法显示中文问题的解决(全网最全)
- 通俗易懂的讲解二极管三极管工作原理
- DevpTips_mouse without borders:去掉某个键,避免和另存为快捷键冲突
- Arch 中 fcitx5 提示拼音不可用的解决过程
- 户外LED驱动电源需要注意哪些问题
- .net 获取本网站域名 以及得到字符串里包含的域名
热门文章
- ArcGIS二次开发基础教程(06):有关图层的基本操作
- 用c 语言中 矩阵乘法,C中实现矩阵乘法的一种高效的方法
- HTML中的基本元素
- 谷歌新技术:神经优化器搜索,自动找到可解释的优化方法
- H3C_交换机_Vlan配置
- python制作表白软件手机版_用Python做一个情人节表白神器
- 人脸数据库大全(包括人脸识别、关键点检测、表情识别,人脸姿态等等)
- SAP顾问生涯闲记:做过的最好玩的Global项目是什么样子
- 手工注入,后台另类拿webshell搞定影院系统
- U880纯GPS定位综合解决方案,支持谷歌地图老虎地图百度地图