本文介绍了如何使用AnalyticDB来搭建声纹比对系统。

背景信息

近年来,随着人工智能对传统行业的赋能改造,越来越多的基于人工智能的业务解决方案被提出来,声纹识别在保险行业中的身份认证便是一个很好的例子。声纹识别是根据说话人发音的生理和行为特征,自动识别说话人身份的一种生物识别技术,对应在电话销售场景下,它主要解决以下安全问题:一方面,有不法分子窃取电话销售人员账号信息,非法获取客户个人信息资料并进行贩卖、泄露,严重侵犯了公民个人的信息隐私权,另一方面,部分行业从业人员利用一些规则漏洞,通过套保、骗保等非法手段实施金融诈骗。针对这些安全问题,可以通过实时声纹认证加以解决,以电话销售人员为监管核心,利用每个人独一无二的声纹进行严密的个人身份认证,保证电话销售人员对接客户时是本人注册登录,规范电销人员行为,从源头上有效规避信息泄露、漏洞利用等风险。

声纹识别原理

声纹识别原理

上图是端对端的深度学习训练和推理过程。对比传统声纹识别模型,我们的模型在实际使用中优势明显,在用户远程身份验证场景,通过注册用户说一段话,即可轻松快速的确认注册用户身份,识别准确率达到95%以上,秒级响应,实时声纹核身。下面简要介绍我们模型的特点。

度量学习
实验发现,在声纹识别中采用softmax进行网络训练 ,用余弦相似度的测试性能往往不如传统声纹识别模型,尤其是在鲁棒性上。分析发现[6]基于softmax的分类训练,为了得到更小的loss,优化器会增大一些 easy samples 的 L2 length,减小 hard examples 的L2 length,导致这些样本并没有充分学习,特征呈现放射状,以MNIST识别任务为例,基于softmax学到的特征分布如图3(a)所示. 同类别特征分布并不聚拢,在L2 长度上拉长,呈放射状,且每个类别的间距并不大,在verification的任务中,会导致相邻的两个类别得分很高。为了达到类内聚拢,类间分散的效果,我们研究了在图像领域中应用较为成功的几种softmax变种,包括AM-softmax[4],arcsoftmax[5]等,从图3(b)可以看到,基于margin的softmax,相比纯softmax,类间的分散程度更大,且类内特征更聚拢,对声纹1:1比对和1:N搜索的任务友好。度量学习
噪音鲁棒性
在特征提取时,对于简单加性噪音,我们提出了基于功率谱减法,实现噪音抑制;对于其他复杂噪音,我们提出了基于降噪自动编码器的噪音补偿模型,将带噪语音特征映射到干净语音特征,实现噪音消除。
在模型训练时,我们采用数据增强的训练机制,将噪音数据通过随机高斯的形式加入到声纹模型的训练中,使得训练后的模型对噪音数据具有更好的鲁棒性。
短音频鲁棒性
为了提高短音频鲁棒性,我们提出了基于短时帧级别的模型训练机制,使模型能够在极短的语音时长(约0.5秒)下即可完成声纹识别。在此基础上,我们在模型训练中引入了更多高阶的音频统计信息和正则化方法,进一步提升了模型在短语音条件下(2~3秒)的识别精度。

如何使用AnalyticDB搭建声纹比对系统

  1. 创建AnalyticDB的非结构化分析插件OpenAnalytic和向量检索插件fastann。
    CREATE EXTENSION IF NOT EXISTS open_analytic;
    CREATE EXTENSION IF NOT EXISTS fastann;
  2. 建表。
    用来保存所有说话人的声音和声音的特征,后续您可以从这个表中搜索说话人。
    CREATE TABLE speaker_table (
            speaker_id TEXT NOT NULL,  # 说话人id
            audio BYTEA NOT NULL, # 声音文件
            feature REAL[] NOT NULL, # 声音特征向量
            PRIMARY KEY (question)
    );
  3. 为特征向量列创建向量检索索引。
    CREATE INDEX speaker_table_index 
    ON speaker_table USING ann (feature) WITH (dim = 512);
  4. 创建声纹识别算法pipeline。
    在数据库中创建声纹特征提取的算法模型。
    SELECT open_analytic.pipeline_create('speaker_feature_extractor');
  5. 获取说话人声音特征。
    通过以下sql可以使用上述步骤创建的pipeline。这个UDF的输入是pipeline名称和目标文本,输出是一个说话人声音的特征向量。
    # 通过声音文件识别
    SELECT open_analytic.pipeline_run_dist_random('speaker_feature_extractor', 
                            <声音文件>);
  6. 说话人声音特征导入AnalyticDB。
    获取声音特征后,将数据插入第2步创建的表中。
    INSERT INTO speaker_table VALUES (<说话人id>,  <声音文件>, <声音特征向量>);
  7. 在数据库中搜索最相似的人。然后根据特征间距离是否满足预设的阈值来判断是否是同一个人。
    SELECT speaker_id, l2_distance(feature,  <声音特征向量>) 
    ORDER BY feature <-> <声音特征向量>
    LIMIT 10;
  8. 比较两个声音是否为同一个人。
    您也提取出两个人的声音特征然后直接计算二者的距离来判断这两个声音是否来自同一个说话人。
    SELECT  l2_distance(feature1,  feature2);

参考文献

[1] Heigold G, Moreno I, Bengio S, et al. End-to-end text-dependent speaker verification[C]//2016 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP). IEEE, 2016: 5115-5119.

[2]Li C, Ma X, Jiang B, et al. Deep speaker: an end-to-end neural speaker embedding system[J]. arXiv preprint arXiv:1705.02304, 2017.

[3] Snyder D, Garcia-Romero D, Sell G, et al. X-vectors: Robust den embeddings for speaker recognition[C]//2018 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP). IEEE, 2018: 5329-5333.

[4] Wang F, Cheng J, Liu W, et al. Additive margin softmax for face verification[J]. IEEE Signal Processing Letters, 2018, 25(7): 926-930.

[5] Dang J, Guo J, Xue N, et al. Arc face: Additive angular margin loss for deep face recognition[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2019: 4690-4699.

[6] Ranjan R, Castillo C D, Chellappa R. L2-constrained softmax loss for discriminative face verification[J]. arXiv preprint arXiv:1703.09507, 2017.