提高语音检测算法的准确性

时间:2013-11-25 16:12:45

标签: c# c#-4.0 machine-learning c#-3.0 voice-recognition

所以我有这个Mono音频文件,其中包含人们说话,说话暂停,然后他们再次说话。当他们说话的时候,他们不说话的时候,有些孩子不时在后台哭泣,汽车突然发出尖叫声,你在外面时听到的声音。

我的目标是在谈话时保留这些部分,并在他们不说话时剪掉这些部分。没有必要过滤背景噪音。

基本上我的最终目标是拥有这样的剪切列表

Start in seconds, End in seconds

我尝试了什么?

  1. 我通过将所有包含语音的部分组合在一起手动创建了一个仅限语音的文件。(10秒)
  2. 我通过将所有不包含语音的部分组合在一起手动创建了一个仅噪音文件。(50秒)
  3. 我通过应用快速傅里叶变换获得了频率+幅度
  4. 我每100毫秒浏览一次音频文件并拍摄FFT快照
  5. 我将一个快照的所有值(在我的情况下为512)放入List并将其提供给与标签结合的机器学习算法(numl)(在第一种情况下是voice = true,在第二种情况下是voice = false) )
  6. 然后我使用我的主音频文件,做的基本相同,但这次使用我的机器学习模型的结果来确定它是否是语音,并以秒为单位输出实现此时间的时间。
  7. 我的问题是我得到了很多误报和漏报。它似乎在没有声音时识别声音,反之亦然。

    这可能是一个训练有素的模型(我使用决策树)或我是否需要采取其他措施来获得更好的结果?

1 个答案:

答案 0 :(得分:0)

关于语音的常见误解是它被视为不相关的数据帧序列。语音的核心属性是它是一个连续的过程,而不仅仅是一组数据点。

任何合理的VAD都应该考虑到这一点,并使用像HMM这样的面向时间的分类器。在您的情况下,任何需要时间考虑的分类器都会是一个简单的基于能量的语音活动检测,它可以监控背景级别,或者基于GMM-HMM的VAD会比任何静态分类器更好。

有关简单算法的说明,您可以查看Wikipedia

如果您正在寻找一个优秀的VAD实现,您可以在WebRTC项目中找到一个,这个VAD是由Google开发的:

https://code.google.com/p/webrtc/source/browse/trunk/webrtc/common_audio/vad/