说话人识别的技术原理是啥

鉴于题主的描述,这个应该是属于Speaker segmentation和Speaker diarization的任务。一个封闭的环境有2-3人参与说话,也就是可以理解为一条数秒的语音中有多个说话人先后说话了。要解决这个问题需要先分割再分类:大体想法是检测这段语音中的speaker change points,然后分割,再每小段判断是否属于同一个人,从而得到题主要的有多少位说话人,每个说话人各说出了多少次等等信息。
而speaker segmentation就是确认when,哪一个时刻从当前speaker 切换到下一位出现的speaker;speaker diarization是完成把已切分的语音段分类到相同的说话人。
大致做法嘛,我也不好说对,因为这个我也是接触没多久:可以先用一个固定时长的窗分割(2秒),相邻段之间重叠500ms,如此切分之后就按照说话人识别的流程走下去,提取MFCC,CMN,CVN,训练GMM-UBM,T矩阵,提取i-vector,接着这里是用 cosine distance score判断:
说话人识别的技术原理是啥

得到的值规整后可以设置一个阈值:假如相邻两段语音,后一段是有change point的话,那按道理就会出现前后两段不一样,距离就会比较大,当大于一个阈值时就可以判断出后一段语音是含有这个change point,这样走下去就可以陆续大致找出所有的points。不过以上方法算是比较旧的了,今年ICASSP提供了不少新方法,例如下面这个图的可变时长的窗来提高分割的效果:
说话人识别的技术原理是啥

【说话人识别的技术原理是啥】 上图就可以看出C1,C2,C3是points了吧,这样就可以切分为一个个segment~接下来就是分类的问题了,可以用主流的无监督方法例如直接上聚类等等。如果题主还想知道所得类别属于who,就是speaker recognition的问题了。
推荐看《SPEAKER SEGMENTATION USING I-VECTOR IN MEETINGS DOMAIN》,以上图片均采自这论文
开源可以用目前很热门的Kaldi,很多资源社区也很活跃;也可以用学术经典HTK~

■网友
这个问题属于 Speaker diarization ,从一段语音流中先切分出不同说话人的语音段,然后判断每段语音属于哪个说话人。相关论文ICASSP和Interspeech很多,开源工具方面有alize(ALIZé opensource speaker recognition),里面有关于speaker diarization的例子用作参考。
最近我也想尝试这个方向,欢迎交流。

■网友
首先先确定访谈会不会有同时说话的这种情况,如果有需要加语音分离,目前2个或3个个人在这种比较封闭环境效果还是很好的,具体看interspeech2016或icassp2017的多说话人语音分离论文。然后如果没有重叠的话,应该叫说话人追踪探测的技术。这个不是很清楚(是不是语音分割技术?),只有两三个人的话,应该是先根据访谈者训简单的识别模型,或者只提Ivector做均值估计也效果不错。当然也可以做通用的说话人识别模型,对于新的访谈者只需要几句话就可以注册一个说话人模型。最后感觉场景应该是分离完了做识别,这样比较完美,识别就不说了。开源的工具的话,kaldi中语音分离,说话人识别,语音识别都有,探测追踪不清楚。这个项目挺实用的,也挺大的,可以私信交流。
■网友
关于这个问题 题主可以看看大神余栋的论文 今年又提出了新的方法PIT /deep clustering 感觉很厉害 我也在看 欢迎交流

■网友
如果你的目的只是做切割的话, 也可以看一下pyannote audio 里面的 speaker change detection 部分。有问题可以互相交流啊。

■网友
再说一下这个问题的背景以及目前的进展。
业务场景先假定2人对话,且其中一个人是固定的(我们的用户,简称用户方),且不考虑同时说话的情况(重叠)。对于用户方,我们可以要求用户上传声音样本用于训练一个模型。


推荐阅读