《语音信号处理试验教程》(梁瑞宇等)的代码主要是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语音基础操作–3.5线性预测分析
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

时域分析就是提取语音信号的时域参数。时域分析通常用于最基本的参数分析与应用,如语音分割,预处理,分类等。常用的时域参数有短时能量,短时过零率,短时自相关系数和短时平均幅度差函数等。

  1. 短时能量与短时平均幅度

设第nnn帧语音信号xn(m)x_n(m)xn​(m)的短时能量用EnE_nEn​表示:
En=∑m=1Nxn2(m)E_n=\sum\limits_{m=1}^Nx_n^2(m)En​=m=1∑N​xn2​(m)

EnE_nEn​是度量语音信号幅度值变化的函数,对高电平非常敏感(用平方计算的)。可以用短时平均幅度函数MnM_nMn​:
Mn=∑m=1N∣xn(m)∣M_n=\sum\limits_{m=1}^N|x_n(m)|Mn​=m=1∑N​∣xn​(m)∣

MnM_nMn​也是一帧语音信号的能量大小的表征,不会应该平方造成较大差异。

  1. 短时过零率

表示一帧语音信号波形穿过横轴的次数。也就是前后一个样本点符号变化的次数。
Zn=12∑m=1N∣sgn[xn(m)]−sgn[xn(m−1)]∣Z_n=\frac{1}{2}\sum\limits_{m=1}^N|sgn[x_n(m)]-sgn[x_n(m-1)]|Zn​=21​m=1∑N​∣sgn[xn​(m)]−sgn[xn​(m−1)]∣

在实际计算那种,由于信号中可能有50Hz的工频干扰或偏移量,计算的过零率参数往往不准确,所以在A/D转换前的防混叠带通滤波器的低端截止频率要高于50Hz,抑制电源干扰。在软件上去质量偏量,或者采用低直流漂移量元件。实际在计算过零率时候,还可以使用xi(m)∗xi(m+1)<0x_i(m)*x_i(m+1)<0xi​(m)∗xi​(m+1)<0来判断。

  1. 短时自相关

自相关函数具有一些性质(如偶函数,如果序列是有周期性,自相关函数也有周期性)。对于浊音可以用自相关函数求出基音周期。在进行语音信号的预测分析时,也要用到自相关函数。语音信号xn(m)x_n(m)xn​(m)的自相关函数Rn(k)R_n(k)Rn​(k)可以表示为:
Rn(k)=∑m=1N−kxn(m)xn(m+k),其中(0⩽k⩽K)R_n(k)=\sum\limits_{m=1}^{N-k}x_n(m)x_n(m+k),其中(0\leqslant k \leqslant K)Rn​(k)=m=1∑N−k​xn​(m)xn​(m+k),其中(0⩽k⩽K)

K为最大延迟点数。短时自相关函数的性质有:

  • 如果xn(m)x_n(m)xn​(m)是周期的,假设周期为NpN_pNp​,则自相关函数是同周期的周期函数,即Rn(k)=Rn(k+Np)R_n(k)=R_n(k+N_p)Rn​(k)=Rn​(k+Np​)
  • Rn(k)R_n(k)Rn​(k)是偶函数,即Rn(k)=Rn(−k)R_n(k)=R_n(-k)Rn​(k)=Rn​(−k)
  • 当k=0k=0k=0时,自相关函数具有最大值,即Rn(0)⩾∣Rn(k)∣R_n(0)\geqslant |R_n(k)|Rn​(0)⩾∣Rn​(k)∣,并且Rn(0)R_n(0)Rn​(0)等于确定性信号序列的能量或随机性序列的平均功率。
  1. 短时平均幅度差

短时自相关函数是语言信号分析的重要参量,但是计算自相关喊得运算非常大,为了避免乘法,一个简单的方法就是利用差值,即短时平均幅度差函数。因为如果信号是周期(周期为NpN_pNp​)的,则相距的周期的整数倍的样本点的幅值是相等的,差值为0。
d(n)=x(n)−x(n+k)=0,(k=0,±Np,±2Np,...)d(n)=x(n)-x(n+k)=0,(k=0,±N_p,±2N_p,...)d(n)=x(n)−x(n+k)=0,(k=0,±Np​,±2Np​,...)

实际语音信号d(n)d(n)d(n)不为零,是一个很小的值。可定义短时平均幅度差为:
Fn(k)=∑m=1N−k∣xn(m)−xn(m+k)∣F_n(k)=\sum\limits_{m=1}^{N-k}|x_n(m)-x_n(m+k)|Fn​(k)=m=1∑N−k​∣xn​(m)−xn​(m+k)∣

如果x(n)x(n)x(n)在窗口范围内,具有周期性,则Fn(k)F_n(k)Fn​(k)在k=0,±Np,±2Np,...k=0,±N_p,±2N_p,...k=0,±Np​,±2Np​,...时将出现极小值。平均幅度差函数与自相关喊得关系为:
Fn(k)=2β(k)[Rn(0)−Rn(k)]1/2F_n(k)=\sqrt{2}\beta(k)[R_n(0)-R_n(k)]^{1/2}Fn​(k)=2​β(k)[Rn​(0)−Rn​(k)]1/2

其中β(k)\beta(k)β(k)在不同的语音段在0.6~1.0之间变化,但是对一个特定的语音段,他随着kkk值的变化并不明显。


# timefeature.py
import numpy as np
from .C3_1_y_1 import enframedef STAc(x):"""计算短时相关函数:param x::return:"""para = np.zeros(x.shape)fn = x.shape[1]for i in range(fn):R = np.correlate(x[:, i], x[:, i], 'valid')para[:, i] = Rreturn paradef STEn(x, win, inc):"""计算短时能量函数:param x::param win::param inc::return:"""X = enframe(x, win, inc)s = np.multiply(X, X)return np.sum(s, axis=1)def STMn(x, win, inc):"""计算短时平均幅度计算函数:param x::param win::param inc::return:"""X = enframe(x, win, inc)s = np.abs(X)return np.mean(s, axis=1)def STZcr(x, win, inc):"""计算短时过零率:param x::param win::param inc::return:"""X = enframe(x, win, inc)X1 = X[:, :-1]X2 = X[:, 1:]s = np.multiply(X1, X2)sgn = np.where(s < 0, 1, 0)return np.sum(sgn, axis=1)def STAmdf(X):"""计算短时幅度差,好像有点问题:param X::return:"""# para = np.zeros(X.shape)fn = X.shape[1]wlen = X.shape[0]para = np.zeros((wlen, wlen))for i in range(fn):u = X[:, i]for k in range(wlen):en = len(u)para[k, :] = np.sum(np.abs(u[k:] - u[:en - k]))return paradef FrameTimeC(frameNum, frameLen, inc, fs):ll = np.array([i for i in range(frameNum)])return ((ll - 1) * inc + frameLen / 2) / fs
# C3_2_y.py
from scipy.io import wavfile
import matplotlib.pyplot as plt
from chapter3_分析实验.windows import *
from chapter3_分析实验.timefeature import *
from chapter2_基础.soundBase import *data, fs = soundBase('C3_2_y.wav').audioread()
inc = 100
wlen = 200
win = hanning_window(wlen)
N = len(data)
time = [i / fs for i in range(N)]EN = STEn(data, win, inc)  # 短时能量
Mn = STMn(data, win, inc)  # 短时平均幅度
Zcr = STZcr(data, win, inc)  # 短时过零率X = enframe(data, win, inc)
X = X.T
Ac = STAc(X)
Ac = Ac.T
Ac = Ac.flatten()Amdf = STAmdf(X)
Amdf = Amdf.flatten()fig = plt.figure(figsize=(14, 13))
plt.subplot(3, 1, 1)
plt.plot(time, data)
plt.title('(a)语音波形')
plt.subplot(3, 1, 2)
frameTime = FrameTimeC(len(EN), wlen, inc, fs)
plt.plot(frameTime, Mn)
plt.title('(b)短时幅值')
plt.subplot(3, 1, 3)
plt.plot(frameTime, EN)
plt.title('(c)短时能量')
plt.savefig('images/energy.png')fig = plt.figure(figsize=(10, 13))
plt.subplot(2, 1, 1)
plt.plot(time, data)
plt.title('(a)语音波形')
plt.subplot(2, 1, 2)
plt.plot(frameTime, Zcr)
plt.title('(b)短时过零率')
plt.savefig('images/Zcr.png')fig = plt.figure(figsize=(10, 13))
plt.subplot(2, 1, 1)
plt.plot(time, data)
plt.title('(a)语音波形')
plt.subplot(2, 1, 2)
plt.plot(Ac)
plt.title('(b)短时自相关')
plt.savefig('images/corr.png')fig = plt.figure(figsize=(10, 13))
plt.subplot(2, 1, 1)
plt.plot(time, data)
plt.title('(a)语音波形')
plt.subplot(2, 1, 2)
plt.plot(Amdf)
plt.title('(b)短时幅度差')
plt.savefig('images/Amdf.png')




Python语音基础操作--3.2短时时域分析相关推荐

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

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

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

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

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

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

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

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

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

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

  6. Python语音基础操作--5.1自适应滤波

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

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

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

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

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

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

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

最新文章

  1. Developer Express控件组合中的GridControl控件,如何自动显示每一行的序号
  2. 寻找重复数—leetcode287
  3. 32k通过地址跳转到函数_【HYPERLINK】函数技巧,你一定要知道的!!!
  4. 编译linux源码,linux源码树编译
  5. UI实用素材|电商购物类APP界面设计原则!
  6. ASP.NET-第三天-加强课程
  7. php文字下划线,css如何设置字体下划线
  8. 哪款浏览器好用_超级实用!让你效率倍增的6款浏览器插件
  9. 推荐一个CSLab------英真时代(非广告,真心的)
  10. java txt转pdf乱码_java转pdf中文乱码应该如何处理
  11. 金仓数据库 Oracle 至 KingbaseES 迁移最佳实践 (4. Oracle数据库移植实战)
  12. read.html5.qq.com,从QQ浏览器缓存文件中提取出完整的视频
  13. 【上电即上华为云】华为云openCPU智联模组_wifi_HF-LPX70_RISC-V_LwM2M
  14. 固态硬盘开盘数据恢复的方法
  15. Android车载导航的一些困境
  16. c语言怎么打尖括号,怎么在word中利用键盘快速输入尖括号
  17. 基于ITK的读并写 2D的DICOM 图像
  18. Spring Boot CORS跨域资源共享实现方案
  19. 信号完整性之眼图(eye)理解(一)
  20. cad与连接mySQL数据库_C++连接mysql数据库的两种方法

热门文章

  1. 链路预测算法的评价指标
  2. 使用python进行dicom序列转nii
  3. I/O流之进步认识、InputStream以及FileInputStream
  4. 火山视窗添加窗口菜单
  5. 如何用php制作博客网页,博客网页制作的网站
  6. 解决git LF will be replaced by CRLF问题
  7. 在 终端 安装 spyder
  8. lede编译所需修改的地方
  9. 《Autosar_MCAL高阶配置》总目录_培训教程持续更新中...
  10. 龙芯交叉编译环境搭建之交叉编译工具链配置