日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

语音识别-过零率和短时能量-端点检测

發布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 语音识别-过零率和短时能量-端点检测 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

端點檢測

個人理解

能量與過零數的端點檢測算法步驟

  • 語音信號x(n)進行分幀處理
  • 計算每一幀的短時能量,得到語音的短時幀能量
  • 計算每一幀語音的過零數,得到短時幀過零數
  • 考擦語音的平均能量設置一個較高的門限T1,用以確定語音的開始,然后根據背景噪聲的平均能量確定一個稍低的門限T2,用以確定第一級語音結束點。第二級判決同樣根據背景噪聲平均過零,設置一個門限T3,判斷語音前段清音和后端尾音。
  • 我直接根據幅度來設置門限

    a. 語音信號分幀處理

    filedir=[];%設置路徑 filename='D:\matlab\music\zj3.wav'; file=[filedir filename]; [x,Fs]=audioread(file);%得到語音信號的數據wlen=200;%幀長 inc=100;%幀移 win=hamming(wlen);%海明窗 N=length(x);%信號長度 time=(0:N-1)/Fs;%計算出信號的時間刻度X=enframe(x,win,inc)'; %分幀,一列是一幀 fn=size(X,2);%幀數 frameTime=frame2time(fn,wlen,inc,Fs); %求出每幀對應的時間 %這個公式得再看一下

    b.

    %短時能量for i=1:fny=X(:,i);%每一幀數據b=0;for m=1:1:200 %這是根據幀長定的b=b+y(m).^2; endE(i)=b;end%%參考-更簡單點-尚未理解fn=size(X,2); % 求出幀數 time=(0:N-1)/Fs; % 計算出信號的時間刻度 for i=1 : fnu=X(:,i); % 取出一幀u2=u.*u; % 求出能量En(i)=sum(u2); % 對一幀累加求和 end

    c. 短時幀過零數

    %短時過零率Z=zeros(1,fn); % 初始化for i=1:fny=X(:,i);%每一幀數據b=0;for m=1:1:199 %根據幀長來定的if y(m)*y(m+1)<0;b=b+1;endZ(i)=b;endend%%更簡單點-尚未理解fn=size(X,2); % 獲取幀數 zcr1=zeros(1,fn); % 初始化 for i=1:fnz=X(:,i); % 取得一幀數據for j=1: (wlen- 1) ; % 在一幀內尋找過零點if z(j)* z(j+1)< 0 % 判斷是否為過零點zcr1(i)=zcr1(i)+1; % 是過零點,記錄1次endend end

    d.根據平均能量來設置門限

    平均能量的結果:

    [外鏈圖片轉存失敗(img-Ciy7MbEu-1563959907473)(D:\matlab\語音信號處理實驗教程-自己\assets\短時能量.jpg)]

    E共有818個數據

    T1設置為0.01,即當找到大于0.1標記。語音的開始

    T2設置為0.001,即當找到小于0.001標記。語音的結束

    找到了點,但是編程有點問題。就是要只顯示端點而不是全部顯示

    [外鏈圖片轉存失敗(img-2wWpu6Tz-1563959907475)(assets/找到了點-1但是沒找到端點.jpg)]

    經修改

    [外鏈圖片轉存失敗(img-SRvXb1fn-1563959907476)(assets/找到點-有點問題.jpg)]

    過零率端點找得有點問題

    %能量與過零數的端點檢測算法1 clear all; clc; filedir=[];%設置路徑 filename='D:\matlab\music\zs.wav'; file=[filedir filename]; [x,Fs]=audioread(file); xmax=max(abs(x)); x=x/xmax';%歸一化x=filter([1 -0.98],[1],x);%預加重wlen=200;%幀長 inc=100;%幀移 win=hamming(wlen);%海明窗 N=length(x);%信號長度 time=(0:N-1)/Fs;%計算出信號的時間刻度X=enframe(x,win,inc)'; %分幀,一列是一幀 % Xmax=max(abs(X));%矩陣歸一化,這個還不行 % X=X/Xmax; fn=size(X,2)';%幀數 frameTime=frame2time(fn,wlen,inc,Fs); %求出每幀對應的時間 %這個公式得再看一下%短時能量 for i=1:fny=X(:,i);%每一幀數據b=0;for m=1:1:200%一幀中的數據b=b+y(m).^2;endE(i)=b; end%短時過零率 Z=zeros(1,fn); % 初始化,fn之前用過 for i=1:fny=X(:,i);%每一幀數據b=0;for m=1:1:199if y(m)*y(m+1)<0;b=b+1;endZ(i)=b;end end%找短時能量的門限來確定語音的開始和結束 zeros(i); q=[];%存儲開始語音界限的位置 i1=1; while (i1<length(E))for i1=i1:1:length(E)e=E(i1);if e>0.1q=[q i1-1];i1=i1+1;for i2=i1:length(E)e=E(i2);if e<0.1q=[q i2+1];i1=i2+1;breakend endbreakendend end%過零率 i1=1; w=[];%存儲結束語音界限位置 while (i1<length(Z))for i1=i1:1:length(Z)e=Z(i1);if e>120w=[w i1];i1=i1+1;for i2=i1:length(Z)e=Z(i2);if e<50w=[w i2+1];i1=i2+1;breakend endbreakendend end%畫圖subplot(311)plot(time,x);title('原始信號')xlabel('時間');ylabel('幅度');subplot(312)plot(frameTime(q),E(q),'or');hold onplot(frameTime,E);title('短時能量')xlabel('時間');ylabel('幅度');subplot(313)plot(frameTime(w),Z(w),'or');hold onplot(frameTime,Z);title('過零率')xlabel('時間');ylabel('次數');

    最終結果


    問題:因為判斷方式不同,書上的判斷更準確。
    根據幅度來判斷變化比較大,且還得根據音頻來切換幅度。

    總結

    以上是生活随笔為你收集整理的语音识别-过零率和短时能量-端点检测的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。