1. 语音多分割点检测
在上一篇博客<Python实现基于BIC的语音对话分割(一)>中,我们介绍了基于BIC(贝叶斯信息准则)的语音分割问题,有一个假设是这段语音中只有一个分割点,即语音对应的特征服从下面的分布:
模型H1:x1...xi∼N(μ1,Σ1);xi+1...xN∼N(μ2,Σ2)
但是一个分割点的检测在实际语音应用中不是很实用,因此我们提出多分割点的检测算法,基本思想如下:
- 初始化检测窗口 [wStart,wEnd] ;
- 在 [wStart,wEnd] 运行BIC算法检测是否有分割点;
- 若2中存在分割点,则移动检测窗口 [wStart+BICloc,wEnd+BICloc] ,不改变检测窗口大小;若2中不存在分割点,则不移动检测窗口的位置,调整 wEnd ,检测窗口变为 [wStart,wEnd+wGrow] ;
- 重复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
欢迎使用并提出建议!