做自己的网站需要什么,浙江建设信息港电工证查询,wordpress会员介绍页,网站开发公司如何做直播语音的声学处理通常称为特征提取或者信号分析#xff0c;特征是表示语音信号的一个时间片的矢量。常见的特征类型有LPC#xff08;线性预测编码#xff09;特征和PLP#xff08;感知线性预测编码#xff09;#xff0c;该特征称为声谱特征#xff0c;使用形成波形的不同…语音的声学处理通常称为特征提取或者信号分析特征是表示语音信号的一个时间片的矢量。常见的特征类型有LPC线性预测编码特征和PLP感知线性预测编码该特征称为声谱特征使用形成波形的不同频度的分布来表示这个波形这种频度分布称为声谱。
1. 基本概念
1声波
说话者使用特定的方式通过声门由口腔或鼻腔流出就造成了空气压力变化我们将描画空气压力对于时间的变化情况的方法来表示声波。声波在空气中是一种纵波它的振动方向和传播方向是一致的。
波有两个重要的特征频度frequency和振幅amplitude
频度是1s内波本身重复的次数或称为‘周’cycle
振幅空气压力变化的大小是振幅振幅越高压力越大
人类感知特性音高pitch是与频率有关音强是和语音的响度有关。 参考语音识别原理与应用
2声谱
声谱特征是根据Fourier对于复杂波的深入研究提出来的。Fouries指出每个复杂波都可以表示为很多频度不同的简单波的总和。声谱是一个波的这些不同频度成分的表示。声谱图也称为幅度谱或者幅值谱横轴是时间纵轴是频率一般是指短时傅里叶变换后得到的不含相位信息的时频图对于梅尔谱变换成为功率谱。
3频谱
频谱是频率密度的简称就是频率的分布曲线。复杂振荡分解为振幅不同和频率不同的谐振荡这些谐振荡的幅值按频率排列的图形叫频谱。
4周期图
周期图是一种信号功率谱密度估计方法。为得到功率谱固估值先取信号序列的离散傅里叶变换然后取其幅频特征的平方并除以序列长度N由于序列的离散傅里叶具有周期性因而这种功率谱也具有周期性常称为周期图。
5常见指标
过零率zero crossing rate是信号符号变化的比率即在每帧中语音信号从正变为负或从负变为正的次数。过零率越大频率近似越高。
谱质心Spectral Centroid是描述音色属性的重要物理参数之一是频率成分的重心是在一定频率范围内通过能量加权平均的频率其单位是Hz。它是声音信号的频率分布和能量分布的重要信息。谱质心描述了声音的明亮度具有阴暗、低沉品质的声音倾向有较多低频内容谱质心相对较低具有明亮、欢快品质的多数集中在高频谱质心相对较高。
声谱衰减是对声音信号形状波形图的一种衡量表示低于总频谱能量的指定百分比的频率。
色度频率是音乐音频有趣且强大的表示其中整个拼欧被投影到12个区间代表音乐八度音的12个不同的半音或色度
2. 信号处理
输入的声波要进行数字化就是进行模拟-数字转换也称为声谱特征的抽取过程抽取过程从声波本身开始以特征矢量结束。模拟-数字转换的过程分为两步采样sampling和量化quantization。
1采样
采样是指对模拟信号在时间域上的离散化过程即把一个时间上连续、幅度上连续的模拟信号转换成时间上离散、幅度上连续的信号。
采样率是每秒采样点数通常的采样率是8khz16khz采样的方法通常是奈奎斯特Nyquist定理当采样率大于信号中最高频率的两倍时采样之后的数字信号能够完整保留原始信号中的信息。
2量化
量化是将采样之后的实数值进行整数化的过程量化之后还会有编码过程常见的编码有PCM编码脉冲编码调制MP3编码等。
3.特征提取
语音识别需要进行特征提取就是提取语音信号中有助于理解语音内容的部分而丢弃其他的东西常见的语音特征提取方式如下图 3.1 预处理
预处理过程是对语音信号进行预加重、分帧和加窗处理目的是对信号进行合理分段。
1预加重
因为高频信号的能量通常较低受到的抑制影响越大因此需要增加高频部分的能量即补偿语音信号高频部分的振幅。好处有增加高频部分的能量使得能量分布更加均衡防止傅里叶变换的数值计算不稳定有可能增加信噪比计算公式为 其中是预加重的系数默认为0.97
2分帧
语音信号是一个非平稳信号但是考虑在发浊音时声带有规律地振动即基音频率在短时间范围内是相对固定的语音信号具有短时平稳特性认为10ms~30ms的语音信号是一个准稳态过程。短时分析主要采用分帧方式相邻两帧之间的基因可能发生变化为保证声学特征参数的平滑性一般采用重叠取帧的方式。
将语音信号进行切割且保证一定的重复率。核心参数有帧长每帧的长度和帧移移动的距离。对信号进行分帧范围是20-40ms通常采用25ms考虑到信号的重叠性每次移动10ms通常一帧信号的采样频率是16kHZ有16000*25/1000400个样本点。移动10ms则16000*10/1000160个样本点则每次移动160个样本。
换算详情1s1000ms1khz1000hz赫兹是频率单位如果最后一帧不够400个样本点可以考虑用0补齐。 分帧方式相当于对语音信号进行了加矩形窗的处理易出现频谱泄露因此需要加窗函数。
3加窗
考虑到语音信号的短时平稳性对每帧信号进行加窗处理常见的窗函数有汉明窗、汉宁窗、布莱克曼窗。公式为 其中w[n]是窗函数N是窗长l是帧索引L是帧移。 3.2 各类特征更多细节实现看参考资料
1前期资料
美尔尺度Mel Scale
美尔尺度是建立从人类的听觉感知的频率到声音实体频率直接的映射。通过把频率转换为美尔尺度特征能够更好的匹配人类的听觉感知效果。从频率到梅尔频率的转换公式 从梅尔频率到频率的转换公式为 梅尔滤波器组
梅尔滤波器的长度与功率谱相等每个滤波器只有对于需要采集的频率范围是非零其余都是0。
计算梅尔滤波器组的参数 转换使用梅尔尺度公式将最小和最大频率转换为美尔尺度的频率假设最值是300Hz8kHz梅尔频率是401.25Mel2834.99Mel 划分若我们有10个滤波器则需要12个点加上最大、最小频率并在最值范围内平均分配 将梅尔频率转换为频率 创建滤波器组
第一个滤波器开始于第一个点300Hz峰值在第二个点517Hz结束于第三个点781Hz第一个滤波器开始于第二个点517Hz峰值在第三个点781Hz结束于第四个点1103Hz公式为 Bark频率
临时频带是在某一段频率范围内纯音和噪声功率相等则该纯音处于刚好能被听到的临界状态一个临界频带的宽带被称为一个BarkBark频率和线性频率的对应关系如下 2FBank特征
FBank特征提取的步骤 对语音信号进行分帧处理 用周期图法进行功率谱估计短时傅里叶 对功率谱用Mel滤波器组进行滤波计算每个滤波器里的能量fBank特征 对每个滤波器的能量取log
3MFCC特征
MFCC特征提取的步骤 对语音信号进行分帧处理 用周期图法进行功率谱估计短时傅里叶 对功率谱用Mel滤波器组进行滤波计算每个滤波器里的能量fBank特征 对每个滤波器的能量取log 进行离散余弦变换(DCT) 保留DCT的第2-13个系数去掉其他
3PLP特征 对语音信号进行分帧处理 用周期图法进行功率谱估计短时傅里叶 临界频带分析Bark滤波器 等响度预加重 强度响度转换 逆傅里叶变换 线性预测,通过使线性预测到的采样点值在最小均方误差约束下逼近实际语音采样点值可以求取一组唯一的预测系数简称为线性预测编码Linear prediction codingLPC
4区别与联系
滤波器MFCC、FBank是用梅尔滤波器PLP是Bark滤波器。
STFT三者都采用短时傅里叶变换。
优点FBank保留更多原始特征适用于DNN建模MFCC去相关性较好适合GMM建模PLP抗燥性更强。
4.librosa中的实现
4.1 流程图 4.2 相关函数的参数
1MFCC参数 4.3 实现细节
1MFCC函数
def mfcc(yNone, sr22050, SNone, n_mfcc20, dct_type2, normortho, lifter0, **kwargs
):if S is None:S power_to_db(melspectrogram(yy, srsr, **kwargs))M scipy.fftpack.dct(S, axis0, typedct_type, normnorm)[:n_mfcc]if lifter 0:M * (1 (lifter / 2)* np.sin(np.pi * np.arange(1, 1 n_mfcc, dtypeM.dtype) / lifter)[:, np.newaxis])return Melif lifter 0:return Melse:raise ParameterError(MFCC lifter{} must be a non-negative number.format(lifter))
2功率谱计算melspectrogram滤波
该函数里边包含了功率谱计算和Mel滤波器进行滤波的过程其中_spectrogram是进行功率谱计算filters.mel则建立滤波器。
def melspectrogram(yNone,sr22050,SNone,n_fft2048,hop_length512,win_lengthNone,windowhann,centerTrue,pad_modereflect,power2.0,**kwargs):S, n_fft _spectrogram(yy,SS,n_fftn_fft,hop_lengthhop_length,powerpower,win_lengthwin_length,windowwindow,centercenter,pad_modepad_mode,)# Build a Mel filtermel_basis filters.mel(sr, n_fft, **kwargs)return np.dot(mel_basis, S)功率谱计算主要是用短时傅里叶变换stft计算
def _spectrogram(yNone,SNone,n_fft2048,hop_length512,power1,win_lengthNone,windowhann,centerTrue,pad_modereflect):if S is not None:# Infer n_fft from spectrogram shapen_fft 2 * (S.shape[0] - 1)else:# Otherwise, compute a magnitude spectrogram from inputS (np.abs(stft(y,n_fftn_fft,hop_lengthhop_length,win_lengthwin_length,centercenter,windowwindow,pad_modepad_mode,))** power)return S, n_fft
mel滤波器是通过filter.mel进行滤波器建立
def mel(sr,n_fft,n_mels128,fmin0.0,fmaxNone,htkFalse,normslaney,dtypenp.float32):if fmax is None:fmax float(sr) / 2# Initialize the weightsn_mels int(n_mels)weights np.zeros((n_mels, int(1 n_fft // 2)), dtypedtype)# Center freqs of each FFT binfftfreqs fft_frequencies(srsr, n_fftn_fft)# Center freqs of mel bands - uniformly spaced between limitsmel_f mel_frequencies(n_mels 2, fminfmin, fmaxfmax, htkhtk)fdiff np.diff(mel_f)ramps np.subtract.outer(mel_f, fftfreqs)for i in range(n_mels):# lower and upper slopes for all binslower -ramps[i] / fdiff[i]upper ramps[i 2] / fdiff[i 1]# .. then intersect them with each other and zeroweights[i] np.maximum(0, np.minimum(lower, upper))if norm slaney:# Slaney-style mel is scaled to be approx constant energy per channelenorm 2.0 / (mel_f[2 : n_mels 2] - mel_f[:n_mels])weights * enorm[:, np.newaxis]else:weights util.normalize(weights, normnorm, axis-1)# Only check weights if f_mel[0] is positiveif not np.all((mel_f[:-2] 0) | (weights.max(axis1) 0)):# This means we have an empty channel somewherewarnings.warn(Empty filters detected in mel frequency basis. Some channels will produce empty responses. Try increasing your sampling rate (and fmax) or reducing n_mels.)return weights
5. 实例
import librosa
import librosa.display as displayv librosa.load(./english.wav)mfcc librosa.feature.mfcc(v[0])import matplotlib.pyplot as pltdisplay.specshow(mfcc)
plt.colorbar()
# display.waveshow(v[0])结果 6.额外数学原理
6.1 短时傅里叶变换
声音信号是随时间变化通过傅里叶变换只能将其转换到频域失去了时域信息无法看出频率分布随时间变化规律。短时傅里叶是把一段长信号分帧、加窗再对每一帧做快速傅里叶变换FFT最后把每一帧的结果沿另一个维度堆叠起来就得到了二维信号形式。
利用离散傅里叶变换DFT把每一帧信号变换到时域公式是 其中s(n)表示时域信号 si(n)是第i帧的数据n范围是[1,400],Si(k)是第i帧的第k个复数Pi(k)是第i帧的功率谱h(n)是一个N点的窗函数K是DFT的长度计算功率谱 经过短时傅里叶变换之后得到一个复数复数的实部代表频率的振幅复数的虚部代表频率的相位即得到功率谱。
参考
语音信号的梅尔频率倒谱系数(MFCC)的原理讲解及python实现 - 凌逆战 - 博客园
MFCC特征提取教程 - 李理的博客
语音识别原理与应用