找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2717|回复: 1
打印 上一主题 下一主题
收起左侧

利用MATLAB识别1-9语音的源码

[复制链接]
跳转到指定楼层
楼主
自己做的,识别1-9的语音。


全部资料51hei下载地址:
MATLAB语音识别1-9.zip (397.37 KB, 下载次数: 31)


源码:
  1. function trimmedX = myVAD(x)

  2. Ini = 0.1;          %Initial silence duration in seconds
  3. Ts = 0.01;          %Frame width in seconds
  4. Tsh = 0.005;        %Frame shift in seconds
  5. Fs = 16000;         %Sampling Frequency
  6. counter1 = 0;   
  7. counter2 = 0;
  8. counter3 = 0;
  9. counter4 = 0;
  10. ZCRCountf = 0;      %Stores forward count of crossing rate > IZCT
  11. ZCRCountb = 0;      %As above, for backward count
  12. ZTh = 40;           %Zero crossing comparison rate for threshold
  13. w_sam = fix(Ts*Fs);                   %No of Samples/window
  14. o_sam = fix(Tsh*Fs);                  %No of samples/overlap
  15. lengthX = length(x);
  16. segs = fix((lengthX-w_sam)/o_sam)+1;  %Number of segments in speech signal
  17. sil = fix((Ini-Ts)/Tsh)+1;            %Number of segments in silent period
  18. win = hamming(w_sam);

  19. Limit = o_sam*(segs-1)+1;             %Start index of last segment

  20. FrmIndex = 1:o_sam:Limit;             %Vector containing starting index
  21.                                       %for each segment
  22. ZCR_Vector = zeros(1,segs);           %Vector to hold zero crossing rate
  23.                                       %for all segments
  24.                                     
  25. %Below code computes and returns zero crossing rates for all segments in
  26. %speech sample  
  27. for t = 1:segs
  28.     ZCRCounter = 0;
  29.     nextIndex = (t-1)*o_sam+1;
  30.     for r = nextIndex+1:(nextIndex+w_sam-1)
  31.         if (x(r) >= 0) && (x(r-1) >= 0)
  32.          
  33.         elseif (x(r) >= 0) && (x(r-1) < 0)
  34.          ZCRCounter = ZCRCounter + 1;
  35.         elseif (x(r) < 0) && (x(r-1) < 0)
  36.          
  37.         elseif (x(r) < 0) && (x(r-1) >= 0)
  38.          ZCRCounter = ZCRCounter + 1;
  39.         end
  40.     end
  41.     ZCR_Vector(t) = ZCRCounter;
  42. end

  43. %Below code computes and returns frame energy for all segments in speech
  44. %sample
  45. Erg_Vector = zeros(1,segs);
  46. for u = 1:segs
  47.     nextIndex = (u-1)*o_sam+1;
  48.     Energy = x(nextIndex:nextIndex+w_sam-1).*win;
  49.     Erg_Vector(u) = sum(abs(Energy));
  50. end

  51. IMN = mean(Erg_Vector(1:sil));  %Mean silence energy (noise energy)
  52. IMX = max(Erg_Vector);          %Maximum energy for entire utterance
  53. I1 = 0.03 * (IMX-IMN) + IMN;    %I1 & I2 are Initial thresholds
  54. I2 = 4 * IMN;
  55. ITL = min(I1,I2);               %Lower energy threshold
  56. ITU = 5 * ITL;                  %Upper energy threshold
  57. IZC = mean(ZCR_Vector(1:sil));  %mean zero crossing rate for silence region
  58. stdev = std(ZCR_Vector(1:sil)); %standard deviation of crossing rate for
  59.                                 %silence region
  60. IZCT = min(ZTh,IZC+2*stdev);    %Zero crossing rate threshold
  61. indexi = zeros(1,lengthX);      %Four single-row vectors are created
  62. indexj = indexi;                %in these lines to facilitate computation below
  63. indexk = indexi;
  64. indexl = indexi;

  65. %Search forward for frame with energy greater than ITU
  66. for i = 1:length(Erg_Vector)
  67.     if (Erg_Vector(i) > ITU)
  68.         counter1 = counter1 + 1;
  69.         indexi(counter1) = i;
  70.     end
  71. end
  72. ITUs = indexi(1);

  73. %Search further forward for frame with energy greater than ITL
  74. for j = ITUs:-1:1
  75.     if (Erg_Vector(j) < ITL)
  76.         counter2 = counter2 + 1;
  77.         indexj(counter2) = j;
  78.     end
  79. end
  80. start = indexj(1)+1;

  81. Erg_Vectorf = fliplr(Erg_Vector);%Flips round the energy vector
  82. %Search forward for frame with energy greater than ITU
  83. %This is equivalent to searching backward from last sample for energy > ITU
  84. for k = 1:length(Erg_Vectorf)
  85.     if (Erg_Vectorf(k) > ITU)
  86.         counter3 = counter3 + 1;
  87.         indexk(counter3) = k;
  88.     end
  89. end
  90. ITUf = indexk(1);

  91. %Search further forward for frame with energy greater than ITL
  92. for l = ITUf:-1:1
  93.     if (Erg_Vectorf(l) < ITL)
  94.         counter4 = counter4 + 1;
  95.         indexl(counter4) = l;
  96.     end
  97. end

  98. finish = length(Erg_Vector)-indexl(1)+1;%Tentative finish index
  99.    
  100. %Search back from start index for crossing rates higher than IZCT
  101.    
  102. BackSearch = min(start,25);
  103. for m = start:-1:start-BackSearch+1
  104.     rate = ZCR_Vector(m);
  105.     if rate > IZCT
  106.         ZCRCountb = ZCRCountb + 1;
  107.         realstart = m;
  108.     end
  109. end
  110. if ZCRCountb > 3
  111.     start = realstart;          %If IZCT is exceeded in more than 3 frames
  112.                                 %set start to last index where IZCT is exceeded
  113. end

  114. %Search forward from finish index for crossing rates higher than IZCT
  115. FwdSearch = min(length(Erg_Vector)-finish,25);
  116. for n = finish+1:finish+FwdSearch
  117.     rate = ZCR_Vector(n);
  118.     if rate > IZCT
  119.         ZCRCountf = ZCRCountf + 1;
  120.         realfinish = n;
  121.     end
  122. end
  123. if ZCRCountf > 3
  124.     finish = realfinish;        %If IZCT is exceeded in more than 3 frames
  125.                                 %set finish to last index where IZCT is
  126.                                 %exceeded
  127. end

  128. x_start = FrmIndex(start);      %actual sample index for frame 'start'
  129. x_finish = FrmIndex(finish-1);  %actual sample index for frame 'finish'
  130. trimmedX = x(x_start:x_finish); %Trim speech sample by start and finish
  131.                                 %indices
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:432988 发表于 2018-11-25 20:13 | 只看该作者
为啥我识别不出来....
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表