資源簡介
雙門限語音端點檢測 MATLAB程序 在使用時,新建一個M文件,調(diào)用此函數(shù)即可。
代碼片段和文件信息
function?[x1x2]?=?vad(x)%新建一個文件M,調(diào)用此函數(shù)即可
?
%幅度歸一化到[-11]
x?=?double(x);
x?=?x?/?max(abs(x));
?
%常數(shù)設(shè)置
frameLen?=?240;%幀長為240點
frameInc?=?80;%幀移為80點
?
amp1?=?10;%初始短時能量高門限
amp2?=?2;%初始短時能量低門限
zcr1?=?10;%初始短時過零率高門限
zcr2?=?5;%初始短時過零率低門限
?
maxsilence?=?8;??%?8*10ms??=?80ms
%語音段中允許的最大靜音長度,如果語音段中的靜音幀數(shù)未超過此值,則認為語音還沒結(jié)束;如果超過了
%該值,則對語音段長度count進行判斷,若count
%狀態(tài)0;若count>minlen,則認為語音段結(jié)束;
minlen??=?15;????%?15*10ms?=?150ms
%語音段的最短長度,若語音段長度小于此值,則認為其為一段噪音
status??=?0;?????%初始狀態(tài)為靜音狀態(tài)
count???=?0;?????%初始語音段長度為0
silence?=?0;?????%初始靜音段長度為0
?
%計算過零率
tmp1??=?enframe(x(1:end-1)?frameLen?frameInc);
tmp2??=?enframe(x(2:end)???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);
amp?=?sum(abs(enframe(x?frameLen?frameInc))?2);
?
%調(diào)整能量門限
amp1?=?min(amp1?max(amp)/4);
amp2?=?min(amp2?max(amp)/8);
?
%開始端點檢測
x1?=?0;
x2?=?0;
for?n=1:length(zcr)
???goto?=?0;
???switch?status
???case?{01}???????????????????%?0?=?靜音?1?=?可能開始
??????if?amp(n)?>?amp1??????????%?確信進入語音段
?????????x1?=?max(n-count-11);
?????????status??=?2;
?????????silence?=?0;
?????????count???=?count?+?1;
??????elseif?amp(n)?>?amp2?|?...?%?可能處于語音段
?????????????zcr(n)?>?zcr2
?????????status?=?1;
?????????count??=?count?+?
評論
共有 條評論