?? originalspeech.m
字號:
%將原始語音x端點檢測,將檢測出的各段語音數據保存在originalspeechdata中
function originalspeech1(x)
%幅度歸一化到[-1,1]
x=double(x);
x=x/max(abs(x));
%常數設置
FrameLen=240; %8k采樣,30ms對應240點
FrameInc=240; %30ms對應楨移240點
amp1=2;
amp2=0.3;
zcr2=0.0005;
maxsilence=3; %3*30ms=90ms
minlen=6; %10*30ms=300ms
status=0;
count=0; %語音長度
silence=0;
%計算過零率
tmp1=enframe(x(1:length(x)-1),FrameLen,FrameInc);
tmp2=enframe(x(2:length(x)),FrameLen,FrameInc);
signs=(tmp1.*tmp2)<0;
diffs=(tmp1-tmp2)>0.02;
zcr=sum(signs.*diffs,2);
%計算短時能量
amp=sum(abs(enframe(filter([1-0.9375],1,x),FrameLen,FrameInc)),2);
%調整能量門限
amp1=min(amp1,max(amp)/4);
amp2=min(amp2,max(amp)/9);
d=zeros(20,1);
d(1)=1;
d(2)=1;
%開始端點檢測
for i=0:10
status=0;
count=0;
for n=d(2*i+1):length(zcr)
switch status
case 0, %2=語音段
if amp(n)>amp2|zcr(n)>zcr2 %保持在語音段
count=count+1;
status=1;
silence=0;
else %靜音狀態
status=0;
count=0;
end
case 1,
if amp(n)>amp2|zcr(n)>zcr2 %保持在語音段
count=count+1;
d(2*i+1)=max(n-count,1);
else %語音將結束
silence=silence+1;
if silence<maxsilence %靜音還不夠長,尚未結束
count=count+1;
elseif count<minlen %語音長度太短,認為是噪聲
status=0;
silence=0;
count=0;
else %語音結束
status=2;
end
end
case 2,
break;
end
end
count=count-silence/2;
d(2*i+2)=d(2*i+1)+count-0.5;
d(2*i+3)=fix(d(2*i+2)+5);
d(2*i+4)=fix(d(2*i+2)+5);
end
subplot(311)
plot(x)
axis([1 length(x) -1 1])
ylabel('OriginalSpeech');
for i=1:22
line([d(i)*FrameInc d(i)*FrameInc],[-1,1],'Color','red');
end
subplot(312)
plot(amp);
axis([1 length(amp) 0 max(amp)])
ylabel('Energy');
for i=1:22
line([d(i) d(i)],[min(amp),max(amp)],'Color','red');
end
subplot(313)
plot (zcr);
axis([1 length(zcr) 0 max(zcr)])
ylabel('ZCR');
for i=1:22
line([d(i) d(i)],[min(zcr),max(zcr)],'Color','red');
end
n=d(2)-d(1);
p=d(1)*240;
v1=x(p+1:p+240);
cx=lpc(v1,12)';
c3=cx(2:13);
p=p+240;
for i=1:n-1
y=x(p+1:p+240);
cx1=lpc(y,12)';
c1=cx1(2:13);
c3=horzcat(c3,c1);
v1=vertcat(v1,y);
p=p+240;
end
sd=v1;
for i=1:10
n=d(2*i+2)-d(2*i+1);
p=d(2*i+1)*240;
v1=x(p+1:p+240);
cx1=lpc(v1,12)';
c1=cx1(2:13);
p=p+240;
for i=1:n-1
y=x(p+1:p+240);
cx2=lpc(y,12)';
c2=cx2(2:13);
c1=horzcat(c1,c2);
v1=vertcat(v1,y);
p=p+240;
end
c3=horzcat(c3,c1);
sd=vertcat(sd,v1);
end
save('originalspeechdata','sd');
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -