Python实现基于BIC的语音对话分割(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wblgers1234/article/details/77103444

1. 语音多分割点检测

在上一篇博客<Python实现基于BIC的语音对话分割(一)>中,我们介绍了基于BIC(贝叶斯信息准则)的语音分割问题,有一个假设是这段语音中只有一个分割点,即语音对应的特征服从下面的分布:

H1:x1...xiN(μ1,Σ1);xi+1...xNN(μ2,Σ2)

但是一个分割点的检测在实际语音应用中不是很实用,因此我们提出多分割点的检测算法,基本思想如下:

  1. 初始化检测窗口 [wStart,wEnd]
  2. [wStart,wEnd] 运行BIC算法检测是否有分割点;
  3. 若2中存在分割点,则移动检测窗口 [wStart+BICloc,wEnd+BICloc] ,不改变检测窗口大小;若2中不存在分割点,则不移动检测窗口的位置,调整 wEnd ,检测窗口变为 [wStart,wEnd+wGrow]
  4. 重复2,3步直到 wEnd 超过整个语音的结束点,停止检测过程。

可以参看下面这个形象的图来理解多分割点检测过程:

这里写图片描述
图 基于BIC的多分割点检测流程

2. VAD对分割点进行筛选

在python中实现上述的多分割点检测算法,对一个四对话的语音材料进行仿真,最终的分割结果如下图所示,可以看到,语音的分割点位置基本正确,但是语音最开始的那段静音的结束点也被记录成分割点。

这里写图片描述

为了解决非法分割点的问题,我们在实现中引入VAD(Voice Activity Detection)来筛选分割点:

  • 根据Multi segmentation处理结束的分割点进行语音分段;
  • 对每段语音进行VAD检测,若VAD检测有语音端点,则不做处理;若VAD检测无语音端点,则剔除该分割点。那么最终的语音分割效果如下图所示:

这里写图片描述

3. 代码

Sample代码请访问如下的Github地址:
https://github.com/wblgers/py_speech_seg

欢迎使用并提出建议!

扫描二维码关注公众号,回复: 3771526 查看本文章

猜你喜欢

转载自blog.csdn.net/wblgers1234/article/details/77103444