【语⾳合成】基于matlab线性预测系数和基⾳参数语⾳合成【含Matlab源码563
发面馒头
期】
⼀、获取代码⽅式
获取代码⽅式1:
完整代码已上传我的资源:
获取代码⽅式2:
通过紫极神光博客主页开通CSDN会员,凭⽀付凭证,私信博主,可获得此代码。
获取代码⽅式3:
通过订阅紫极神光博客付费专栏,凭⽀付凭证,私信博主,可获得此代码。
备注:开通CSDN会员,仅只能免费获得1份代码(有效期为开通⽇起,三天内有效);
订阅紫极神光博客付费专栏,可免费获得2份代码(有效期为订阅⽇起,三天内有效);三角形相似的判定定理
⼆、线性预测合成简介
线性预测合成⽅法是⽬前⽐较简单和实⽤的⼀种语⾳合成⽅法,它以其低数据率、低复杂度、低成本,受到特别的重视。20世纪60年代后期发展起来的L.PC语⾳分析⽅法可以有
效地估计基本语⾳参数,如基⾳、共振峰,谱、声道⾯积函数等,可以对语⾳的基本模型给出精确的估计, ⽽且计算速度较快。因此,LPC语⾳合成器利⽤LPC语⾳分析⽅法, 通过分析⾃然语⾳样本, 计算出LPC系数, 就可以建⽴信号产⽣模型, 从⽽合成出语⾳。线性预测合成模型是⼀种“源⼀滤波器”模型,由⽩噪声序列和周期脉冲序列构成的激励信号,经过选通、放⼤并通过时变数字滤波器(由语⾳参数控制的声道模型),就可以再获得原语⾳信号。这种参数编码的语⾳合成器的原理框图如图10-2所⽰。图10-2所⽰的线性预测合成的形式有两种:⼀种是直接⽤预测器系数a构成的递归型合成滤波器;另⼀种合成的形式是采⽤反射系数k构成的格型合成滤波器。
直接⽤预测器系数a,构成的递归型合成滤波器机构如图10-3所⽰。⽤该⽅法定期地改变激励参数u(n)和预测器系数a,能合成出语⾳。这种结构简单⽽直观,为了合成⼀个语⾳样本,需要进⾏p次乘法和
p次加法。合成的语⾳样本由下式决定:
式中,a;为预测器系数;G为模型增益;u(n)为激励;合成语⾳样本为s(n);p为预测器
阶数。
直接式的预测系数滤波器结构的优点是简单、易于实现,所以曾被⼴泛采⽤,其缺点是合成语⾳样本需要很⾼的计算精度。这是因为这种递归结构对系数的变化⾮常敏感,系数的微⼩变化都可以导致滤波器极点位置发⽣很⼤变化,甚⾄出现不稳定现象。所以,由于预测系数a,的量化所造成的精度下降,使得合成的信号不稳定,容易产⽣振荡的情况。⽽且预测系数的个数p变化时,系数a,的值变化也很⼤,很难处理,这是直接式线性预测法的缺点。
另⼀种合成的形式是采⽤反射系数构成的格型合成滤波器。合成语⾳样本由下式决定:
式中,G为模型增益;u(n)为激励;k,为反射系数;b,(n)为后向预测误差;p为预测器
阶数。
由式(10-2)可看出,只要知道反射系数、激励位置(即基⾳周期)和模型增益就可由后向误差序列迭代计算出合成语⾳。合成⼀个语⾳样本需要(2p-1)次乘法和(2p-1)次加法。采⽤反射系数k,的格型合成滤波器结构,虽然运算量⼤于直接型结构,却具有⼀系列优点:其参数k,具有|k,|<1的性质,因⽽滤波器是稳定的;同时与直接结构形式相⽐,它对有限字长引起的量化效应灵敏度较低。此外,基⾳同步合成需对控制参数进⾏线性内插,以得到每个基⾳周期起始处的值。然⽽预测器系数本⾝却不能直接内插,但可以证明,可对部分相关系数进⾏内插,如果原来的参数是稳定的,则结果必稳定。⽆论选⽤哪⼀种滤波器结构形式, LPC合成模型中所有的控制参数都必须随时间不断修正。
在实际进⾏语⾳合成时,除了构成合成滤波器之外,还必须在有浊⾳的情况下,将⼀定基⾳周期的脉冲序列作为⾳源;在清⾳的情况下,将⽩噪声作为⾳源。由此可知,必须进⾏浊⾳/清⾳的判别和确定⾳源强度。
对于基⾳周期的检测,上述章节已经进⾏了相关介绍。对于语⾳合成来说,常采⽤去掉
共振峰影响后的最后⼀级残差信号eP(前向预测误差)的⾃相关函数的⽅式。这个残差信
号的⾃相关函数也叫变形⾃相关函数r,(n),它除了可⽤来检测基⾳周期之外,也可⽤来区别浊⾳/清⾳等。在r,(0)之后找出r,(n)取峰值时的T,即从n=0开始,搜索基⾳周期可能存在的3~15ms的区间,从⽽求出这个周期。同样对于浊⾳/清⾳的判别⽅法,也可以采⽤误差信号r,(n)。采⽤r.(n)的⼀个⽅法是利⽤r,(T)/r,(0)这个⽐值,如果是浊⾳的话,r.(T)则相当于r.(n)的⼀个极值。所以可以设定r,(T)/r,(0)的⽐值在0.18以下为清⾳,在0.25以上为浊⾳。
三、部分源代码
clear all; clc; clo all;
[xx, fs, bits]=wavread('C7_2_y.wav');%读⼊数据⽂件
xx=xx-mean(xx);%去除直流分量
x=xx/max(abs(xx));%归⼀化
x=xx/max(abs(xx));%归⼀化
N=length(x);%数据长度
time=(0:N-1)/fs;%时间刻度
wlen=240;%帧长
inc=80;%帧移
overlap=wlen-inc;%重叠长度
tempr1=(0:overlap-1)'/overlap;%斜三⾓窗函数w1
tempr2=(overlap-1:-1:0)'/overlap;%斜三⾓窗函数w2
刘青霞故居
n2=1:wlen/2+1;%正频率的下标值
wind=hanning(wlen);%窗函数
怎么设置锁屏X=enframe(x,wind,inc)';%分帧
fn=size(X,2);%帧数
T1=0.1; r2=0.5;%端点检测参数
miniL=10;%有话段最短帧数
mnlong=5;%元⾳主体最短帧数
ThrC=[1015];%阈值
p=12;% LPC阶次
frameTime=FrameTimeC(fn,wlen,inc,fs);%计算每帧的时间刻度
for i=1: fn %计算每帧的线性预测系数和增益
u=X(:,i);
[ar,g]=lpc(u,p);
AR_coeff(:,i)=ar;
Gain(i)=g;
dnf安图恩end
%基⾳检测
[voiceg,vosl,SF,Ef,period]=pitch_Ceps(x,wlen,inc,T1,fs);%基于倒谱法的基⾳周期检测
Dpitch=pitfilterm1(period,voiceg,vosl);%对T0进⾏平滑处理求出基⾳周期T0
房地产交易网tal=0;%初始化前导零点
zint=zeros(p,1);
银行存折
for i=1:fn;
ai=AR_coeff(:,i);%获取第i帧的预测系数
sigma_square=Gain(i);%获取第i帧的增益系数
sigma=sqrt(sigma_square);
if SF(i)==0%⽆话帧
excitation=randn(wlen,1);%产⽣⽩噪声
[synt_frame,zint]=filter(sigma,ai,excitation,zint);%⽤⽩噪声合成语⾳
el%有话帧
PT=round(Dpitch(i));%取周期值
exc_syn1 =zeros(wlen+tal,1);%初始化脉冲发⽣区
exc_syn1(mod(1:tal+wlen,PT)==0)=1;%在基⾳周期的位置产⽣脉冲,幅值为1
exc_syn2=exc_syn1(tal+1:tal+inc);%计算帧移inc区间内脉冲个数
index=find(exc_syn2==1);
excitation=exc_syn1(tal+1:tal+wlen);%这⼀帧的激励脉冲源
if impty(index)%帧移inc区间内没有脉冲
tal=tal+inc;%计算下⼀帧的前导零点
el%帧移inc区间内有脉冲
eal=length(index);%计算有⼏个脉冲
tal=inc-index(eal);%计算下⼀帧的前导零点
end
gain=sigma/sqrt(1/PT);%增益
[synt_frame,zint]=filter(gain, ai,excitation,zint);%⽤脉冲合成语⾳
end
if i==1%若为第1帧
output=synt_frame;%不需要重叠相加,保留合成数据
el
M=length(output);%按线性⽐例重叠相加处理合成数据
output=[output(1:M-overlap);output(M-overlap+1:M).*tempr2+synt_frame(1:overlap).*tempr1;synt_frame(overlap+1:wlen)]; end
end
ol=length(output);%把输出output延长⾄与输⼊信号xx等长
if ol<N
output1=[output;zeros(N-ol,1)];
el
el
output1=output(1:N);
end
四、运⾏结果
五、matlab版本及参考⽂献
1 matlab版本
2014a
2 参考⽂献美丽的词语
[1]韩纪庆,张磊,郑铁然.语⾳信号处理(第3版)[M].清华⼤学出版社,2019.
[2]柳若边.深度学习:语⾳识别技术实践[M].清华⼤学出版社,2019.