问题实施语音活动检测的能量阈值算法

时间:2011-05-20 11:45:46

标签: speech-recognition

我正在尝试为语音活动检测实施能量阈值算法,而不是为大小为wL的帧获取有意义的能量值。

wL = 1784 // about 40 ms (
const double decay_constant = 0.90 // some optimal value between 0 and 1
double prevrms = 1.0  // avoid DivideByZero
double threshold = some optimal value after some experimentation

for (int i = 0; i < noSamples ; i += wL)
{
   for (int j = 0; j < wL; j++)
   {
     // Exponential decay
     total = total * decay_constant;
     total += (audioSample[j] * audioSample[j]); // sum of squares
   }

   double mean = total / wL;
   double rms = Math.Round(Math.Sqrt(mean),2); // root mean sqare
   double prevrms = 1.0;

   if(rms/prevrms > threshold)
   {
  // voice detected
   }

   prevrms = rms;
   rms = 0.0;
}

上述实施有什么问题?每帧的rms计算为0.19。

另一个问题是速度,因为执行上述操作需要大约30分钟。目前实施是O(n 2 )。我正在使用离线数据,所以这不是一个大问题 - 准确性是主要目标 - 但任何提高效率的建议都将受到高度赞赏。

另外,我应该使用其他因素,如自相关和过零率,还是只有能量足够?

以下是我正在使用的WAV文件摘要(仅考虑干净的会话语音):

// WAV file information
Sampling Frequency: 44100     Bits Per Sample:  16 
Channels: 2    nBlockAlign: 4   wavdata size: 557941248 bytes
Duration: 3162.932 sec    Samples: 139485312    Time between samples: 0.0227 ms
Byte position at start of samples: 44 bytes  (0x2C)

Chosen first sample to display:  1   (0.000 ms)
Chosen end  sample to display:  1784   (40.431 ms)

16 bit max possible value is:  32767  (0x7FFF)
16 bit min possible value is: -32768  (0x8000)

1 个答案:

答案 0 :(得分:1)

我发现了这个问题。我的第二个for循环未正确设置。基本上,第二个for循环应该是这样的:

for(j = i; j <= i + wL ;j++)

而不是:

for(j = 0; j < wL; j++)

一遍又一遍地使用相同的样本值。