語音端點檢測matlab程序實現?
基於倒譜距離的方法matlab編程
鑒於有些同學需要這方面的材料,下面進行一下答案的更新
在對語音信號進行分析和處理之前,必須對其進行預加重、分幀、加窗等預處理操作。這些操作的目的是消除因為人類發聲器官本身和由於採集語音信號的設備所帶來的混疊、高次諧波失真、高頻等等因素,對語音信號質量的影響。儘可能保證後續語音處理得到的信號更均勻、平滑,為信號參數提取提供優質的參數,提高語音處理質量。
1 預加重
語音信號s(n)的平均功率譜受聲門激勵和口鼻輻射的影響,高頻端大約在800Hz以上按6dB/oct (倍頻程)衰減,頻率越高相應的成分越小,為此要在對語音信號s(n)進行分析之前對其高頻部分加以提升。通常的措施是用數字濾波器實現預加重,預加重網路的輸出 和輸入的語音信號s(n)的關係為:
其中a為預加重係數,一般取,本系統中取a= 0.9375。
單詞 interesting數據顯示
單詞 interesting數據經預加重後
2 分幀
貫穿於語音分析全過程的是「短時分析技術」。語音信號具有時變特性,但是在一個短時間範圍內(一般認為在10~30ms的短時間內),其特性基本保持不變即相對穩定,因而可以將其看作是一個準穩態過程,即語音信號具有短時平穩性。所以任何語音信號的分析和處理必須建立在「短時」的基礎上,即進行「短時分析」,將語音信號分段來分析其特徵參數,其中每一段稱為一「幀」,幀長一般取為10~30ms。這樣,對於整體的語音信號來講,分析出的是由每一幀特徵參數組成的特徵參數時間序列。
3 加窗
由於語音信號具有短時平穩性,我們可以對信號進行分幀處理。緊接著還要對其加窗處理。窗的目的是可以認為對抽樣n附近的語音波形加以強調而對波形的其餘部分加以減弱。對語音信號的各個短段進行處理,實際上就是對各個短段進行某種變換或施以某種運算。用得最多的三種窗函數是矩形窗、漢明窗(Hamming)和漢寧窗(Hanning),其定義分別為:
矩形窗和漢明窗的比較:
矩形窗,主瓣較窄,具有較高的頻率解析度,但具有較高的旁瓣,相鄰諧波干擾比較嚴重。與矩形窗相比,漢明窗得到的頻譜卻要平滑得多。
4 端點檢測
4.1 短時能量
短時能量序列反映了語音振幅或能量隨著時間緩慢變化的規律
4.2 過零率
語音信號處理中的端點檢測主要是為了自動檢測出語音的起始點及結束點。
這裡我們採用了雙門限比較法來進行端點檢測。雙門限比較法以短時能量E和短時平均過零率Z作為特徵,結合Z和E的優點,使檢測更為準確,有效降低系統的處理時間,能排除無聲段的雜訊干擾,從而提高的語音信號的處理性能。
function [x1,x2] = vad(x)
%幅度歸一化到[-1,1]
x = double(x);
x = x / max(abs(x));
%常數設置
FrameLen = 240;
FrameInc = 80;
amp1 = 10;
amp2 = 2;
zcr1 = 10;
zcr2 = 5;
maxsilence = 8; % 6*10ms = 30ms
minlen = 15; % 15*10ms = 150ms
status = 0;
count = 0;
silence = 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);
%調整能量門限
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 {0,1} % 0 = 靜音, 1 = 可能開始
if amp(n) &> amp1 % 確信進入語音段
x1 = max(n-count-1,1);
status = 2;
silence = 0;
count = count + 1;
elseif amp(n) &> amp2 | ... % 可能處於語音段
zcr(n) &> zcr2
status = 1;
count = count + 1;
else % 靜音狀態
status = 0;
count = 0;
end
case 2, % 2 = 語音段
if amp(n) &> amp2 | ... % 保持在語音段
zcr(n) &> zcr2
count = count + 1;
else % 語音將結束
silence = silence+1;
if silence &< maxsilence % 靜音還不夠長,尚未結束
count = count + 1;
elseif count &< minlen % 語音長度太短,認為是雜訊
status = 0;
silence = 0;
count = 0;
else % 語音結束
status = 3;
end
end
case 3,
break;
end
end
count = count-silence/2;
x2 = x1 + count -1;
subplot(311)
plot(x)
axis([1 length(x) -1 1])
ylabel("Speech");
line([x1*FrameInc x1*FrameInc], [-1 1], "Color", "red");
line([x2*FrameInc x2*FrameInc], [-1 1], "Color", "red");
subplot(312)
plot(amp);
axis([1 length(amp) 0 max(amp)])
ylabel("Energy");
line([x1 x1], [min(amp),max(amp)], "Color", "red");
line([x2 x2], [min(amp),max(amp)], "Color", "red");
subplot(313)
plot(zcr);
axis([1 length(zcr) 0 max(zcr)])
ylabel("ZCR");
line([x1 x1], [min(zcr),max(zcr)], "Color", "red");
line([x2 x2], [min(zcr),max(zcr)], "Color", "red");
樓主,運行出現這個錯誤,怎麼解??
Trial&>&> VAD(5)
錯誤使用 matlab.graphics.axis.Axes/set
值必須是數值類型的 1x2 矢量,其中第二個元素大於第一個元素,並且可能為 Inf
出錯 axis&>LocSetLimits (line 272)
set(ax,...
出錯 axis (line 101)
LocSetLimits(ax(j),cur_arg,names);
出錯 VAD (line 43)
axis([1 length(x) -1 1])
推薦閱讀:
※關於機器學習的應用一般都用什麼語言和平台?具體到視頻分析用什麼軟體來分析?
※MATLAB裡面有哪些加快程序運行速度的方法呢,求分享?
※為什麼很多計算機專業碩士生論文編程都是用MATLAB做的,僅僅是科學計算方面的優勢嗎?
※Matlab 2018a 比2017b有哪些改進?
TAG:MATLAB |