Python语音基础操作--6.2LPC编码

《语音信号处理试验教程》(梁瑞宇等)的代码主要是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

线性预测编码(linear predictive coding, LPC) 是运用于音频信号处理与语音处理的压缩编码方式,根据线性预测模型的信息表示数字语音信号谱包络。它是最有效的语音分析技术之一,也是低位速高质量语音编码的最有用的方法之一,能够提供非常精确的语音参数预测。线性预测编码通过估计共振峰剔除它们在语音信号中的作用,估计保留的蜂鸣音强度与频率来分析语音信号;同时,使用蜂呜参数与残余信号生成源信号,使用共振峰生成表示声道的滤波器,源、信号经过滤坡器的处理来逆向合成语音信号。由于语音信号随着时间变化这个过程是在一段段的语音信号帧上进行处理的,通常每秒30-50帧就能对可理解的信号进行很好的压缩。

线性预测编码通常用于语音的重新合成,它是电话公司使用的声音压缩格式,如GSM标准就在使用LPC编码格式。它还用作安全无线通信中的格式,在安全的无线通信中,声音必须进行数字化、加密然后通过狭窄的语音信道传输。

线性预测分析的基本思想是:由于语音样点之间存在相关性,所以可以用过去的样点值来预测现在或将来的样点值,即一个语音抽样可以用过去若干个语音抽样或它们的线性组合来逼近。通过使实现语音抽样与线性预测抽样之间的误差在某个准则(通常为最小均方误差准则)下达到最小值来决定一组预测系数。这一组预测系数就反映了语音信号的特性,可以作为语音信号的特征参数用于语音合成和语音识别等。

线性预测分析的基本假设是认为语音信号是一个激励信号通过一个滤波器得到的。采样点的输出 s ( n ) s(n) s(n)可以用前p个样本的线性组合来表示:
s ^ ( n ) = ∑ p a i s ( n − i ) \hat s(n)=\sum^p a_is(n-i) s^(n)=pais(ni)

通过 E ( n ) = s ( n ) − s ^ ( n ) E(n)=s(n)-\hat s(n) E(n)=s(n)s^(n)最小来求解。LPC参数是模拟人的发声器官,是基于语音合成的模型参数,每个声管对应一个LPC模型的极点,一般情况下,极点个数为12~16之间,就可以足够清晰地描述语音信号的特征,选择p=12可以对绝大多数语音信号的声道模型取得足够的近似,增大p可以改善近似效果,但是计算量变大。

from scipy.signal import filtfilt

from chapter2_基础.soundBase import *
from chapter3_分析实验.lpc import lpc_coeff

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

data, fs = soundBase('C6_1_y.wav').audioread()
N = len(data)
time = [i / fs for i in range(N)]  # 设置时间
p = 12
ar, g = lpc_coeff(data, p)
ar[0] = 0
est_x = filtfilt(-ar, [1], data)

plt.subplot(2, 1, 1)
plt.plot(time, data, 'k')
plt.plot(time, est_x, 'c')
plt.title('LPC解码')
plt.legend(['信号', '解码信号'])
plt.subplot(2, 1, 2)
plt.plot(est_x - data)
plt.title('误差')
plt.savefig('LPC解码.png')
plt.close()

Python语音基础操作--6.2LPC编码_第1张图片

你可能感兴趣的:(Python,语音信号,python,机器学习)