《语音信号处理试验教程》(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的。使用CSDN博客查看帮助文件:

Python语音基础操作–2.1语音录制,播放,读取
Python语音基础操作–2.2语音编辑
Python语音基础操作–2.3声强与响度
Python语音基础操作–2.4语音信号生成
Python语音基础操作–3.1语音分帧与加窗
Python语音基础操作–3.2短时时域分析
Python语音基础操作–3.3短时频域分析
Python语音基础操作–3.4倒谱分析与MFCC系数
Python语音基础操作–4.1语音端点检测
Python语音基础操作–4.2基音周期检测
Python语音基础操作–4.3共振峰估计
Python语音基础操作–5.1自适应滤波
Python语音基础操作–5.2谱减法
Python语音基础操作–5.4小波分解
Python语音基础操作–6.1PCM编码
Python语音基础操作–6.2LPC编码
Python语音基础操作–6.3ADPCM编码
Python语音基础操作–7.1帧合并
Python语音基础操作–7.2LPC的语音合成
Python语音基础操作–10.1基于动态时间规整(DTW)的孤立字语音识别试验
Python语音基础操作–10.2隐马尔科夫模型的孤立字识别
Python语音基础操作–11.1矢量量化(VQ)的说话人情感识别
Python语音基础操作–11.2基于GMM的说话人识别模型
Python语音基础操作–12.1基于KNN的情感识别
Python语音基础操作–12.2基于神经网络的情感识别
Python语音基础操作–12.3基于支持向量机SVM的语音情感识别
Python语音基础操作–12.4基于LDA,PCA的语音情感识别

代码可在Github上下载:busyyang/python_sound_open

语音降噪主要研究如何利用信号处理技术消除信号中的强噪声干扰,从而提高输出信噪比以提取出有用信号的技术。消除信号中噪声污染的通常方法是让受污染的信号通过二个能抑制噪声而让信号相对不变的滤波器,此滤波器从信号不可检测的噪声场中取得输入,将此输入加以滤波,抵消其中的原始噪声,从而达到提高信噪比的目的。

然而,由于干扰通常都是随机的,从带噪语音巾提取完全纯净的语音几乎不可能。在这种情况下,语音增强的目的主要有两个:一是改进语音质量,消除背景噪声,使昕者乐于接受,不感觉疲劳,这是一种主观度量;二是提高语音可懂度,这是一种客观度量。这两个目的往往不能兼得,所以实际应用中总是视具体情况而有所侧重的。

根据语音和噪声的特点,出现了很多种语音增强算法。比较常用的有谱减法、维纳滤波法、卡尔曼滤波法、自适应滤波法等。此外,随着科学技术的发展又出现了一些新的增强技术,如基于神经网络的语音增强、基于HMM 的语音增强、基于昕觉感知的语音增强、基于多分辨率分析的语音增强、基于语音产生模型的线性滤波法、基于小波变换的语音增强方法、梳状洁、波法、自相关法、基于语音模型的语音增强方法等。

带噪语音模型

而通常所说噪声是局部平稳的,是指一段带噪语音中的噪声,具有和语音段开始前那段噪声相同的统计特性,且在整个语音段中保持不变。也就是说,可以根据语音开始前那段噪声来估计语音中所叠加的噪声统计特性。

LMS自适应滤波器

所谓自适应滤波器就是利用前一时刻已获得的滤波器参数等结果,自动地调节现时刻的滤波器参数,以适应信号和|噪声未知的随机变化的统计特性,从而实现最优滤波。

最小方均(LMS) 白适应算法就是以已知期望响应和滤波器输出信号之间误差的方均值最小为准的,依据输入信号在迭代过程中估计梯度矢量,并更新权系数以达到最优的白适应迭代算法。LMS 算法是一种梯度最速下降方法,其显著的优点是它的简单性,这种算法不需要计算相应的相关函数,也不需要进行矩阵运算。

滤波器的输出 y ( n ) y(n) y(n)表示为:
y ( n ) = W T ( n ) X ( n ) = ∑ i = 0 N − 1 w i ( n ) x ( n − i ) y(n)=\bold{W^T}(n)\bold{X}(n)=\sum_{i=0}^{N-1}w_i(n)\bold{x}(n-i) y(n)=WT(n)X(n)=i=0∑N−1​wi​(n)x(n−i)

对于LMS滤波器的结构,误差为: e ( n ) = d ( n ) − y ( n ) \bold{e}(n)=\bold{d}(n)-\bold{y}(n) e(n)=d(n)−y(n)。方均误差为:
ϵ = E [ e 2 ( n ) ] = E [ d ( n ) − y ( n ) ] = E [ d 2 ( n ) ] + W T ( n ) R W ( n ) − 2 P W ( n ) \epsilon=\bold{E}[\bold{e^2}(n)]=\bold{E}[\bold{d}(n)-\bold{y}(n)]=\bold{E}[\bold{d^2}(n)]+\bold{W^T}(n)R\bold{W}(n)-2\bold{PW}(n) ϵ=E[e2(n)]=E[d(n)−y(n)]=E[d2(n)]+WT(n)RW(n)−2PW(n)

其中 R = E [ X X T ] \bold{R}=\bold{E}[\bold{X}\bold{X^T}] R=E[XXT],是 N × N N\times N N×N的自相关矩阵, P = E [ d ( n ) X T ( n ) ] \bold{P}=\bold{E}[\bold{d}(n)\bold{X^T}(n)] P=E[d(n)XT(n)]为互相关矩阵,代表理想信号 d ( n ) \bold{d}(n) d(n)与输入矢量 X ( n ) \bold{X}(n) X(n)的相关性。

在达到误差 ϵ \epsilon ϵ最小时,有:
∂ ϵ ∂ W ( n ) ∣ W ( n ) = W ∗ = 0 \frac{\partial \epsilon}{\partial\bold{W}(n)}|_{\bold{W}(n)=W^*}=0 ∂W(n)∂ϵ​∣W(n)=W∗​=0

有:
R W ∗ − P = 0 → W ∗ = R − 1 P \bold{RW^*-P}=0\rightarrow\bold{W^*=\bold{R^{-1}P}} RW∗−P=0→W∗=R−1P

LMS算法使用梯度下降来解,即 W : = W − μ Δ W ( n ) \bold{W:=W-\mu \Delta W(n)} W:=W−μΔW(n)

Δ W ( n ) = ∂ E [ e 2 ( n ) ] ∂ W ( n ) = 2 E [ e ( n ) ] ∂ E [ e ( n ) ] ∂ W ( n ) = 2 E [ e ( n ) ] ∂ E [ d ( n ) − y ( n ) ] ∂ W ( n ) = − 2 E [ e ( n ) x ( n ) ] \Delta W(n)=\frac{\partial E[e^2(n)]}{\partial W(n)}=2E[e(n)]\frac{\partial E[e(n)]}{\partial W(n)}=2E[e(n)]\frac{\partial E[\bold{d}(n)-\bold{y}(n)]}{\partial W(n)}=-2E[e(n)x(n)] ΔW(n)=∂W(n)∂E[e2(n)]​=2E[e(n)]∂W(n)∂E[e(n)]​=2E[e(n)]∂W(n)∂E[d(n)−y(n)]​=−2E[e(n)x(n)]

那么:
W ( n + 1 ) = W ( n ) + 2 μ Δ e ( n ) x ( n ) W_{(n+1)}=W_{(n)}+2\mu \Delta e(n)x(n) W(n+1)​=W(n)​+2μΔe(n)x(n)

语音质量性能指标

  • 信噪比
    S N R = 10 lg ⁡ ∑ n = 1 N s 2 ( n ) ∑ n = 1 N d 2 ( n ) SNR=10\lg \frac{\sum\limits_{n=1}^Ns^2(n)}{\sum\limits_{n=1}^Nd^2(n)} SNR=10lgn=1∑N​d2(n)n=1∑N​s2(n)​
    s s s表示信号, d d d表示噪声。
  • PESQ(Perceptual Evaluation of Speech Quality)
    PESQ 算法需要带噪的衰减信号和一个原始的参考信号。开始时将两个待比较的语音信号经过电平调整、输入滤波器滤波、时间对准和补偿、昕觉变换之后,分别提取两路信号的参数,综合其时频特性,得到PESQ分数,最终将这个分数映射到主观平均意见分(MOS)。PESQ得分范围在-0.5到4.5之间。得分越高表示语音质量越好。
from chapter2_基础.soundBase import *
from chapter5_语音降噪.自适应滤波 import *def awgn(x, snr):snr = 10 ** (snr / 10.0)xpower = np.sum(x ** 2) / len(x)npower = xpower / snrreturn x + np.random.randn(len(x)) * np.sqrt(npower)data, fs = soundBase('C5_1_y.wav').audioread()
data -= np.mean(data)
data /= np.max(np.abs(data))
IS = 0.25  # 设置前导无话段长度
wlen = 200  # 设置帧长为25ms
inc = 80  # 设置帧移为10ms
SNR = 5  # 设置信噪比SNR
N = len(data)  # 信号长度
time = [i / fs for i in range(N)]  # 设置时间
r1 = awgn(data, SNR)
NIS = int((IS * fs - wlen) // inc + 1)
# 5.2.1
snr1 = SNR_Calc(r1, r1 - data)
a, b = 4, 0.001
output = SpectralSub(r1, wlen, inc, NIS, a, b)
if len(output) < len(r1):filted = np.zeros(len(r1))filted[:len(output)] = output
elif len(output) > len(r1):filted = output[:len(r1)]
else:filted = outputplt.subplot(4, 1, 1)
plt.plot(time, data)
plt.ylabel('原始信号')
plt.subplot(4, 1, 2)
plt.plot(time, r1)
plt.ylabel('加噪声信号')
plt.subplot(4, 1, 3)
plt.ylabel('滤波信号')
plt.plot(time, filted)
plt.show()
#自适应滤波.py
import numpy as np
from chapter3_分析实验.C3_1_y_1 import enframedef SNR_Calc(s, r):"""计算信号的信噪比:param s: 信号:param r1: 噪声:return:"""Ps = np.sum(np.power(s - np.mean(s), 2))Pr = np.sum(np.power(r - np.mean(r), 2))return 10 * np.log10(Ps / Pr)def LMS(xn, dn, M, mu, itr):"""使用LMS自适应滤波:param xn:输入的信号序列:param dn:所期望的响应序列:param M:滤波器的阶数:param mu:收敛因子(步长):param itr:迭代次数:return:"""en = np.zeros(itr)  # 误差序列,en(k)表示第k次迭代时预期输出与实际输入的误差W = np.zeros((M, itr))  # 每一行代表一个加权参量,每一列代表-次迭代,初始为0# 迭代计算for k in range(M, itr):x = xn[k:k - M:-1]y = np.matmul(W[:, k - 1], x)en[k] = dn[k] - yW[:, k] = W[:, k - 1] + 2 * mu * en[k] * x# 求最优输出序列yn = np.inf * np.ones(len(xn))for k in range(M, len(xn)):x = xn[k:k - M:-1]yn[k] = np.matmul(W[:, -1], x)return yn, W, endef NLMS(xn, dn, M, mu, itr):"""使用Normal LMS自适应滤波:param xn:输入的信号序列:param dn:所期望的响应序列:param M:滤波器的阶数:param mu:收敛因子(步长):param itr:迭代次数:return:"""en = np.zeros(itr)  # 误差序列,en(k)表示第k次迭代时预期输出与实际输入的误差W = np.zeros((M, itr))  # 每一行代表一个加权参量,每一列代表-次迭代,初始为0# 迭代计算for k in range(M, itr):x = xn[k:k - M:-1]y = np.matmul(W[:, k - 1], x)en[k] = dn[k] - yW[:, k] = W[:, k - 1] + 2 * mu * en[k] * x / (np.sum(np.multiply(x, x)) + 1e-10)# 求最优输出序列yn = np.inf * np.ones(len(xn))for k in range(M, len(xn)):x = xn[k:k - M:-1]yn[k] = np.matmul(W[:, -1], x)return yn, W, endef SpectralSub(signal, wlen, inc, NIS, a, b):"""谱减法滤波:param signal::param wlen::param inc::param NIS::param a::param b::return:"""wnd = np.hamming(wlen)y = enframe(signal, wnd, inc)fn, flen = y.shapey_a = np.abs(np.fft.fft(y, axis=1))y_a2 = np.power(y_a, 2)y_angle = np.angle(np.fft.fft(y, axis=1))Nt = np.mean(y_a2[:NIS, ], axis=0)y_a2 = np.where(y_a2 >= a * Nt, y_a2 - a * Nt, b * Nt)X = y_a2 * np.cos(y_angle) + 1j * y_a2 * np.sin(y_angle)hatx = np.real(np.fft.ifft(X, axis=1))sig = np.zeros(int((fn - 1) * inc + wlen))for i in range(fn):start = i * incsig[start:start + flen] += hatx[i, :]return sigdef SpectralSubIm(signal, wind, inc, NIS, Gamma, Beta):pass

Python语音基础操作--5.1自适应滤波相关推荐

  1. Python语音基础操作--4.3共振峰估计

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  2. Python语音基础操作--6.3ADPCM编码

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  3. Python语音基础操作--2.3声强与响度

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  4. Python语音基础操作--10.2隐马尔科夫模型的孤立字识别

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  5. Python语音基础操作--10.1基于动态时间规整(DTW)的孤立字语音识别试验

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  6. Python语音基础操作--3.5线性预测分析

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  7. Python语音基础操作--3.2短时时域分析

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  8. Python语音基础操作--11.2基于GMM的说话人识别模型

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

  9. python自相关函数提取基音周期_Python语音基础操作--4.2基音周期检测

    <语音信号处理试验教程>(梁瑞宇等)的代码主要是Matlab实现的,现在Python比较热门,所以把这个项目大部分内容写成了Python实现,大部分是手动写的.使用CSDN博客查看帮助文件 ...

最新文章

  1. Docker 在容器中部署静态网站
  2. 利用SCVMM 2012 R2来管理Azure虚拟机
  3. jdk只有一个java进程_JDK 10:从Java访问Java应用程序的进程ID
  4. 【文章】孝心无价 作者:毕淑敏
  5. php运行的四个黄金组合,PHP168与Phpwind强势整合 打造黄金组合
  6. python爬取暖享图片
  7. python通过代理发送邮件_使用Python通过SMTP发送邮件
  8. java 正则表达式 判断 日期_怎么在java中利用正则表达式对时间日期进行判断
  9. 基于python的气象数据分析_基于python的《Hadoop权威指南》一书中气象数据下载和map reduce化数据处理及其......
  10. shl归纳推理测试题库_强生2020秋招笔试面试经验合集
  11. 海词词典android v3.1.2新版发布 英语学习必备工具,海词词典手机版下载_海词词典最新版下载安装v6.1.18 - 数码资源网...
  12. x32下PsSetLoadImageNotifyRoutine的逆向
  13. 李南江的前端课程知识点(七)CSS的继承、层叠、优先
  14. python中count方法
  15. Could not get a resource from the pool 错误解决
  16. python外星人入侵(游戏开发)
  17. 在线登录注册功能(android客户端+javaweb服务端+腾讯云服务器+腾讯云数据库)
  18. 小车运料c语言编程,西门子PLC编程实例及技巧(运料小车控制系统)
  19. 2021年平均工资出炉,IT行业不出所料
  20. Docker 使用国内镜像daocloud.io

热门文章

  1. 作为一名测试工程师,你真的知道“微信红包”怎么测试吗?
  2. 甲方想什么?乙方想什么?
  3. 计算学生的平均绩点GPA的python代码
  4. 如何处理电脑插入耳机后无提示的问题
  5. [转]AES加密算法及java代码实现
  6. xml文件的书写及读取books.xml文件生成Book类
  7. 工作3年,还不会写单元测试?新技能get!
  8. 网页简单僵尸射击游戏开发1——游戏概述和html语言
  9. 解决node-sass报错 :Failed at the node-sass postinstall script
  10. 个人总结面试笔试C语言、嵌入式相关基础知识点