Python实现的声纹识别基础原理讲解
1. 声纹识别类型
说话人识别(Speaker identification)–确定测试说话人与注册说话人中的哪个匹配
说话人验证(Speaker verification)–确定测试说话人是否与特定说话人匹配
说话人分离(Speaker diarization)-“说话人何时说话”细分并标记说话人的连续录音
依赖于文本(Text dependent)–对于说话者识别和验证,测试说话者是否按照规定文本说话?
封闭式(Closed set )–是否有固定的说话人
2. 声纹识别评价标准
错误接受率(FAR):FAR = nontarget_is_target / ( target_is_target + nontarget_is_target )
错误拒绝率(FRR):FRR = target_is_nontarget / ( target_is_nontarget + nontarget_is_nontarget )
等错误率 (EER-Equal Error Rate):调整阈值,使得误拒绝率(False Rejection Rate,FRR)等于误接受率 (False Acceptance Rate,FAR),此时的FAR与FRR的值称为等错误率。取一组0到1之间的等差数列,分别作为识别模型的判别界限,既坐标x轴,画出FFR和FAR的坐标图,交点就是EER值。
3.声纹识别特征
帧级别特征:比如MFCC, LPCC, 等 请移步我的另一篇博客()
话语和说话者级别特征:
高斯混合模型 超向量 GMM supervectors
i-vector
DNN 嵌入层 DNN embeddings
d-vectors
x-vectors
UBM (通用背景模型):–在普通人群的语音基础上训练具有许多高斯(例如2048)的GMM:无序列建模(无HMM)-仅分布在MFCC上,然后使用MAP适应将UBM适应于每个目标说话者 通过对数似然比(LLR)直接使用这些GMM来验证目标说话者,其中X是观察到的测试发音,θs是目标说话者模型,θ0是UBM。 :
LLR(X,s)=log(p(X|θs)/p(X|θ0))=logp(X|θs)-logp(X|θ0)
设置一个阈值T
如果LLR(X,s)>=T 接受,如果 LLR(X,s)<T 拒绝
MAP 适应 MAP adaption
MAP适应的基本思想是在通用数据上估计的参数与目标说话者的估计之间取得平衡
假设对于第m个高斯函数,
其中
是分量所占概率。MAP 适应模型的估计:
其中,α控制平衡SI估计值和适应数据(通常0≤α≤20)
是时间n处的自适应矢量
此高斯在此时的概率.
i-Vector
使用GMM(平均值)参数代表说话人-将目标发言人的平均值参数串联起来以形成GMM超向量
。 UBM GMM的典型尺寸为2048,因此使用39维参数,这可以是一个尺寸非常大的矢量(〜80000个分量)。将话音
的超向量表示为UBM超向量和话音i-向量的组合:
- 和 是话音u和UBM的D维超向量。
- 是第i个向量(“身份向量”)–话语u(d〜400)的降维(d)表示。
- T是一个D×d矩阵(有时称为“总可变性矩阵”),它将超向量向下投影到i-向量表示形式。
- 使用EM算法为发育语料估计T,为说话人估计i-vector 作为给定Xu和T的(高斯)后验分布的平均值。
说话人验证涉及计算目标和测试i向量之间的(
)分数。余弦分数:
概率线性判别分析(PLDA)–解释说话人变异性和声道变异性的概率模型。 可用于计算对数似然比,因此
其中H1是测试说话者和目标说话者相同的假设,H0是他们不同的假设
当前最新的神经网络方法使用NN提取嵌入,然后由PLDA对其评分。
d-vector(Variani等,2014)。
开发–训练一个DNN以识别说话者。
注册–从最后一个隐藏层中提取说话者特定的功能。
dvector–整个发声(pooling)帧中特定于说话者的平均特征。
x-vector(Snyder等,2018)。
与d-vector相似,提取语音水平特征作为嵌入。
用帧级输入和话语级输出训练TDNN。
体系结构包括一个“stats pooling”层,该层可计算最高帧级隐藏层的发声的平均值和sd。
d-vector
x-vector
下一篇: SVAR
推荐阅读
-
实现大顶堆的原理及Python实现
-
学习Python图像处理的必备技能:傅里叶变换原理及实现详解
-
基于基本原理与3D传感器基本参数的3D视觉基础讲解
-
无人车系统11:轨迹跟踪的MPC原理与Python实现 - 只需40行代码!
-
在Python里,理解基础if语句:if, else, elif, and, or及if嵌套的实际操作 - &重点讲解and关键字的运用
-
简单讲解:素数查找算法(基础方法+埃氏筛+欧拉筛)-之三:欧拉筛的实现
-
详细讲解C语言中实现基础数值转盘换算功能的示例代码
-
【2022新手指南】Java编程进阶之路 - 六、技术架构篇 ### MySQL索引底层解析与优化实战 - 你会讲解MySQL索引的数据结构吗?性能调优技巧知多少? - Redis深度揭秘:你知道多少?从基础到哨兵、主从复制全梳理 - Redis持久化及哨兵模式详解,还有集群搭建和Leader选举黑箱打开 - Zookeeper是个啥?特性和应用场景大公开 - ZooKeeper集群搭建攻略及 Leader选举、读写一致性、共享锁实现细节 - 探究ZooKeeper中的Leader选举机制及其在分布式环境中的作用 - Zab协议深入剖析:原理、功能与在Zookeeper中的核心地位 - RabbitMQ全方位解读:工作模式、消费限流、可靠投递与配置策略 - 设计者视角:RabbitMQ过期时间、死信队列与延时队列实践指南 - RocketMQ特性和应用场景揭示:理解其精髓与差异化优势 - Kafka详细介绍:特性及广泛应用于实时数据处理的场景解析 - ElasticSearch实力揭秘:特性概述与作为搜索引擎的广泛应用 - MongoDB认知升级:非关系型数据库的优势阐述,安装与使用实战教学 - BIO/NIO/AIO网络模型对比:掌握它们的区别与在网络编程中的实际应用 - Netty带你飞:理解其超快速度背后的秘密,包括线程模型分析 - 网络通信黑科技:Netty编解码原理与常用编解码器的应用,Protostuff实战演示 - 解密Netty粘包与拆包现象,怎样有效应对这一常见问题 - 自定义Netty心跳检测机制,轻松调整检测间隔时间的艺术 - Dubbo轻骑兵介绍:核心特性概览,服务降级实战与其实现益处 - Dubbo三大神器解读:本地存根与本地伪装的实战运用与优势呈现 ----------------------- 七、结语与回顾
-
深度学习基础讲解:(1) 前向传播详解及配套Python实现 - 构建神经网络实例
-
Python实现的声纹识别基础原理讲解