声纹识别(又称说话人识别)是从说话人发出的语音信号中提取声纹信息,并对说话人进行身份验证的一种生物识别技术。简单来说,声纹识别技术可以“确认说话人是谁”。我们说话的时候,每个人的发音器官、发音通道和发音习惯上都有个体差异,声纹识别技术就是为了识别出说话人之间的这些差异。需要注意的是,声纹识别不同于常见的语音识别 [1]:
语音识别:是共性识别,能听懂人的说话内容,即“你说了什么?”。
声纹识别:是个性识别,能判断说话人是谁,即“说话人是谁?”。
背景
声纹识别的本质,就是要找到描述特定对象的声纹特征 (feature),声纹特征类似于虹膜、指纹等,是一种独特的生物特征。至于特征提取方法,按照发展历程有模板匹配、高斯混合模型 (GMM) 、联合因子分析法 (JFA) 、深度神经网络方法等[2]。在深度神经网络之前出现的方法基本可以认为是传统方法。传统方法通常用精确的数学模型对声音信号进行特征提取,而深度神经网络通过模型训练获得声纹特征。研究表明:相较于传统方法,利用深度学习的方法在识别准确率上获得了显著的提高。本文用到的声纹特征就是基于深度学习模型得到的。
特征提取
Deep Speaker[3] 是百度发布的一个基于神经网络的说话人嵌入系统,其基本思想是将说话人的语音映射到一个超平面,从而可以通过余弦相似度取来衡量说话人的相似度。
上图是 Deep Speaker 的网络结构图,其流程为:
使用深度神经网络从说话人语音中提取帧级特征
在池化层和归一化层产生说话人的 embeddings
使用 Triplets loss 损失函数训练
采用 softmax 层和交叉熵进行预训练
在特征提取过程中,我们使用 Triplets loss 函数训练模型,不断学习说话人的 embeddings ,如上图所示:
Anchor : 根据说话人 Anchor 的语音计算的 embeddings
Positive : 与 Anchor 同一个说话人的 embeddings
Negative : 与 Anchor 不同说话人的 embeddings
通过模型训练努力使 Anchor 和 Positive 间的余弦相似度高于 Anchor 和 Negative 间的余弦相似度,从而实现模型的优化。
本文将利用基于 Deep Speaker 的模型进行声纹特征提取,然后将提取的特征向量通过 Milvus 向量搜索引擎进行相似度分析,从而实现声纹识别。
Milvus 支持使用多种 AI 模型向量化非结构化数据,并为向量数据提供搜索分析服务。它可处理的业务包括图像处理、机器视觉、自然语言处理、语音识别、推荐系统以及新药发现。具体实现方式是:
通过深度学习模型将非结构化数据转化为特征向量,并导入 Milvus 库。
对特征向量进行存储并建立索引。
接收到用户的向量搜索请求后,返回与输入向量相似的结果。
声纹识别
声纹识别需要对麦克风传感器收集的语音信息进行分析。这一过程主要包括特征提取和模式识别两部分,其中特征提取对识别率有较大的影响。以 Deep Speaker 模型生成的特征向量为依据,声纹识别方法流程如下图所示:
声纹注册:将麦克风收集的注册人语音通过 Deep Speaker 模型转为特征向量,并将注册人的声纹特征导入 Milvus 声纹库。
声纹认证:将麦克风收集的认证人语音通过 Deep Speaker 模型转为特征向量,并在 Milvus 声纹库中检索认证人的声纹特征,得出相似结果。
相似度匹配:根据 Milvus 返回的相似距离,判断认证人是否通过。比如,我们认为余弦距离大于 0.85 即为认证通过。
前面我们介绍了基于 Deep Speaker 和 Milvus 的声纹识别流程。接下来,我们将利用该声纹识别方案实现生物多因子认证系统。所谓生物多因子认证,就是利用认证人所拥有的生物信息(包括指纹、人脸、声纹等)实现的一种更加安全的身份认证方式。我们搭建的生物多因子认证系统也添加了人脸认证,关于人脸认证的部分会在本系列的第二篇文章中介绍。生物多因子认证系统的具体搭建步骤可以参考:https://github.com/milvus-io/bootcamp/tree/master/solutions/MFA。
那么,在生物多因子认证系统中,如何利用人脸信息和声纹信息共同实现身份认证呢?
1. 首先将人脸图片和声纹语音利用 AI 模型转为特征向量。然后将注册人的人脸特征和声纹特征分别存入 Milvus 中的人脸库和声纹库,并指定该注册人的 id 用于身份验证。
# Extract registrant's face feature vector
# The parameter img means the face image
model_face = face_model.FaceModel()
register_face_verctor = model.get_feature(img)
# Extract registrant's voiceprint feature vector
# The parameter voc means the voice
model_voice = DeepSpeakerModel()
register_voice_verctor = model.m.predict(voc)
# Insert vector into Milvus
# The parameter collection_face and collection_voice means the collection names of milvus
# The parameter ids means the corresponding id of the voiceprint or face in milvus
milvus.insert(collection_face, register_face_verctor, ids)
milvus.insert(collection_voice, register_voice_verctor, ids)
2. 在身份认证的时候,同样先利用 AI 模型提取认证人的人脸特征和声纹特征,然后分别在 Milvus 的人脸库和声纹库中进行检索。
# Extract authenticator's face feature vector
model_face = face_model.FaceModel()
authenticate_face_verctor = model.get_feature(img)
# Extract authenticator's voiceprint feature vector
model_voice = DeepSpeakerModel()
authenticate_voice_verctor = model.m.predict(mfcc)
# Search vector with Milvus
results_face = milvus.search(param={collection_face, authenticate_face_verctor, topk=1})
results_voice = milvus.search(param={collection_voice, authenticate_voice_verctor, topk=1})
3. 根据 Milvus 返回的相似度检索结果,根据以下两个标准判断认证是否通过:
声纹与人脸认证是否通过,即余弦距离大于 0.85 。
声纹和人脸认证的结果是否来自同一个注册人,即声纹和人脸认证结果对应的注册人 id 是否相同。
# Get conclusions based on the results returned by Milvus
if results_face.distance > 0.85 and results_voice.distance > 0.85 and results_face.id==results_voice.id:
return true # Authentication succeed
else:
return false # Authentication faild
声纹识别这项技术有很多的应用场景。生物多因子认证可用于登录设备,或者作为金融交易的额外安全步骤。另外,像智能家庭助手这样的共享设备也可以使用声纹识别技术来为当前用户提供个性化服务。声纹识别技术能让智能语音产品“认识”你的声音,只听你的唤醒指令,忽略其他人的命令,从而实现闻声识人。此外,只有家庭智能助手学会区分不同人的身份后,才能根据身份鉴别权限和提供个性化服务,实现真正的智能语音交互。
在万物皆可 embedding 的时代,我们能很方便的分析各种非结构化数据,例如图片、文本、视频和语音等,通过 embedding 技术可以将这些非结构化数据提取为特征向量,然后通过对这些特征向量的计算和相似度检索来实现对非结构化数据的分析与检索。Milvus 是为了使用户能够方便的对特征向量进行计算和检索而设计的。本文介绍的是 Milvus 在声纹识别领域的应用,更多其他应用场景可参考https://milvus.io/cn/scenarios。
参考文献
https://zhuanlan.zhihu.com/p/35729403
Snyder, David, et al. "X-vectors: Robust DNN embeddings for speaker recognition."Submitted to ICASSP(2018).
https://github.com/philipperemy/deep-speaker
github.com/milvus-io/milvus | 源码
milvus.io | 官网
milvusio.slack.com | Slack 社区
zhihu.com/org/zilliz-11/columns | 知乎
zilliz.blog.csdn.net | CSDN 博客
space.bilibili.com/478166626 | Bilibili